【发布时间】:2014-05-17 19:04:18
【问题描述】:
我目前正在实施延迟渲染管道,但我坚持使用阴影贴图。 我已经成功地将其实现到正向管道中。
我做的步骤是:
- 在灯光视图中获取位置
- 转换为灯光视图剪辑空间
- 使用 * 0.5 + 0.5 获取阴影 tex 坐标;
- 检查深度
编辑:使用新结果图像更新代码:
float checkShadow(vec3 position) {
// get position in light view
mat4 invView = inverse(cameraView);
vec4 pEyeDir = sunBias * sunProjection * sunView * invView * vec4(position, 1.0);
// light view clip space
pEyeDir = pEyeDir / pEyeDir.w;
// get uv coordinates
vec2 sTexCoords = pEyeDir.xy * 0.5 + 0.5;
float bias = 0.0001;
float depth = texture(sunDepthTex, sTexCoords).r - bias;
float shadow = 1.0f;
if(pEyeDir.z * 0.5 + 0.5 > depth)
{
shadow = 0.3f;
}
return shadow;
}
这里有一些对上面的代码很重要的变量:
vec3 position = texture(positionTex, uv).rgb;
此外,我在某些相机位置获得了深色背景(网格保持不变),只有当我将阴影值乘以最终颜色时才会发生。
根据要求,这里是位置和太阳深度纹理:
【问题讨论】:
-
一些图片要显示??什么同步性..:-)
-
乍一看,用眼睛向量计算shadowTexCoord很奇怪。它应该用
translate(0.5,0.5) * scale(0.5,0.5) * lightProj * lightView * vertexPos计算 - (modelTransformations * vertexPos) -
您看到的图像是不使用眼睛矢量的结果。我只使用了位置纹理中的位置。是否需要对象模型矩阵?这不是 gbuffer 位置纹理的用途吗?
-
vec4 ModWorldPos = inverse(gl_ModelViewMatrix) * gl_Vertex - inverse(modelView) * gl_Vertex ; ShadowCoord= gl_TextureMatrix[7] * (gl_Vertex - ModWorldPos);这是我的,纹理矩阵是translate(0.5,0.5) * scale(0.5,0.5) * lightProj * lightView -
您确定使用延迟渲染吗?我不知道我应该如何将每个模型矩阵传递给延迟传递,因为这只是一个阴影四边形。并且您使用不推荐使用的 glsl 函数,例如 glTextureMatrix。我使用 4.2 核心。
标签: opengl mapping glsl shadow deferred