我正在尝试通过应用模板缓冲区使用 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
我得到的结果只是我的纹理被绘制而没有从模板上应用任何遮罩。关于这个问题我有几个问题:
- 是否可以使用带有 GL_POINTS 的模板缓冲区?
- 渲染到纹理时是否可以使用模板缓冲区?
- 模板纹理是否必须具有任何特殊属性(纯色、内部格式...等)?
- 我的代码有任何明显的错误吗?
这是我正在寻找的结果:
更新:
正如所选答案所指出的,我的问题主要是我没有将模板附加到 FBO 的模板附件上:
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT,
GL_RENDERBUFFER, stencilBufferId);
我不知道渲染到纹理时需要它。其次,我没有使用正确的模板测试。
glStencilFunc(GL_EQUAL, 1, 1);
glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);
做了工作。