Записать буфер глубины из Cg, а затем прочитать его из OpenGL - PullRequest
2 голосов
/ 08 декабря 2011

Я хотел бы создать карту теней с помощью 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?

...