4

OpenGLでのレンダリング深度に問題があります

次のコードは、問題が発生するコードの簡単な例です。同じ場所に2つの台形をレンダリングし、そのうちの1つを回転させます。ただし、回転している間は最初の台形の後ろにあるはずですが、回転しているものは常に上に表示されます。

私はOpenGLを初期化することで何かを台無しにしたと思います。また、stackoverflowを検索しているときに、誰かが次のコードを実行して出力を確認することを提案した投稿を見つけました。

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

さて、出力は0ビットの深さですが、これは良くないと思います:(

私はMacで、glfwライブラリを使用したxCodeで開発しています

#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 );
}
4

3 に答える 3

5

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

なぜこれらすべてのゼロを渡すのですか? これらのパラメータは重要です。GLFW リファレンス ドキュメント (pdf)は、これらのパラメーターが、色、深度、およびステンシルに必要なビット数を記述していることを示しています。最後から 2 番目のゼロは、深度ビットの数です。フレームバッファに 0 ビットの深さを要求したので、それが得られました。

あなたが要求したことを API のせいにすることはできません ;)

より合理的なコマンドは次のとおりです。

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

これにより、RGBA にそれぞれ 8 ビット、深度に 24 ビット、ステンシルに 8 ビットが提供されます。

于 2011-06-16T22:55:16.513 に答える
2

ポリゴンを互いに重ねて描画している場合、それらを描画する順序がレンダリングされる順序になるとは限りません。あるドライバーではある方法で、次のドライバーでは別の方法で機能する場合があります。さまざまなベンダーのドライバーと同じです。

glVertexコマンドにわずかな深さの違いを追加するか、glPolygonOffset()で遊ぶ必要があります。または、最初のポリゴンの後にglFlush()を実行します。これは、非常に非効率的です。

デプスバッファを使用すると、デプスバッファが前面に描画されたものを分類するため、選択した順序で三角形をレンダリングできることをグラフィックカードに伝えます。これが、一部のゲームで、ポリゴンが同じ深度値にマップされたときに、ポリゴンが互いに(特に遠くにあるもの)ちらつくのを見る理由です。

于 2011-06-17T01:37:41.500 に答える
0

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;
}
于 2015-03-26T07:24:41.903 に答える