Как указать OpenGL ES 2.0 использовать текстуру в качестве буфера глубины?

Я хочу визуализировать сцену с эффектом постобработки контура в OpenGL ES 2.0.

Сначала я визуализирую все непрозрачные объекты. Затем я использую шейдер постобработки для обнаружения силуэта, который использует буфер глубины в качестве текстуры. А теперь я хочу визуализировать все объекты с помощью альфа-смешивания, без записи в буфер глубины, но используя тестирование глубины со значениями из текстуры буфера глубины, используемой для обнаружения силуэта.

Если бы я визуализировал полупрозрачные объекты до постобработки, постобработка отрисовывала бы контуры непрозрачных объектов поверх них, поскольку они не записываются в буфер глубины.

Как указать OpenGL ES 2.0 использовать текстуру в качестве буфера глубины?

Спасибо


person Gabriel    schedule 08.09.2013    source источник


Ответы (2)


Ознакомьтесь с расширением 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 нет идеального решения. Вы можете записывать значения глубины в цветовой буфер, но у вас будет ограниченная точность.

Этот поток SO охватывает тот же вопрос для WebGL, который страдает от той же проблемы.
Книга GLES2 охватывает объекты кадрового буфера и объекты рендербуфера, включая расширения, в главе 12.

person umlum    schedule 08.09.2013

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;
person Chego    schedule 14.04.2021