从Cg写入深度缓冲区,然后从OpenGL读取
我想用cg创建一个阴影贴图。我已经编写了一个opengl程序和2个像素着色器(带有2个顶点着色器)。在第一个像素着色器中,我写入深度寄存器,在OpenGL程序中,我将其读取到纹理。在第二个像素着色器中,我想从这个纹理中读取,但是它似乎只包含0个值。两个着色器中都有另一个纹理,我不知道这是否是一个问题,但我不这么认为 第一个着色器如下所示:从Cg写入深度缓冲区,然后从OpenGL读取,opengl,textures,shader,cg,zbuffer,Opengl,Textures,Shader,Cg,Zbuffer,我想用cg创建一个阴影贴图。我已经编写了一个opengl程序和2个像素着色器(带有2个顶点着色器)。在第一个像素着色器中,我写入深度寄存器,在OpenGL程序中,我将其读取到纹理。在第二个像素着色器中,我想从这个纹理中读取,但是它似乎只包含0个值。两个着色器中都有另一个纹理,我不知道这是否是一个问题,但我不这么认为 第一个着色器如下所示: void main( in float3 point : TEXCOORD0, out float3 color : COLOR,
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_深度_测试,然后在显示对象后:
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);
}
仅包含0个值。因为如果我将深度的值更改为0.2,那么它就工作了,所以我认为问题要么在于从z缓冲区读取,要么在于读取阴影贴图的纹理。那么,如何将z缓冲区的内容保存到opengl中的纹理中呢?Cg没有像GLSL那样的深度纹理的
sampler2DShadow
?不幸的是,没有。以下是可能的采样器:(表3-1.Cg采样器类型)@lyra42:那本书很古老;它说,在撰写本文时,OpenGL的当前版本是1.4。那太老了。你找不到更多的最新信息吗?我还没有找到任何对阴影采样器有用的参考。你应该使用tex2Dproj()读取纹理(否则采样器没有问题),它应该为你做深度比较(不需要if,深度已经包含1=灯光,0=阴影…尝试显示它!)。此外,最好使用帧缓冲区对象渲染纹理的深度。看看……Cg不像GLSL那样有深度纹理的sampler2DShadow
?不幸的是,没有。以下是可能的采样器:(表3-1.Cg采样器类型)@lyra42:那本书很古老;它说,在撰写本文时,OpenGL的当前版本是1.4。那太老了。你找不到更多的最新信息吗?我还没有找到任何对阴影采样器有用的参考。你应该使用tex2Dproj()读取纹理(否则采样器没有问题),它应该为你做深度比较(不需要if,深度已经包含1=灯光,0=阴影…尝试显示它!)。此外,最好使用帧缓冲区对象渲染纹理的深度。看看
uniform sample2D shadow_array