Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Cg写入深度缓冲区,然后从OpenGL读取_Opengl_Textures_Shader_Cg_Zbuffer - Fatal编程技术网

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

从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,

我想用cg创建一个阴影贴图。我已经编写了一个opengl程序和2个像素着色器(带有2个顶点着色器)。在第一个像素着色器中,我写入深度寄存器,在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_深度_测试,然后在显示对象后:

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