从Cg写入深度缓冲区,然后从OpenGL读取它

时间:2011-12-08 14:11:15

标签: opengl textures shader cg zbuffer

我想用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-buffer的内容保存到opengl中的纹理?

0 个答案:

没有答案