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
Opengl 将正交阴影贴图渲染到屏幕?_Opengl_Shadow_Shadow Mapping - Fatal编程技术网

Opengl 将正交阴影贴图渲染到屏幕?

Opengl 将正交阴影贴图渲染到屏幕?,opengl,shadow,shadow-mapping,Opengl,Shadow,Shadow Mapping,我有一个用于平行光的工作阴影贴图实现,其中我使用正交投影构造投影矩阵。我的问题是,如何可视化阴影贴图?我有以下用于聚光灯(使用透视投影)的着色器,但当我尝试将其应用于使用正交投影制作的阴影贴图时,我得到的只是一个完全黑色的屏幕(即使渲染场景本身时阴影贴图也有效) 您试图使用GL\u纹理\u比较\u模式对深度纹理进行采样,设置为GL\u比较\u R\u到\u纹理。这对于实际使用深度纹理执行阴影贴图非常有用,但如果尝试使用sampler2Dundefined对其进行采样,则会导致无法定义。由于您希望

我有一个用于平行光的工作阴影贴图实现,其中我使用正交投影构造投影矩阵。我的问题是,如何可视化阴影贴图?我有以下用于聚光灯(使用透视投影)的着色器,但当我尝试将其应用于使用正交投影制作的阴影贴图时,我得到的只是一个完全黑色的屏幕(即使渲染场景本身时阴影贴图也有效)


您试图使用
GL\u纹理\u比较\u模式
对深度纹理进行采样,设置为
GL\u比较\u R\u到\u纹理
。这对于实际使用深度纹理执行阴影贴图非常有用,但如果尝试使用
sampler2D
undefined对其进行采样,则会导致无法定义。由于您希望实际深度值存储在深度纹理中,而不是通过/失败深度测试的结果,因此需要首先将
GL\u纹理\u比较\u模式
设置为
GL\u无


如果要在显示深度缓冲区和绘制阴影之间切换,则在每个纹理的基础上设置此状态非常不方便。我建议对进行阴影映射的着色器使用
GL_纹理\u比较\u模式
设置为
GL_比较\u R_to_纹理
(与
sampler2DShadow
兼容)的采样器对象,以及使用
GL_NONE
(与
sampler2D
兼容)的另一个采样器对象来可视化深度缓冲区。这样,您只需根据着色器实际使用深度纹理的方式调出绑定到纹理图像单元5的采样器对象。

您可能忘记禁用
GL\u texture\u COMPARE\u MODE
,这意味着使用
sampler2D
对深度纹理进行采样是未定义的(并且可能会产生所有黑色纹理)。如果使用采样器对象,则可以使用不同的采样器对象,在实际阴影过程中启用比较,在要可视化深度缓冲区时禁用比较。否则,此状态为每个纹理对象。是的,它起作用了,添加它作为答案
#version 430

layout(std140) uniform;

uniform UnifDepth
{
    mat4 mWVPMatrix;
    vec2 mScreenSize;
    float mZNear;
    float mZFar;
} UnifDepthPass;

layout (binding = 5) uniform sampler2D unifDepthTexture;

out vec4 fragColor;

void main()
{
    vec2 texcoord = gl_FragCoord.xy / UnifDepthPass.mScreenSize;

    float depthValue = texture(unifDepthTexture, texcoord).x;
    depthValue = (2.0 * UnifDepthPass.mZNear) / (UnifDepthPass.mZFar + UnifDepthPass.mZNear - depthValue * (UnifDepthPass.mZFar - UnifDepthPass.mZNear));

    fragColor = vec4(depthValue, depthValue, depthValue, 1.0);
}