2013-08-28 2 views
0

Я сделал первый шаг отложенного рендеринга, цвет fbo wit, нормальный, положение и глубину. Но когда я делаю освещение, позиции движутся и вращаются вместе со мной. Первый проход вершина:Отложенная позиция рендеринга

void main(){ 
    gl_Position=gl_ModelViewProjectionMatrix*gl_Vertex; 
    vec4 positiontotexture = gl_ModelViewProjectionMartix*gl_Vertex; 
} 

Так как я могу получить исходное положение?

ответ

2

Я предполагаю, что positiontotexture пойдет в шейдер фрагмента и затем будет сохранен в текстуре.

При первом проходе было бы неплохо иметь позицию вида, а не ViewProjection. Вы можете использовать:

vec4 positiontotexture = gl_ModelViewMartix*gl_Vertex; 

во втором проходе, то вы можете использовать:

vec3 position = texture(texPos, vVaryingTexCoord0.xy).rgb; 

предыдущий способ довольно прост (но это хорошо, когда обучение), но требуют много памяти (вы должны хранить 3 элемента вектора). Лучше всего воссоздать позицию вида с позиции/глубины экрана: link to article. Такие методы используются в современных двигателях. (Спасибо andon-m-coleman за предложение)

Вот мой репо с некоторым основным отсроченным: https://github.com/fenbf/efg_deferred/tree/master/code/shaders

+0

@Csoki: Определенно предпочитает второй способ, дополнительный G-Buffer с достаточной точностью, чтобы сохранить положение вида/мирового пространства чтобы полностью уничтожить ваши требования к пропускной способности памяти. Никакой коммерческий графический движок не использует этот подход, все они восстанавливают позицию из буфера глубины и матрицы прогноза. –

+0

@ AndonM.Coleman обновил сообщение, благодаря вашему комментарию – fen