片段 GLSL 着色器中的奇怪行为

问题描述 投票:0回答:0

我试图在 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];
macos opengl glsl
© www.soinside.com 2019 - 2024. All rights reserved.