Opengl 简单GLSL着色器(灯光)会导致闪烁

Opengl 简单GLSL着色器(灯光)会导致闪烁,opengl,glsl,shader,lighting,Opengl,Glsl,Shader,Lighting,我试图在教程之后反复实现一些基本的照明和着色 所有的东西或多或少都在工作,但由于阴影,我在物体表面上得到了某种奇怪的闪烁 我附上了两张图片,向你们展示这个问题的样子 我认为问题与我将顶点坐标从顶点着色器传递到片段着色器以计算一些照明变量有关,如上面链接的教程中所述 下面是一些源代码(去掉不相关的代码) 顶点着色器: #version 150 core in vec4 pos; in vec4 in_col; in vec2 in_uv; in vec4 in_norm; uniform

我试图在教程之后反复实现一些基本的照明和着色

所有的东西或多或少都在工作,但由于阴影,我在物体表面上得到了某种奇怪的闪烁

我附上了两张图片,向你们展示这个问题的样子

我认为问题与我将顶点坐标从顶点着色器传递到片段着色器以计算一些照明变量有关,如上面链接的教程中所述

下面是一些源代码(去掉不相关的代码)

顶点着色器:

#version 150 core

in vec4 pos;
in vec4 in_col;
in vec2 in_uv;
in vec4 in_norm;

uniform mat4 model_view_projection;


out vec4 out_col;
out vec2 passed_uv;
out vec4 out_vert;
out vec4 out_norm;


void main(void) {
    gl_Position = model_view_projection * pos;

    out_col = in_col;
    out_vert = pos;
    out_norm = in_norm;
    passed_uv = in_uv;
}
和片段着色器:

#version 150 core

uniform sampler2D tex;

uniform mat4 model_mat;

in vec4 in_col;
in vec2 passed_uv;
in vec4 vert_pos;
in vec4 in_norm;

out vec4 col;

void main(void) {

    mat3 norm_mat = mat3(transpose(inverse(model_mat)));
    vec3 norm = normalize(norm_mat * vec3(in_norm));

    vec3 light_pos = vec3(0.0, 6.0, 0.0);
    vec4 light_col = vec4(1.0, 0.8, 0.8, 1.0);

    vec3 col_pos = vec3(model_mat * vert_pos);

    vec3 s_to_f = light_pos - col_pos;

    float brightness = dot(norm, normalize(s_to_f));
    brightness = clamp(brightness, 0, 1);

    gl_FragColor = out_col;

    gl_FragColor = vec4(brightness * light_col.rgb * gl_FragColor.rgb, 1.0);
}
正如我前面所说的,我猜问题与顶点位置传递给片段着色器的方式有关。如果我将位置值更改为静态值,则不会再发生闪烁。 我也将所有其他值更改为statics。这是相同的结果-如果不使用从顶点着色器传递的顶点位置数据,则不会闪烁

所以,如果有人有点智慧的话……) 任何帮助都将不胜感激。 旁注:在Intel HD 4000上运行所有这些东西可能会提供更多信息

提前谢谢!
Ivan

顶点着色器中的
out
变量和片段着色器中的
in
变量的名称需要匹配。在顶点着色器中有以下内容:

out vec4 out_col;
out vec2 passed_uv;
out vec4 out_vert;
out vec4 out_norm;
out vec4 passed_col;
out vec2 passed_uv;
out vec4 passed_vert;
out vec4 passed_norm;
在片段着色器中:

in vec4 in_col;
in vec2 passed_uv;
in vec4 vert_pos;
in vec4 in_norm;
in vec4 passed_col;
in vec2 passed_uv;
in vec4 passed_vert;
in vec4 passed_norm;
这些变量是按名称关联的,而不是按顺序关联的。除了通过的,此处的名称不匹配。例如,可以在顶点着色器中使用以下声明:

out vec4 out_col;
out vec2 passed_uv;
out vec4 out_vert;
out vec4 out_norm;
out vec4 passed_col;
out vec2 passed_uv;
out vec4 passed_vert;
out vec4 passed_norm;
片段着色器中的这些:

in vec4 in_col;
in vec2 passed_uv;
in vec4 vert_pos;
in vec4 in_norm;
in vec4 passed_col;
in vec2 passed_uv;
in vec4 passed_vert;
in vec4 passed_norm;

根据我阅读规范的方式,你的着色器程序实际上应该无法链接。至少在GLSL 4.50规范第43页的表格中,它列出了这种情况下的“链接时间错误”。但是,在早期的规范中,这些规则似乎有些模糊。

近平面和远平面的值是什么?近平面设置为0.1,远平面设置为1000。您可以尝试将近平面增加到10或50吗?是的。尝试了这两个值,但仍然是相同的闪烁我一直认为gl_FragCoord在窗口空间,而不是世界空间。我错了吗?谢谢你的回答。确实是一个很好的提示,但实际上并不能解决闪烁问题。不过我用了你的变量名。我猜是因为我的GL3.2规范,程序被链接了。先生,你说得对。我太盲目了,所以我又把变量弄乱了。非常感谢,终于成功了!