Мне нужно вычислить среднее значение двух текстур глубины для каждого пикселя. Я ожидаю, что смогу сделать это с фрагментным шейдером GLSL, но я бы предпочел решение, которое работает на самом тупом оборудовании, поэтому я попытался смешать. Вот основной код:
/// Initialize color buffer to black
glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );
glClear( GL_COLOR_BUFFER_BIT );
// Turn off unnecessary operations
glDisable( GL_DEPTH_TEST );
glDisable( GL_LIGHTING );
glDisable( GL_CULL_FACE );
glDisable( GL_BLEND );
glDisable( GL_STENCIL_TEST );
glDisable( GL_DITHER );
// Set all matrices to identity
glMatrixMode( GL_TEXTURE );
glLoadIdentity();
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
RenderAQuadTexturedWith( texture1 );
glEnable( GL_BLEND );
glBlendEquation( GL_FUNC_ADD );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glColor4f( 1.0f, 1.0f, 1.0f, 0.5f );
RenderAQuadTexturedWith( texture2 );
Проблема в том, что значения, которые я получаю, не соответствуют примерно 0,002 по сравнению с тем, что я получаю, получая пиксели двух текстур и вычисляя среднее значение на процессоре. Когда вы устанавливаете точку останова в OpenGL Profiler (это в Mac OS X 10.6.8) и видите цветовой буфер, это выглядит примерно так, как я ожидал. Есть ли какая-то внутренняя неточность в режиме наложения?
Я также попытался установить текущий цвет на 0,5, 0,5, 0,5 и использовать glBlendFunc( GL_ONE, GL_ONE )
, и ошибки были в противоположном направлении, но примерно с той же величиной.
РЕДАКТИРОВАНИЕ ДОБАВИТЬ: В ретроспективе я ясно вижу свою ошибку: если я рендеринг в буфер рендеринга с 8 битами на компонент цвета, а затем считываю пиксели с одного из этих компонентов, то у меня только 8 бит точности.
Так что теперь мне нужно найти способ извлечь результаты без потери точности. Может быть, фрагментный шейдер, который устанавливает gl_FragDepth
?