OpenGL Objektsortierung

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

OpenGL Objektsortierung

Beitrag von Scotty »

Ich zeichne n*m*k Würfel in drei Dimensionen. Die meisten sollen transparent, einige aber mit Texture versehen und undurchsichtig sein. Nun habe ich das Problem, dass die später gezeichneten Objekte die vorderen überdecken. Kann ich das verhindern ohne aufwändig zu sortieren? An Parametern fürs Blending und Culling habe ich schon erfolglos gedreht.

OnPaint:

Code: Alles auswählen

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(45.0,width/height,0.1,100.0);
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity;
glTranslatef(0.0, 0.0, Distance);
glRotatef(RotationX,1.0,0.0,0.0);
glRotatef(RotationY,0.0,1.0,0.0);
glRotatef(RotationZ,0.0,0.0,1.0);
PaintCubes; //sub routine
SwapBuffers;


PaintCubes:

Code: Alles auswählen

for x:=0 to FBoardSize-1 do
 for y:=0 to FBoardSize-1 do
  for z:=0 to FBoardSize-1 do
begin
  glPushMatrix;
  glEnable(GL_BLEND);
  glDisable(GL_TEXTURE_2D);
  glTranslatef(x-fb2,y-fb2,z-fb2);
  glColor4f(r,g,b,a);
  if IsLetter then
  begin
    glDisable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
    glTexImage2D(GL_TEXTURE_2D,0,3,...,GL_RGB,GL_UNSIGNED_BYTE,Texture);
  end;
  glCallList(Cube);
  glPopMatrix;
 end;


Cube:

Code: Alles auswählen

Cube:=glGenLists(1);
   glNewList(Cube, GL_COMPILE);
      glBegin(GL_QUADS);
        {Front Face}
        glNormal3f( 0.0, 0.0, 1.0);
        glTexCoord2f( 1.0, 0.0);     glVertex3f( 0.5, 0.5, 0.5);
        glTexCoord2f( 0.0, 0.0);     glVertex3f(-0.5, 0.5, 0.5);
        glTexCoord2f( 0.0, 1.0);     glVertex3f(-0.5,-0.5, 0.5);
        glTexCoord2f( 1.0, 1.0);     glVertex3f( 0.5,-0.5, 0.5);
        {Back Face}
        glNormal3f( 0.0, 0.0,-1.0);
        glTexCoord2f( 0.0, 0.0);     glVertex3f( 0.5, 0.5,-0.5);
        glTexCoord2f( 0.0, 1.0);     glVertex3f( 0.5,-0.5,-0.5);
        glTexCoord2f( 1.0, 1.0);     glVertex3f(-0.5,-0.5,-0.5);
        glTexCoord2f( 1.0, 0.0);     glVertex3f(-0.5, 0.5,-0.5);
...
      glEnd;
    glEndList;


Richtig/Falsch:
BildBild

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL Objektsortierung

Beitrag von carli »

Code: Alles auswählen

glenable(GL_DEPTH_TEST);


Und der Tiefentest hat nix mit Sortierung zu tun, er prüft bloß, welche Pixel gezeichnet werden müssen und welche nicht.

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL Objektsortierung

Beitrag von Scotty »

GL_DEPTH_TEST ist natürlich schon an.
Init:

Code: Alles auswählen

glClearDepth(1.0);
 glEnable(GL_DEPTH_TEST);          // enables depth testing
 glDepthFunc(GL_ALWAYS);         // the type of depth test to do
 glShadeModel(GL_SMOOTH);          // enables smooth color shading
 glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
 glEnable(GL_BLEND);
 glHint(GL_LINE_SMOOTH_HINT,GL_FASTEST);
 glHint(GL_POLYGON_SMOOTH_HINT,GL_FASTEST);
 glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_FASTEST);
 glGenTextures(1, @Texture);
 glBindTexture(GL_TEXTURE_2D, Texture);
 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
 glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: OpenGL Objektsortierung

Beitrag von carli »

Code: Alles auswählen

glDepthFunc(GL_ALWAYS);         // the type of depth test to do


Du deaktivierst damit ja die Tiefensortierung wieder.

Nimm GL_LESS, aber kein GL_ALWAYS (falls es dann immer noch falsch ist, war's GL_GREATER)

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: OpenGL Objektsortierung

Beitrag von Scotty »

Hab ich alles ausprobiert, im Moment steht es auf GL_NOTEQUAL. Ein Objekt verdeckt immer ein anderes. Ich versuche gerade aus den 16 Matrizenwerten von GL_MODELVIEW_MATRIX den Abstand zu berechnen...

PS: Carli, du hast recht! Wenn alles richtig gesetzt wird (Blending und Tiefenbuffer), klappt es auch. Danke! :mrgreen:

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

Re: OpenGL Objektsortierung

Beitrag von corpsman »

Wenn du Semi Transparente Objekte hast, kommst du um ein Tiefen sortieren nicht herum. Denn nur Richtig sortiert gerendert ( von hinten nach vorne ) kannst du auch richtig Blenden.

Den Tiefen Abstand müsstest du relativ leicht bekommen wenn du dir die Modelview und Projektionview Matrix geben läst. Danach mit (x,y,z,1) multiplizieren, und du müsstest in Normierten Koordinaten den Abstand deiner Objekte zur Kamera bekommen, oder so.. Wenn es so nicht geht schau ich noch mal in meiner DA nach.
--
Just try it

Antworten