我试图在 OpenGL 中实现并行分割方差阴影贴图 (PSVSM)。我将视锥体分成 4 个部分。出于调试目的,我在每个平截头体分割中设置了不同的片段颜色。下面的代码片段按预期工作。
#version 330
uniform mat4 mlp[4]; // Light model_view_projection matrices
uniform sampler2DArray shadow_map;
in vec3 position;
out vec4 FragColor;
vec3 colors[] = vec3[4](
vec3(1.0f, 0.0f, 0.0f), // red
vec3(0.0f, 1.0f, 0.0f), // green
vec3(0.0f, 0.0f, 1.0f), // blue
vec3(1.0f, 1.0f, 0.0f) // yellow
);
// some functions...
void main() {
// Finding index for visualize view frustums.
int index = 0;
for (; index < 3; ++index) {
vec4 p = mlp[index] * vec4(position, 1);
if (is_visible(p.xyz)) break;
}
vec3 col = colors[index];
float shadow = calc_psvsm_shadow(shadow_map); // <--- Notice me
col *= max(0.1, dif * shadow);
FragColor = vec4(col, 1);
}
然后我改变了调用
calc_psvsm_shadow(shadow_map)
函数的执行顺序,移动到循环之前,我的 shadow
变量以某种方式改变了,一切都坏了......
void main() {
float shadow = calc_psvsm_shadow(shadow_map); // <--- Notice me
// Finding index for visualize view frustums.
int index = 0;
for (; index < 3; ++index) {
vec4 p = mlp[index] * vec4(position, 1);
if (is_visible(p.xyz)) break;
}
vec3 col = colors[index];
col *= max(0.1, dif * shadow);
FragColor = vec4(col, 1);
}
这怎么可能?我的本地
shadow
变量在堆栈中,我从未与其他函数共享。没什么看is_visible(vec3)
的功能。在我的 calc_psvsm_shadow(...)
函数中,我使用了全局统一的 mat4 mlp[4]
矩阵和输入 vec3 position
。但是我在堆栈中的本地shadow
变量是如何改变的?如果我评论循环或在循环后调用calc_psvsm_shadow(...)
函数,一切正常。是错误还是什么?有人知道这里发生了什么吗???顺便说一句,我在 MacBookPro 中运行
MacOS Ventura 13.3
Graphics: AMD Radeon Pro 5500M
GLFW OpenGL version: 3.3.4 Cocoa NSGL EGL OSMesa dynamic
GLAD OpenGL version: 4.1
GLSL version: 4.10
编辑视觉更新
我添加了一些视觉效果。这是在循环后调用
calc_psvsm_shadow(shadow_map);
函数。
这是在循环之前调用
calc_psvsm_shadow(shadow_map);
函数。我的shadow
变量变成了0
。
这是整个
calc_psvsm_shadow
功能。
float calc_psvsm_shadow(sampler2DArray shadow_map) {
float shadow = 1;
for (int i = 0; i < 4; ++i) {
vec4 clip_space = mlp[i] * vec4(position, 1);
if (i < 3 && !is_visible(clip_space.xyz)) continue;
vec3 ndc = (clip_space.xyz) * 0.5 + 0.5;
shadow = sample_vsm(shadow_map, vec3(ndc.xy, i), ndc.z);
if (shadow < 0.2) break;
}
return shadow;
}
那个循环如何改变我的本地
shadow
变量?
// Finding index for visualize view frustums.
int index = 0;
for (; index < 3; ++index) {
vec4 p = mlp[index] * vec4(position, 1);
if (is_visible(p.xyz)) break;
}
vec3 col = colors[index];