Как эффективно скопировать буфер глубины в текстуру на 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: Ваше приложение обновило текстуру, которая в данный момент используется для рендеринга. Это заставило процессор ждать, пока графический процессор завершит рендеринг.
Я буду работать над решением двух вышеупомянутых проблем (возможно, они суть, если из этого). А пока кто-нибудь может предложить более эффективный способ перенести данные глубины в текстуру?
Заранее спасибо!