我尝试在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存在偏差。
只要视图和投影值完全相同,我不应该得到相同的结果吗? 我该怎么做才能解决它?
(图像1)
(图像2)
答案 0 :(得分:0)
您对渲染的纹理使用什么分辨率?什么样的过滤? (似乎是线性的,应该是最近的)。还要尝试使用以下内容来偏移您读取的坐标:
// offset should be 0.5 / texture_resolution
gl_FrontColor = texture2D(light_depth_texture, shadow_coord.xy + offset);
正如其他评论者所提到的,8位不足以存储深度值,请考虑使用深度纹理或浮点格式(如ARB_texture_rg中的GL_R32F)。