gpt4 book ai didi

OpenGL:ShadowMapping:阴影仅在 y=0 时可见

转载 作者:行者123 更新时间:2023-12-02 06:54:31 26 4
gpt4 key购买 nike

我已经使用 FBO 和 GLSL 实现了阴影贴图。它用于高度场。这是一些物体(树木、植物……)在高度场上转换阴影。

我遇到的问题是阴影仅在高度场的地面上可见。也就是说,高度场的高度 = 0。一旦涉及到一定的高度,阴影就会消失。如果我看一下阴影贴图本身,一切看起来都很好...离光越近的物体越暗。

这是我的 GLSL 顶点着色器:

uniform mat4 lightView, lightProjection;

const mat4 biasMatrix = mat4( 0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0); //bias from [-1, 1] to [0, 1]

void main()
{
gl_Position = ftransform();

mat4 shadowMatrix = biasMatrix * lightProjection * lightView;
shadowTexCoord = shadowMatrix * gl_Vertex;
}

片段着色器:

uniform sampler2DShadow shadowmap;
varying vec4 shadowTexCoord;

void main()
{
vec4 shadow = shadow2DProj(shadowmap, shadowTexCoord, 0.0);
float colorshadow = shadow.r < 0.1 ? 0.5 : 1.0;

vec4 color = vec4(1,1,1,1);

gl_FragColor = vec4( color*colorshadow, color.w );

}

非常感谢您对此提供的任何帮助!

最佳答案

我认为这里的不同空间之间可能存在一些混淆。正如所写的,看起来您的代码只有在地面的 gl_ModelViewMatrix 只包含相机转换时才有效。这是因为 ftransform 基本上是

gl_Position = gl_ProjectionMatrix * (gl_ModelViewMatrix * gl_Vertex)

这意味着gl_Vertex是在对象坐标中指定的。然而,通常情况下,光照的 View 矩阵从世界坐标映射到光照的 View 空间,因此该代码仅在对象空间 = 世界空间时才有效。所以基本上,假设你缩放了地形,那么对象空间就不再等于世界空间。因此,您需要将 gl_ModelViewMatrix 分成两部分:相机 View 矩阵和建模变换(例如对象 -> 世界空间)

我还没有测试过这段代码,但我会尝试这样的事情:

uniform mat4 lightView, lightProjection;
uniform mat4 camView, camProj, modelTrans;
const mat4 biasMatrix = mat4( 0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0); //bias from [-1, 1] to [0, 1]

void main()
{
mat4 modelViewProjMatrix = camProj * camView * modelTrans;
gl_Position = modelViewProjMatrix * gl_Vertex;

mat4 shadowMatrix = biasMatrix * lightProjection * lightView * modelTrans;
shadowTexCoord = shadowMatrix * gl_Vertex;
}

从技术上讲,在 CPU 上进行矩阵相乘并且只传递您需要的确切矩阵会更快,但为了让东西正常工作,有时这样做更容易。

关于OpenGL:ShadowMapping:阴影仅在 y=0 时可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803609/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com