我正在尝试找出模版。现在,我只是在绘制一些带有模板值的盒子,然后读取该值。每次我使用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模式,并且遍历了glReadPixels错误列表7次。(是的,OGL 2.1)如果我将STENCIL_INDEX更改为DEPTH_COMPONENT,则可以正常工作。我唯一不能确认的是我是否有模板缓冲区。是否缺少一些初始化或glGet检查?
可能的相关信息:Win7 x64 SP1 | 华硕GTX650Ti | VS2012 Ultimate
这是绘制框的函数的代码,以防引起它:
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);
启用和不启用模板测试的情况下绘制另一个四边形。
要找到所使用的实际格式,就像用a所说的glGet...
那样,glGetFramebufferAttachmentParameter
它将为您提供答案(带有默认的帧缓冲区)。
模板缓冲区为8位(我认为它不能是其他任何东西),因此可以将格式更改为GL_UNSIGNED_BYTE
。
您也可以将深度和模板缓冲区与混合GL_DEPTH_STENCIL
使用GL_UNSIGNED_INT_24_8
。我没有默认帧缓冲的格式,或者这是否适合您的情况。如果您使用的是glut,SDL或glfw之类的库,则负责进行设置以及应在何处查找配置默认帧缓冲区。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句