Когда я создаю г-буферную структуру следующий образом:Рендеринг 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 неверно?
Вы правы, это была проблема точности. Я пытался использовать цветную текстуру, чтобы получить полную 32-битную точность по значению глубины. По какой-то причине ваше решение, похоже, создает больше артефактов, и я не могу избавиться от них. Он также создает тени случайным образом. Я думаю, что openGL делает некоторые дополнительные оптимизации. – spearmunkie