我想用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中的纹理?