4

Khronos OpenGL 2.1 Specs では、glStencilMask が glClear の動作に影響を与えるはずであると書かれていますが、私のマシンではそうではないようです。

私が現在得ている出力は次のとおりです。

Stencil value: (0,0) 0xff

私が期待する出力は次のとおりです。

Stencil value: (0,0) 0xf0

これが私のコードです:

void renderScene(void) {
    unsigned char pix;
    int i [4];

    /* Clear the stencil buffer initially */
    glClearStencil(0x0);
    glClear(GL_STENCIL_BUFFER_BIT);

    /* Applies the following: 1111 0000 & 1111 1111 */
    glStencilMask(0xF0);
    glClearStencil(0xFF);

    glClear(GL_STENCIL_BUFFER_BIT);

    glFlush();

    glReadPixels(0,0,1,1,GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, &pix);
    printf("Stencil value (0,0): %x\n",pix);
}   

int main(int argc, char **argv) {
    // init GLUT and create Window
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_STENCIL );
    glutInitWindowPosition(500,500);
    glutInitWindowSize(320, 320);
    glutCreateWindow("Trial");

    // register callbacks
    glutDisplayFunc(renderScene);

    // enter GLUT event processing cycle
    glutMainLoop();

    return 1;
}

(もちろん他にもいろいろな描画などを行っていましたが、これは私が見た問題を示しています)

4

1 に答える 1

4

glReadPixels() のドキュメントから

GL_STENCIL_INDEX 

Stencil values are read from the stencil buffer.
Each index is converted to fixed point, shifted left or right
depending on the value and sign of GL_INDEX_SHIFT,
and added to GL_INDEX_OFFSET. If GL_MAP_STENCIL is GL_TRUE,
indices are replaced by their mappings in the table GL_PIXEL_MAP_S_TO_S.

呼び出して、GL_INDEX_SHIFT と GL_INDEX_OFFSET が両方ともゼロであることを確認したい場合があります。

glPixelTransferi(GL_INDEX_SHIFT,  0);
glPixelTransferi(GL_INDEX_OFFSET, 0);

値を正しく書き込んでいる可能性がありますが、glReadPixels は出力をスクランブルします。また、1 バイト以上を読み取ってみてください。

unsigned char pix4[4];
glReadPixels(0,0,1,1,GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, pix4);

for(int i = 0 ; i < 4 ; i ++) printf("Stencil value (0,0,%d): %x\n", i, pix4[i]);
于 2012-07-25T17:11:52.513 に答える