Jak skutecznie skopiować bufor głębokości do tekstury w OpenGL ES

Próbuję uzyskać efekty cieniowania w OpenGL ES 2.0 na iOS, przenoszącjakiś kod ze standardowego GL. Część próbki polega na skopiowaniu bufora głębokości na teksturę:

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

Wydaje się jednak, że glCopyTexImage2D nie jest obsługiwany w ES. Czytanie apowiązany wątek, wydaje mi się, że mogę użyć bufora ramki i shaderów fragmentów, aby wydobyć dane głębi. Próbuję więc napisać składnik głębokości do bufora kolorów, a następnie go skopiować:

// 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);

Oto fragment shadera:

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);
    }
}

Eksperymentowałem z brakiem gałęzi „bRenderDepth” i nie przyspiesza to znacząco.

Właśnie teraz robię ten krok z prędkością 14 klatek na sekundę, co oczywiście jest nie do przyjęcia. Jeśli wyciągnę kopię, to powyżej 30 klatek na sekundę. Otrzymuję dwie sugestie od analizatora Xcode OpenGLES w poleceniu kopiowania:

plik: //localhost/Users/xxxx/Documents/Development/xxxx.mm: error: Błąd walidacji: glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 960, 640, 0): Wysokość <640> nie jest mocą z dwóch

plik: //localhost/Users/xxxx/Documents/Development/xxxx.mm: warning: GPU Czekaj na teksturę: Twoja aplikacja zaktualizowała teksturę, która jest aktualnie używana do renderowania. Spowodowało to, że procesor czekał na zakończenie renderowania przez GPU.

Będę pracował nad rozwiązaniem dwóch powyższych problemów (być może są sednem tego). Czy w międzyczasie każdy może zasugerować bardziej efektywny sposób pobierania danych głębokości do tekstury?

Z góry dziękuję!

questionAnswers(1)

yourAnswerToTheQuestion