# Problem mit OpenGL, flackerndes Objekt



## Jy-Falc00n (8. November 2009)

Hallo! 

Ich habe ein Problem zu folgendem selbst geschriebenden 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 (8. November 2009)

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.


----------



## Jy-Falc00n (9. November 2009)

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.


----------

