c++ - 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;
它会起作用,但光线不会改变方向。我们应该注意,球体的法线是由教程计算的,并不是我们自己创造的。我们是否有一个明显的错误,我们做错了什么?
解决方案
将顶点位置从模型空间转换到世界空间是不够的。您还需要转换法线向量:
FragPos = vec4(model * vec4(position,1.0)).xyz;
Normal = normalize(transpose(inverse(mat3(model))) * aNormal);
我使用了4x4 模型矩阵的逆转 置左上 3x3 来变换法线向量。看:
推荐阅读
- angular - 为什么在 Angular 5 应用程序的屏幕上显示 null?
- c# - 如何确保其他应用程序使用我的 dll
- javascript - 如何在不涉及浏览器的情况下从 url 下载文件
- php - 如何使用 hmvc codeigniter 在 mbile 上加载引导程序?
- c++ - 如何获取指向私有成员函数的指针以传递给 C++ 中的朋友?
- r - 初学者试图用分类 X 轴和自定义颜色设置制作一条线 ggplot
- r - 如何访问我的表名是变量的表
- tsql - 与SQL中的其他字符串相比,如何从字符串中删除重复的单词
- c - 如何在 C 程序中存储具有高范围的变量?
- javascript - 如何避免 useEffect 钩子中的 setState 导致第二次渲染