我试图通过应用模板缓冲区在GL_POINTS中使用OpenGL ES 2.0绘制纹理。模板缓冲区应来自纹理。我将结果渲染到另一个纹理,然后将纹理呈现到屏幕。这是我渲染为纹理的代码:
//Initialize buffers, initialize texture, bind frameBuffer
.....
glClearStencil(0);
glClear (GL_STENCIL_BUFFER_BIT);
glColorMask( GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE );
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glBindTexture(GL_TEXTURE_2D, stencil);
glUseProgram(program[PROGRAM_POINT].id);
glDrawArrays(GL_POINTS, 0, (int)vertexCount);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glStencilFunc(GL_NEVER, 0, 1);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP);
glBindTexture(GL_TEXTURE_2D, texture);
glUseProgram(program[PROGRAM_POINT].id);
glDrawArrays(GL_POINTS, 0, (int)vertexCount);
glDisable(GL_STENCIL_TEST);
....
//Render texture to screen
我得到的结果只是在没有任何模板遮罩的情况下绘制了我的纹理。我对此问题有几个疑问:
这是我要寻找的结果:
更新:
如所选答案所指出的,我的问题主要是我没有将模板附加到FBO的模板附件上:
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, stencilBufferId);
我不知道渲染到纹理时是否需要它。其次,我没有使用适当的模板测试。
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
做好了
按顺序解决您的问题:
- 可以将模板缓冲区与GL_POINTS一起使用吗?
是的。模板测试适用于所有片段,无论呈示的原始类型如何。在不应用模板测试的情况下写入帧缓冲区的唯一情况是使用glClear()
。
- 渲染到纹理时可以使用模板缓冲区吗?
是的。但是,当使用FBO渲染纹理时,将不使用默认帧缓冲区的模具缓冲区。您必须创建一个模板渲染缓冲区,并将其附加到FBO的模板附件:
GLuint stencilBufferId = 0;
glGenRenderbuffers(1, &stencilBufferId);
glBindRenderbuffer(GL_RENDERBUFFER, stencilBufferId);
glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, width, height);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, stencilBufferId);
- 模具纹理是否必须具有任何特殊属性(纯色,内部格式等)?
OpenGL ES 2.0没有模板纹理。您必须使用renderbuffer作为模板附件,如上面的代码片段所示。GL_STENCIL_INDEX8
是渲染缓冲区支持的唯一可用作模板附件的格式。ES 3.0支持深度/模板纹理。
- 我的代码有明显的错误吗?
可能是。看起来有些奇怪的一件事是,您从未真正在所显示的代码中应用模板测试。确实启用模板测试时,仅将GL_ALWAYS
和GL_NEVER
用于模板功能。顾名思义,这些功能始终或永远不会通过模板测试。因此,不要让片段通过/失败取决于模板值。在第二次抽奖之前,我会期望这样的事情:
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
这只会渲染当前模板缓冲区值为1的片段,该片段与您在上一个绘制调用中渲染的片段相对应。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句