Проблема глубины OpenGL - PullRequest
4 голосов
/ 17 июня 2011

У меня проблема с глубиной рендеринга в OpenGL

Следующий код - простой пример кода, в котором возникает проблема.Это делает 2 трапеции в одном месте, и один из них вращается.Но вращающийся всегда отображается сверху, хотя при вращении он должен идти за первой трапецией.

Я думаю, что-то напутал с инициализацией OpenGL.Также во время поиска в stackoverflow я нашел сообщение, в котором кто-то предложил выполнить следующий код и посмотреть вывод.

int depth;
glGetIntegerv(GL_DEPTH_BITS, &depth);
printf("%i bits depth", depth);

хорошо, результат - глубина 0 бит, что не очень хорошо, я думаю: (

Я занимаюсь разработкой на Mac, в xCode с библиотекой glfw

#include <GL/glfw.h>
#include <stdlib.h>

int main( void )
{
   int running = GL_TRUE;

   if( !glfwInit() )
   {
      exit( EXIT_FAILURE );
   }

   // Open an OpenGL window
   if( !glfwOpenWindow( 640,480, 0,0,0,0,0,0, GLFW_WINDOW ))
   {
      glfwTerminate();
      exit( EXIT_FAILURE );
   }

   glEnable(GL_DEPTH_TEST);

   float angle = 0;

   // Main loop
   while( running )
   {

      double elapsedTime = glfwGetTime();
      glfwSetTime(0);
      angle += 90 * elapsedTime;

      // OpenGL rendering goes here...
      glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

      glMatrixMode(GL_MODELVIEW);
      glLoadIdentity();

      glPushMatrix(); //Save the transformations performed thus far
      glColor3f(1.0f, 1.0, 0.0);
      glTranslatef(0.0f, 0.0f, 0.0f); //Move to the center of the trapezoid
      //glRotatef(angle, 0.0f, 1.0f, 0.0f); //Rotate about the y-axis
      glBegin(GL_QUADS);

      //Trapezoid
      glVertex3f(-0.7f, -0.5f, 0.0f);
      glVertex3f(0.7f, -0.5f, 0.0f);
      glVertex3f(0.4f, 0.5f, 0.0f);
      glVertex3f(-0.4f, 0.5f, 0.0f);

      glEnd();

      glPopMatrix();

      glPushMatrix(); //Save the transformations performed thus far
      glColor3f(1.0f, 0.0, 0.0);
      glTranslatef(0.0f, 0.0f, 0.0f); //Move to the center of the trapezoid
      glRotatef(angle, 0.0f, 1.0f, 0.0f); //Rotate about the y-axis
      glBegin(GL_QUADS);

      //Trapezoid
      glVertex3f(-0.7f, -0.5f, 0.0f);
      glVertex3f(0.7f, -0.5f, 0.0f);
      glVertex3f(0.4f, 0.5f, 0.0f);
      glVertex3f(-0.4f, 0.5f, 0.0f);

      glEnd();

      glPopMatrix(); //Undo the move to the center of the trapezoid

      glfwSwapBuffers();

      // Check if ESC key was pressed or window was closed
      running = !glfwGetKey( GLFW_KEY_ESC ) &&
      glfwGetWindowParam( GLFW_OPENED );
   }

   // Close window and terminate GLFW
   glfwTerminate();
   // Exit program
   exit( EXIT_SUCCESS );
}

Ответы [ 3 ]

5 голосов
/ 17 июня 2011

if (! GlfwOpenWindow (640,480, 0,0,0,0,0,0, GLFW_WINDOW))

Почему вы пропускаете все эти нули?Эти параметры очень важны.Справочная документация GLFW (pdf) показывает, что эти параметры описывают, сколько бит вам нужно для цветов, глубины и трафарета.Следующий за последним ноль - это количество битов глубины.Вы запросили 0 бит глубины для кадрового буфера, вот что вы получили.

Вы не можете винить API в том, что вы делаете то, что вы просили;)

Более разумной командой будет:

if( !glfwOpenWindow( 640,480, 8, 8, 8, 8, 24, 8, GLFW_WINDOW ))

Это дает вам 8 бит каждый для RGBA, 24 для глубины и 8 бит трафарета.

2 голосов
/ 17 июня 2011

Если вы рисуете многоугольники друг над другом, вы не гарантируете, что порядок, в котором вы их рисуете, будет порядком их визуализации. Он может работать в одном направлении на одном драйвере, а на другом - другим. То же самое с драйверами разных производителей.

Вы должны либо добавить крошечную разницу глубины в ваших командах glVertex, либо поиграть с glPolygonOffset (). Или выполните glFlush () после первого многоугольника, что крайне неэффективно.

Используя буфер глубины, вы сообщаете графической карте, что она может отображать треугольники в любом порядке, который выберет, потому что буфер глубины будет сортировать то, что нарисовано впереди. Вот почему в некоторых играх полигоны мерцают друг на друге (особенно на расстоянии), когда они отображаются на одно и то же значение глубины.

0 голосов
/ 26 марта 2015

glGetIntegerv (GL_DEPTH_BITS, ..) устарела в OpenGL 3

используйте вместо:

int GetDepthBits()
{
  HDC hdc = wglGetCurrentDC();
  int iPixelFormat = GetPixelFormat( hdc);
  int iAttr[] = {WGL_DEPTH_BITS_ARB};
  int iDepthBits;
  wglGetPixelFormatAttribivARB( hdc, iPixelFormat, 0, 1, iAttr, & iDepthBits);
  return iDepthBits;
}
...