首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何告诉OpenGL ES 2.0使用纹理作为深度缓冲区?

如何告诉OpenGL ES 2.0使用纹理作为深度缓冲区?
EN

Stack Overflow用户
提问于 2013-09-08 23:24:22
回答 2查看 1.9K关注 0票数 4

我想在OpenGL ES 2.0中渲染一个具有轮廓后处理效果的场景。

首先,我渲染所有不透明的对象。然后我使用一个后处理着色器进行轮廓检测,它使用深度缓冲区作为纹理。现在我想使用alpha混合来渲染所有的对象,而不是写入深度缓冲区,而是使用深度缓冲区纹理中用于轮廓检测的值进行深度测试。

如果我在后期处理之前渲染半透明对象,则后期处理会在它们上面渲染不透明对象的轮廓,因为它们不会写入深度缓冲区。

如何告诉OpenGL ES 2.0使用纹理作为深度缓冲区?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-09-09 04:56:48

查看OES_depth_texture扩展。有了这个,你就可以

代码语言:javascript
复制
// generate and bind a new Framebuffer object
glGenFramebuffers( ... );
glBindFramebuffer( ... );

// create a depth texture
glTexImage2D(...,  GL_DEPTH_COMPONENT, ...);

// and attach it to the Framebuffer with     
glFramebufferTexture2D(..., GL_DEPTH_ATTACHMENT, ...);

没有OpenGL扩展,就没有完美的解决方案。您可以将深度值写入颜色缓冲区,但那里的精度将是有限的。

This SO thread为WebGL解决了同样的问题,但它也遇到了同样的问题。

The GLES2 book在第12章中介绍了Framebuffer对象和Renderbuffer对象,包括扩展。

票数 3
EN

Stack Overflow用户

发布于 2021-04-14 12:53:19

onDrawFrame(){ ...

代码语言:javascript
复制
            ////attach texture for SSAO
            GLES20.glActiveTexture(GLES30.GL_TEXTURE2);
            GLES20.glBindTexture(GLES30.GL_TEXTURE_2D, TextureXYZ);
            GLES20.glUniform1i(rs.u_textureXYZ, 2);
            GLES20.glActiveTexture(GLES30.GL_TEXTURE3);
            GLES20.glBindTexture(GLES30.GL_TEXTURE_2D, TextureAO_Norm);//нормали
            GLES20.glUniform1i(rs.u_textureAO_norm, 3);
            GLES20.glActiveTexture(GLES30.GL_TEXTURE4);
            GLES20.glBindTexture(GLES30.GL_TEXTURE_2D, Texture_depth);//Depth
            GLES20.glUniform1i(rs.u_textureDepth, 4);

碎片着色器...

代码语言:javascript
复制
uniform sampler2D u_textureXYZ;
uniform sampler2D u_textureAO_norm;
uniform sampler2D u_textureDepth;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18685386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档