• Hallo Gast, du kaufst gerne günstig ein und erfährst oft vor deinen Freunden von interessanten Angeboten? Dann kannst du dein Talent als Schnäppchenjäger jetzt zu Geld machen und anderen PCGH-Lesern beim Sparen helfen! Schau einfach mal rein - beim Test der Community Deals!

Problem mit OpenGL, flackerndes Objekt

Jy-Falc00n

PCGHX-HWbot-Member (m/w)
Hallo!

Ich habe ein Problem zu folgendem selbst geschriebenden Code :

Code:
#include <iostream>
#include <stdlib.h>
#include <GL/glut.h>
#include <math.h>

using namespace std;
GLdouble ox=0.0,oy=0.0,oz= 0.0;
int CursorX;
int CursorY;
float Xdevi;
float Ydevi;

float enemy[2];

void WinPosTo3DPos(int x, int y)
{
  GLint viewport[4];
  GLdouble modelview[16],projection[16];
  GLfloat wx=x,wy,wz;
  glGetIntegerv(GL_VIEWPORT,viewport);
  y=viewport[3]-y;
  wy=y;
  glGetDoublev(GL_MODELVIEW_MATRIX,modelview);
  glGetDoublev(GL_PROJECTION_MATRIX,projection);
  glReadPixels(x,y,1,1,GL_DEPTH_COMPONENT,GL_FLOAT,&wz);
  gluUnProject(wx,wy,wz,modelview,projection,viewport,&ox,&oy,&oz);
}

void PosByAngle(float angle, float x, float y, float lenght)

{
    Xdevi = (sin(angle) * lenght) + x;
    Ydevi = (cos(angle) * lenght) + y; 
}


void initRender(int w, int h) 
{

    glEnable(GL_DEPTH_TEST);
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity(); 
    gluPerspective(45.0,                  
                   (double)w / (double)h, 
                   1.0,
                   200.0);
    WinPosTo3DPos(400,300);

}

void Render()
{
    glDepthMask(true);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity(); 

        glColor3f(0.8f,0.8f,0.6f);
        glBegin(GL_TRIANGLE_STRIP);

            glVertex3d(-50.0f,50.0f,-51.0f);
            glVertex3d(-50.0f,-50.0f,-51.0f);
            glVertex3d(50.0f,50.0f,-51.0f);
            glVertex3d(50.0f,-50.0f,-51.0f);

        glEnd();

    

    glTranslatef(enemy[1],enemy[2],-50.0f); //Problem
    glColor3f(1.0f,0.0f,0.0f); //Problem
    glutSolidSphere(1,8,8); //Problem
    
    glLoadIdentity(); 
    
    glDepthMask(false);
    glColor3f(0.0f,1.0f,0.0f);
    

    WinPosTo3DPos(CursorX,CursorY);
    glTranslatef(ox,oy,oz);
    glutSolidSphere(1,16,16);
    glLoadIdentity(); 

    glutSwapBuffers();
}



void MouseMang(int button, int state, int x, int y) // Mouse handle function
{
    WinPosTo3DPos(x,y);
    cout << "Done!";
}

void MouseMang_Move(int x, int y)
{
    CursorX = x;
    CursorY = y;


}
void Game(int vaule)
{
    glutPostRedisplay();
    glutTimerFunc(25, Game,0);
}
int main(int argc, char** argv)
{
    enemy[1] = 0.0f;
    enemy[2] = 0.0f;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 600);
    glutCreateWindow("wdwdqa");
    initRender(800,600);
    glutPassiveMotionFunc(MouseMang_Move);
    glutMouseFunc(MouseMang);
    glutDisplayFunc(Render);
    glutTimerFunc(25, Game,0);
    glutMainLoop();

    return 0;

}
Das problem ist der rote Ball, er ist ständig am flackern und ich weiss nicht warum. Ich kann OpenGl erst seit ein paar Tagen, und finde denn Fehler deshalb wohl nicht.:(

Ich hoffe ihr könnt mir helfen!

Jy-Falc00n
 

DarkMo

Lötkolbengott/-göttin
das problem wird sein, das du keinen doppelten buffer verwendest (wenn das so hieß, die vorlesung is a weng her ><).

das konzept is aber einfach erklärt:
deine graka baut ein bild auf. während sie dies tut, vergeht zeit und das ganze wird in nen zwischenbuffer geschrieben. wenn das bild im buffer vollständig berechnet is, kann es ausgegeben werden.

nun wird beim bearbeiten aber der bildschirm schwarz. sprich, in der zeit, in der die graka das bild berechnet, wirds schwarz - was sich in nem flimmern äussert. die lösung sind 2 solcher zwischenbuffer. in einen wird das neue bild, was grad berechnet wird geschrieben, im anderen ist das letzte berechnete drin, was ausgegeben werden kann. nun gibts den befehl switchbuffers(); (berichtigt mich, wenns falsch geschrieben is), der immer zw diesen beiden puffern wechselt (switcht halt ^^). somit hat sich dann das problem mit dem flimmern erledigt, da ein bild zur ausgabe bereit steht, wärend das nächste noch berechnet wird.

am besten für genaueren code mal gogglen. mit dem switchbuffers und opengl als suchworte kommt da sicher was bei raus :)

edit: glutSwapBuffers(); haste schon mit drin an der scheinbar richtigen stelle *hm* vllt fehlt die buffer angabe/zuweisung.
 
TE
J

Jy-Falc00n

PCGHX-HWbot-Member (m/w)
Ich glaube du hast dir denn Quellcode nicht genau genug angeschaut.;) Wenn es probleme mit dem Buffern gegeben hätte, würde doch auch der "Hintergrund" also der Triangle_Strip dort Flackern. Ich habe das verhalten des Flackerns mal genau betrachtet. Es tritt scheinbar ganz zufällig auf, je nach dem wo der Mauszeiger sich befindet.
 
Oben Unten