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

Я пытаюсь заставить некоторые эффекты затенения работать в OpenGL ES 2.0 на iOS, портируянекоторый код от стандарта GL. Часть примера включает копирование буфера глубины в текстуру:

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

Тем не менее, похоже, что glCopyTexImage2D не поддерживается на ES. Чтениесвязанная темаКажется, я могу использовать буфер кадра и фрагментные шейдеры, чтобы извлечь данные глубины. Поэтому я пытаюсь записать компонент глубины в буфер цвета, а затем копирую его

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

Вот фрагментный шейдер:

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

Я экспериментировал с отсутствием ветки 'bRenderDepth', и это не значительно ускоряет его.

Прямо сейчас, в основном, просто делаю этот шаг со скоростью 14 кадров в секунду, что, очевидно, недопустимо. Если я вытащу копию выше 30 кадров в секунду. Я получаю два предложения от анализатора Xcode OpenGLES по команде копирования:

file: //localhost/Users/xxxx/Documents/Development/xxxx.mm: error: Ошибка проверки: glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 960, 640, 0): высота <640> не является степенью из двух

file: //localhost/Users/xxxx/Documents/Development/xxxx.mm: warning: GPU Wait on Texture: Ваше приложение обновило текстуру, которая в данный момент используется для рендеринга. Это заставило процессор ждать, пока графический процессор завершит рендеринг.

Я буду работать над решением двух вышеупомянутых проблем (возможно, они суть, если из этого). А пока кто-нибудь может предложить более эффективный способ перенести данные глубины в текстуру?

Заранее спасибо!

Ответы на вопрос(1)

Ваш ответ на вопрос