Я хотел бы создать карту теней с помощью cg.Я написал программу opengl и 2 пиксельных шейдера (с 2 вершинными шейдерами).В первом пиксельном шейдере я записываю регистр DEPTH, а в программе OpenGL я читаю это в текстуру.Во втором пиксельном шейдере я хотел бы прочитать эту текстуру, но, похоже, она содержит только 0 значений.В обоих шейдерах есть другая текстура, я не знаю, является ли этот фургон проблемой, но я так не думаю.
Первый шейдер выглядит так:
void main( in float3 point : TEXCOORD0,
out float3 color : COLOR,
out float depth : DEPTH)
{
// here I calculate the distances (c)
color = float3(c, c, c);
depth = c;
}
В программе OpenGL я создал текстуру для компонента глубины:
glGenTextures(1, &shadowtex_id);
glBindTexture(GL_TEXTURE_2D, shadowtex_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, RES, RES, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
Включил GL_DEPTH_TEST, затем после отображения объектов:
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, RES, RES);
, затем во втором шейдере:
float depth = tex2D(shadow_array, depthcoord);
// depthcoord is the actual point's coordinate's in the light's coordinate system
// epsilon is a very small number
if (this_depth < depth + epsilon) {
color = float3(depth, depth, depth);
}
И все, что я получаю, это весь черный экран.Я пробовал разные вещи, и я пришел к такому выводу, что, похоже, мой
uniform sample2D shadow_array
содержит только 0 значений.Потому что, если я изменяю значение глубины, например, на 0,2, то оно работает, поэтому я думаю, что проблема либо в чтении из z-буфера, либо в чтении текстуры карты теней.Так как же я могу сохранить содержимое z-буфера в текстуру в opengl?