Как вычислить среднее из 2 глубинных текстур путем смешивания? - PullRequest
2 голосов
/ 28 июня 2011

Мне нужно вычислить среднее значение двух текстур глубины для каждого пикселя. Я ожидаю, что смогу сделать это с фрагментным шейдером 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?

Ответы [ 2 ]

2 голосов
/ 29 июня 2011

Графический процессор выполняет все вычисления в float. Убедитесь, что ссылка на ваш процессор также использует float а не double.

0 голосов
/ 29 июня 2011

Как я добавил к своему вопросу, корень проблемы был не в текстурах глубины или в режиме наложения, а в том, что я рендерил в буфер с 8 битами на компонент цвета.Это, вероятно, сработало бы, если бы я старался изо всех сил получить буфер с более высокой точностью.Но я выбрал альтернативную программу фрагментации, которая помещает вывод в gl_FragDepth, и это, кажется, работает как нужно, так как у меня уже был 24-битный буфер глубины.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...