首页 > 解决方案 > OpenGL 3 着色器错误

问题描述

我们的任务是为球体创建漫反射光照,但我们认为我们的着色器中存在错误。当我们像这样放置我们的着色器时:

顶点着色器:

#version 330 core

layout (location = 0) in vec3 position;
layout (location = 1) in vec3 aNormal;


uniform mat4 u_MVP;
uniform mat4 model;
out vec3 FragPos;
out vec3 Normal;

void main() {
    //lighting calculations
    gl_Position = u_MVP * vec4(position,1.0);
    FragPos = vec4(model * vec4(position,1.0)).xyz;
    Normal = aNormal;
};

片段着色器

#version 330 core

layout (location = 0) out vec4 color;

uniform vec3 u_Light;
uniform vec4 u_Color;
in vec3 Normal;
in vec3 FragPos;

void main() {
    // Light emission properties
    // You probably want to put them as uniforms
    vec3 LightColor = vec3(1.0, 1.0, 1.0);
    vec3 ambient = vec3(0.2, 0.2, 0.16);

    vec3 norm = normalize(Normal);
    vec3 lightDir = normalize(u_Light - FragPos);
    float diff = clamp(dot(norm, lightDir), 0.0, 1.0);
    vec3 diffuse = diff * LightColor;


    color = (vec4(ambient,1.0f)+vec4(diffuse,1.0)) *u_Color;
    color.a = u_Color[3];
    //color = vec4(0.0, 0.0, 0.5, 0.1);
};

当我们将位置与模型一起放置时,我们没有漫射照明。当我们将FragPos与位置 ( ) 的坐标放在一起时,FragPos = position;它会起作用,但光线不会改变方向。我们应该注意,球体的法线是由教程计算的,并不是我们自己创造的。我们是否有一个明显的错误,我们做错了什么?

标签: c++openglglslshaderlighting

解决方案


将顶点位置从模型空间转换到世界空间是不够的。您还需要转换法线向量:

FragPos = vec4(model * vec4(position,1.0)).xyz;
Normal = normalize(transpose(inverse(mat3(model))) * aNormal);

我使用了4x4 模型矩阵的逆转 左上 3x3 来变换法线向量。看:


推荐阅读