2

我尝试在 OpenGL 中使用 FBO 创建一个 2 通道效果。

在第一遍中,我将深度写入颜色缓冲区(图 1):

在此处输入图像描述

在其顶点着色器中使用以下内容:

gl_Position = projection * view * gl_Vertex;
vec4 position = gl_Position/gl_Position.w;
position = position / 2.0 + 0.5;
float temp_depth = position.z;
gl_FrontColor = vec4(temp_depth,temp_depth,temp_depth,1);

在第二遍中,我尝试使用上一遍中的纹理并为场景着色(图 2):

在此处输入图像描述

这是顶点着色器中的代码:

vec4 shadow_coord  = projection * view * gl_Vertex;
shadow_coord = shadow_coord / shadow_coord.w;
shadow_coord = shadow_coord / 2.0 + 0.5;
gl_FrontColor  = texture2D(light_depth_texture, shadow_coord.xy);

场景由圆锥体前面的四边形组成。在这两种情况下,片段着色器都是。两种情况下gl_FragColor = gl_Color;的视图和投影矩阵在开始时定义的完全相同。问题是 shadow_coord.xy 存在偏差。

只要视图和投影值完全相同,我不应该得到相同的结果吗?

我能做些什么来修复它?

4

1 回答 1

0

您渲染的纹理使用什么分辨率?以及什么样的过滤?(似乎是线性的,应该是最近的)。还尝试偏移您读取的坐标,例如:

// offset should be 0.5 / texture_resolution
gl_FrontColor  = texture2D(light_depth_texture, shadow_coord.xy + offset);

正如其他评论者所提到的,8 位不足以存储深度值,请考虑使用深度纹理或浮点格式(如 ARB_texture_rg 中的GL_R32F)。

于 2013-01-05T23:18:52.440 回答