【发布时间】:2014-05-04 20:05:53
【问题描述】:
我试图在 GLKViewController 中重现 this stencil buffer tutorial here 中的效果,其中模板用于剪辑。
在我的 drawinrect 方法中,我有:
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect {
[self.effect prepareToDraw];
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, Position));
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const GLvoid *) offsetof(Vertex, TexCoord));
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
glClearColor(0.5, 0.5, 0.5, 1.0);
glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glEnable(GL_STENCIL_TEST);
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
glDepthMask(GL_FALSE);
glStencilFunc(GL_NEVER, 1, 0xFF);
glStencilOp(GL_REPLACE, GL_KEEP, GL_KEEP); // draw 1s on test fail (always)
// draw stencil pattern
glStencilMask(0xFF);
glClear(GL_STENCIL_BUFFER_BIT); // needs mask=0xFF
glDrawElements(GL_TRIANGLES, 1*6, GL_UNSIGNED_SHORT, 0);
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glDepthMask(GL_TRUE);
glStencilMask(0x00);
// draw only where stencil's value is 1
glStencilFunc(GL_EQUAL, 1, 0xFF);
glDrawElements(GL_TRIANGLES, nLiveSquares*6, GL_UNSIGNED_SHORT, 0);
glDisable(GL_STENCIL_TEST);
}
顶点缓冲区包含正方形的信息,其中包含纹理。
我想要获得的效果是让第一个正方形用于定义模板形状,然后当我绘制场景时,位于第一个正方形之外的任何内容都会被剪裁。因此,我使用了两次 drawElements - 第一次绘制裁剪正方形,然后绘制所有正方形。
我还有另一种用于 OpenGL 设置的方法,在程序开始时调用一次。正如对this stackoverflow question 的回答所建议的那样,这包括:
GLuint depthStencilRenderbuffer;
glGenRenderbuffers(1, &depthStencilRenderbuffer);
glBindRenderbuffer(GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_RENDERBUFFER, depthStencilRenderbuffer);
运行此程序只会显示包含灰色透明颜色的屏幕。似乎所有内容都已被印出(或未绘制到屏幕上)。
【问题讨论】:
-
您是否将您的
GLKView的drawableStencilFormat设置为合适的值? -
我不得不问:为什么要连续两次清除深度缓冲区?
glClear ( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);后跟glClear (GL_DEPTH_BUFFER_BIT)。 -
这是我的错误。好眼力。谢谢。
标签: ios opengl-es-2.0 glkit