繁体   English   中英

在glkit上运行OpenGL模板缓冲区剪切

[英]Getting OpenGL stencil buffer clipping working on glkit

我试图在GLKViewController中重现此模板缓冲区教程中的效果,在该教程中,使用模板进行剪切。

在我的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设置的方法,在程序开始时调用一次。 正如对此stackoverflow问题的答案所建议的,这包括:

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);

运行此命令只会导致包含灰色透明色的屏幕。 似乎所有内容都已被模板化(或未绘制到屏幕上)。

解:

i)我将初始化更改为:

GLuint depthStencilRenderbuffer;
glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthStencilRenderbuffer);
glRenderbufferStorageOES(GL_RENDERBUFFER_OES,
                         GL_DEPTH24_STENCIL8_OES,
                         self.view.bounds.size.width,
                         self.view.bounds.size.height);

我不确定有什么区别,但这似乎可行。

ii)在设置中,我使用:

GLKView *view = (GLKView *)self.view;
view.context = self.context;
view.drawableDepthFormat = GLKViewDrawableDepthFormat24;
view.drawableStencilFormat = GLKViewDrawableStencilFormat8;

感谢@rickster的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM