gpt4 book ai didi

c++ - glreadpixels 模板缓冲区总是抛出 GL_INVALID_OPERATION

转载 作者:太空狗 更新时间:2023-10-29 20:42:19 26 4
gpt4 key购买 nike

我正在尝试找出模板。现在我只是用模板值绘制一些框,然后读取值。每次我用 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会给你答案(默认帧缓冲区绑定(bind))。

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

也可以将深度和模板缓冲区与 GL_DEPTH_STENCIL 混合使用,为此您可以使用 GL_UNSIGNED_INT_24_8。我不知道默认帧缓冲区的格式是什么,或者这是否适用于您的情况。如果您使用的是诸如 glut、SDL 或 glfw 之类的库,那么它负责设置它,您应该在何处寻找配置默认帧缓冲区的地方。

关于c++ - glreadpixels 模板缓冲区总是抛出 GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19087405/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com