2013-10-15 2 views
0

Когда я создаю г-буферную структуру следующий образом:Рендеринг Z-буфер текстуры в WebGL

gl.bindTexture(GL_TEXTURE_2D, texBuff); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
gl.texImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, frameBuff.width, frameBuff.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_SHORT, null); 

я получить правильный Z-буфер, который я затем можно использовать для теней (и моя тень делает отлично) , Однако, если я создаю цветную текстуру и цвет текстуры с z-значением, у моих теней много артефактов (даже с высоким уклоном). Буфер цвета создается следующим образом:

gl.bindTexture(GL_TEXTURE_2D, colorBuff); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
gl.texParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
gl.texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, frameBuff.width, frameBuff.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, null); 

Это пиксельный шейдер программа, которая записывает в буфер цвета:

precision highp float; 
void main() { 
    float z = gl_FragCoord.z; 
    gl_FragColor = vec4(z, z, z, 1.0); 
} 

Когда я сделать две текстуры на какой-либо поверхности, они выглядят одинаково.

Так что мой вопрос: почему моя цветовая текстура не работает? Является ли gl_FragCoord.z ​​неправильным значением z, которое записывается в z-буфер? Согласно http://www.opengl.org/sdk/docs/manglsl/xhtml/gl_FragCoord.xml это так. Согласны ли текстуры друг с другом, когда я связываю цветовой буфер? Или значение z неверно?

ответ

4

Этот вопрос мне потребовалось много времени, чтобы разобрать :) Я надеюсь, что я получил правильный ответ:

Это просто точность. Текстура компонента глубины имеет по меньшей мере 16 бит для значения z. В цвете у вас всего 8 бит на канал. Вместо записи того же z в rgb вы можете написать что-то вроде (z, frac (z * 256.0), frac (z * 256.0 * 256.0)), чтобы записать полные 24 бита. Это будет выглядеть странно, но вы можете декодировать его с помощью dp3 (1,1/256,1/(256 * 256)), если вы его прочитаете.

Btw, основная причина, по которой ваш вопрос трудно было прочитать, заключалась в том, что я никогда не читал фрагмент, чтобы получить z. Я бы всегда использовал координату текстуры, чтобы получить текстуру z. Это дает вам немного больше контроля над тем, как вы создаете и интерполируете z из вершинного шейдера.

+0

Вы правы, это была проблема точности. Я пытался использовать цветную текстуру, чтобы получить полную 32-битную точность по значению глубины. По какой-то причине ваше решение, похоже, создает больше артефактов, и я не могу избавиться от них. Он также создает тени случайным образом. Я думаю, что openGL делает некоторые дополнительные оптимизации. – spearmunkie

 Смежные вопросы

  • Нет связанных вопросов^_^