Cómo copiar eficientemente el buffer de profundidad a la textura en OpenGL ES

Estoy intentando obtener algunos efectos de sombreado para que funcionen en OpenGL ES 2.0 en iOS mediante la migraciónalgun código de la norma GL. Parte de la muestra consiste en copiar el búfer de profundidad en una textura:

glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, 800, 600, 0);

Sin embargo, parece que el glCopyTexImage2D no es compatible con ES. Leyendo unhilo relacionadoParece que puedo usar el buffer de cuadros y los sombreadores de fragmentos para extraer los datos de profundidad. Así que estoy intentando escribir el componente de profundidad en el búfer de color y luego copiarlo:

// clear everything
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 

// turn on depth rendering
glUseProgram(m_BaseShader.uiId);

// this is a switch to cause the fragment shader to just dump out the depth component
glUniform1i(uiBaseShaderRenderDepth, true);

// and for this, the color buffer needs to be on
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);

// and clear it to 1.0, like how the depth buffer starts
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);

// draw the scene
DrawScene();

// bind our texture 
glBindTexture(GL_TEXTURE_2D, g_uiDepthBuffer);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, width, height, 0);

Aquí está el shader de fragmentos:

uniform sampler2D sTexture;
uniform bool bRenderDepth;

varying lowp    float LightIntensity;
varying mediump vec2  TexCoord;

void main()
{    
    if(bRenderDepth) {
        gl_FragColor = vec4(vec3(gl_FragCoord.z), 1.0);
    } else {
        gl_FragColor = vec4(texture2D(sTexture, TexCoord).rgb * LightIntensity, 1.0);
    }
}

He experimentado con no tener la rama 'bRenderDepth', y no la acelera significativamente.

En este momento prácticamente haciendo este paso es a 14 fps, lo que obviamente no es aceptable. Si saco la copia está por encima de los 30 fps. Recibo dos sugerencias del analizador Xcode OpenGLES en el comando de copia:

archivo: //localhost/Users/xxxx/Documents/Development/xxxx.mm: error: Error de validación: glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 960, 640, 0): Altura <640> no es una potencia de dos

file: //localhost/Users/xxxx/Documents/Development/xxxx.mm: warning: GPU Wait on Texture: su aplicación actualizó una textura que se usa actualmente para renderizar. Esto hizo que la CPU esperara a que la GPU terminara de renderizarse.

Trabajaré para resolver los dos problemas anteriores (tal vez sean el quid de si). Mientras tanto, ¿puede alguien sugerir una manera más eficiente de llevar esos datos de profundidad a una textura?

¡Gracias por adelantado!

Respuestas a la pregunta(1)

Su respuesta a la pregunta