如何在模板,OpenGL ES 3.0中使用深度纹理 [英] How to use depth texture with stencil, OpenGL ES 3.0

查看:550
本文介绍了如何在模板,OpenGL ES 3.0中使用深度纹理的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序,我想使用模板遮罩将深度渲染到纹理.我尝试GL_DEPTH_STENCIL_OES:

I have an application where I want to render depth to a texture using stencil mask. I try GL_DEPTH_STENCIL_OES:

创建纹理:

glGenFramebuffers(1, fbo);
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);

glGenTextures(1, depthTexture);
glBindTexture(GL_TEXTURE_2D, *depthTexture);
// using combined format: depth + stencil
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);

// attaching both depth and stencil
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0);

// No color output in the bound framebuffer, only depth.
GLenum drawbuffers[] = { GL_NONE };
glDrawBuffers(1, drawbuffers);

GL_CHECK(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE);

为阴影贴图创建模具蒙版:

Creating stencil mask for shadow map:

// bind to depth fbo
glBindFramebuffer(GL_FRAMEBUFFER, *fbo);

glEnable(GL_STENCIL_TEST);
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glClear(GL_STENCIL_BUFFER_BIT);

// write to stencil when objects are rendered
glStencilFunc(GL_ALWAYS, 1, 0xFF);
glStencilMask(0xFF);

drawVisibleObjects();

使用模板蒙版渲染深度:

Rendering of depth with stencil mask:

glBindFramebuffer(GL_FRAMEBUFFER, *fbo);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_EQUAL, 1, 0xFF); // Pass test if stencil value is 1
glStencilMask(0x00); // Don't write anything to stencil buffer
glDepthMask(GL_TRUE); // Write to depth buffer

drawObjects();

执行代码后,屏幕为黑色.这是意外的,因为我没有将深度渲染到默认的帧缓冲区,而是渲染到了纹理.由于模具值存储在纹理中,我是否必须以不同的方式使用它们?

When the code is executed, the screen is black. This is unexpected, because I dont render depth to default framebuffer, but to a texture. Since the stencil values are stored in the texture, do I have to use them differently?

使用组合的深度模板纹理GL_DEPTH_STENCIL_OES时,使用模板附件的正确方法是什么?

What is the correct way to use a stencil attachment when combined depth-stencil texture GL_DEPTH_STENCIL_OES is used?

推荐答案

模板值是您要渲染到的帧缓冲区的属性.如果要在FBO0中使用模板遮罩,则需要在FBO0中请求模板(并在渲染到FBO0时填充遮罩等).

The stencil value is a property of the framebuffer you are rendering in to. If you want to use a stencil mask in FBO0 then you need to request a stencil in FBO0 (and populate the mask, etc, while rendering to FBO0).

这篇关于如何在模板,OpenGL ES 3.0中使用深度纹理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆