我想在OpenGL ES 2.0中渲染一个具有轮廓后处理效果的场景。
首先,我渲染所有不透明的对象。然后我使用一个后处理着色器进行轮廓检测,它使用深度缓冲区作为纹理。现在我想使用alpha混合来渲染所有的对象,而不是写入深度缓冲区,而是使用深度缓冲区纹理中用于轮廓检测的值进行深度测试。
如果我在后期处理之前渲染半透明对象,则后期处理会在它们上面渲染不透明对象的轮廓,因为它们不会写入深度缓冲区。
如何告诉OpenGL ES 2.0使用纹理作为深度缓冲区?
谢谢
发布于 2013-09-09 04:56:48
查看OES_depth_texture扩展。有了这个,你就可以
// 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对象,包括扩展。
发布于 2021-04-14 12:53:19
onDrawFrame(){ ...
////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);碎片着色器...
uniform sampler2D u_textureXYZ;
uniform sampler2D u_textureAO_norm;
uniform sampler2D u_textureDepth;https://stackoverflow.com/questions/18685386
复制相似问题