4

ステンシルについて調べてみました。現在、ステンシル値でいくつかのボックスを描画し、値を読み取っています。GL_STENCIL_INDEX で glReadPixels を呼び出すたびに、GL_INVALID_OPERATION が返されます。問題のコードは次のとおりです。

glPixelStorei(GL_PACK_ALIGNMENT, 1);
GLfloat tempStencilVal = 3;
glGetError();
glReadPixels(10, g_window1Height-10, 1, 1, GL_STENCIL_INDEX, GL_FLOAT, &tempStencilVal);
if (glGetError() == GL_INVALID_OPERATION) {std::cout << "GL Invalid Operation\n";}
else {std::cout << "X: " << 10 << " Y: " << 10 << " S: " << tempStencilVal << "\n";}

5 つの異なるデータ形式、3 つの異なる glPixelStore モードを試し、glReadPixel エラーのリストを7 回確認しました。(はい、OGL 2.1) STENCIL_INDEX を DEPTH_COMPONENT に変更すると、正常に動作します。確認できないのは、ステンシル バッファーがあるかどうかだけです。不足している初期化や、それを確認するための glGet はありますか?

関連する可能性のある情報: Win7 x64 SP1 | ASUS GTX650Ti | VS2012 アルティメット

原因となっている場合に備えて、ボックスを描画する関数のコードを次に示します。

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, g_window1Width, -g_window1Height, 0, 0.0, 50.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glScaled(1.0, -1.0, -1.0);
glTranslated(0.0, 0.0, 0.5);

glClearColor(0.0, 0.0, 0.0, 0.0);
glClearStencil(0);

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);

glDisable(GL_DEPTH_TEST);
glEnable(GL_STENCIL_TEST);
glStencilOp( GL_REPLACE, GL_REPLACE, GL_REPLACE );

glColor3ub(0, 100, 250);

glStencilFunc(GL_ALWAYS, 1, 1);
glBegin(GL_QUADS);
glVertex3d(0, 0, 0);
glVertex3d(0, 50, 0);
glVertex3d(50, 50, 0);
glVertex3d(50, 0, 0);
glEnd();

glStencilFunc(GL_ALWAYS, 1, 1);
glBegin(GL_QUADS);
glVertex3d(g_window1Width-50, 0, 0);
glVertex3d(g_window1Width, 0, 0);
glVertex3d(g_window1Width, 50, 0);
glVertex3d(g_window1Width-50, 50, 0);
glEnd();

OGL が明らかな理由もなく間違ったことをしたのはこれが初めてではありませんが、これはインターフェースをコーディングするという私の計画を破ります。

4

1 に答える 1

5

glStencilFunc(GL_NOTEQUAL, 1, 1);ステンシル バッファーがあるかどうかを確認するには、ステンシル テストを有効にして、または有効にせずに別のクワッドを描画するなど、値を使用して何かを試すことができます。

で言うように、使用されている実際のフォーマットを見つけるには、答えが得られるglGet...ように見えます(デフォルトのフレームバッファがバインドされています)。glGetFramebufferAttachmentParameter

ステンシル バッファは 8 ビットなので (他にはないと思います)、フォーマットをGL_UNSIGNED_BYTE.

深度バッファとステンシル バッファを と混在させることもできます。GL_DEPTH_STENCILこれには を使用できますGL_UNSIGNED_INT_24_8。デフォルトのフレームバッファのフォーマットや、これがあなたのケースで機能するかどうかはわかりません。glut、SDL、glfw などのライブラリを使用している場合は、これを設定する責任があり、デフォルトのフレームバッファの設定を探す必要があります。

于 2013-09-30T07:17:43.720 に答える