其他分享
首页 > 其他分享> > c – glreadpixels模板缓冲区始终抛出GL_INVALID_OPERATION

c – glreadpixels模板缓冲区始终抛出GL_INVALID_OPERATION

作者:互联网

我正在试图找出模板.现在我只是用模板值绘制一些框,然后读取值.每次我用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模式,并且已经超过list of glReadPixels Errors次7次. (是的,OGL 2.1)如果我将STENCIL_INDEX更改为DEPTH_COMPONENT,它可以正常工作.我唯一无法确认的是我是否有模板缓冲区.是否有一些初始化我缺少或一些glGet来检查?

潜在的相关信息:Win7 x64 SP1 |华硕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因为没有明显原因做错了事,但这打破了我对接口进行编码的计划.

解决方法:

要检查是否有模板缓冲区,可以尝试使用某些值,例如使用glStencilFunc(GL_NOTEQUAL,1,1)绘制另一个四边形;是否启用模板测试.

要查找使用的实际格式,正如您所说的glGet …,它看起来像glGetFramebufferAttachmentParameter会给你答案(默认的帧缓冲区绑定).

模板缓冲区是8位(我不认为它可以是其他任何东西)所以可能将格式更改为GL_UNSIGNED_BYTE.

也可以将深度和模板缓冲区与GL_DEPTH_STENCIL混合使用,您可以使用GL_UNSIGNED_INT_24_8.我没有默认帧缓冲区的格式,或者在你的情况下是否有效.如果您正在使用诸如glut,SDL或glfw之类的库,那么它负责设置它以及您应该在哪里寻找配置默认帧缓冲区.

标签:c,opengl,stencil-buffer,glreadpixels
来源: https://codeday.me/bug/20190831/1776052.html