OpenGL漫射照明计算错误
OpenGL diffuse lighting calculates wrong
我有一个简单的场景,涉及一个旋转立方体和一个定向(漫反射(光源,但我似乎没有得到正确的照明数学。
我从本教程的 obj 文件中加载顶点和法线:
我的一些应用程序代码:
glm::mat4 modelview = ...
glm::mat4 projection = glm::perspective(60.0f, 16.0f/9.0f, 0.1f, 100.0f);
glm::mat4 MVP = projection * modelview;
glm::mat3 NormalMatrix = glm::transpose(glm::inverse(glm::mat3(modelview)));
glUniformMatrix4fv(MVP_location, 1, GL_FALSE, &MVP[0][0]);
glUniformMatrix3fv(NormalMatrix_location, 1, GL_FALSE, &NormalMatrix[0][0]);
glDrawArrays(GL_TRIANGLES, 0, 36);
顶点着色器:
#version 430
in vec3 position;
in vec3 in_normal;
uniform mat4 MVP;
uniform mat3 NormalMatrix;
out vec3 Normal;
out vec4 Color;
void main()
{
gl_Position = MVP * vec4(position, 1.0);
Color = vec4(clamp(position, 0.0, 1.0), 1.0); //based on vertex position
Normal = normalize(NormalMatrix * in_normal);
}
片段着色器:
#version 430
const vec3 Ambient = vec3(0.15, 0.15, 0.15);
const vec3 LightDirection = normalize(vec3(1.0, 0.0, 1.0));
const vec3 LightColor = vec3(1.0, 1.0, 1.0);
const float Shininess = 20.0;
const float Strength = 5.0;
in vec3 Normal;
in vec4 Color;
out vec4 FragColor;
void main()
{
FragColor = Color;
float diffuse = max(0.0, dot(Normal, LightDirection));
vec3 scatteredLight = Ambient + LightColor * diffuse;
vec3 rgb = min(FragColor.rgb * scatteredLight, vec3(1.0));
FragColor = vec4(rgb, Color.a);
}
这就是我得到的:我的失败
知道我做错了什么吗?
让我更详细地阐述一下达里的评论。
法向量乘以从view*model
矩阵派生的法向矩阵(在应用程序中称为modelview
(。使用模型矩阵将顶点相乘可将它们从局部空间转换为世界空间,使用视图矩阵将世界空间中的顶点相乘可将它们转换为视图空间坐标。在您的例子中,您使用模型和视图矩阵转换了法线向量;这意味着您的法线矢量位于视空间中(从观看者的角度看,它们的方向:相机(。
现在,您指定了光的方向矢量LightDirection
在世界空间中(它的方向是您希望它在全球世界中的样子,对吗?无需使用模型矩阵以任何方式转换它(。
在计算漫反射/镜面照明时,您希望方向/位置矢量都位于同一坐标空间中,否则您将在不同的空间之间进行计算,从而产生奇怪的结果。由于你的LightDirection
在世界空间中,而你的Normal
在视图空间中,你会得到奇怪的结果。
因此,您需要做的是解决您的问题:
- 通过将
LightDirection
与视图矩阵相乘(不是modelview
,因为它同时包含模型和视图矩阵(,将其转换为视图空间。 - 或者仅从模型矩阵(不是
modelview
(计算法线矩阵,这样你的法线向量将像现在一样LightDirection
最终进入世界空间。
重要的是两个向量都在同一个空间中(可以是世界或视图,无论你喜欢什么(。
请注意,这适用于当您想给人一种相机在物体静止时正在移动的印象时(允许您移动到物体的未照明侧面(;请参阅下面的Reto Koradi的评论。
相关文章:
- 我的字符计数代码计算错误.为什么
- 为什么 2 个双精度值之间的差值计算错误?
- C++ openmp 并行计算计算错误的结果
- Qt qreal计算错误
- C 并行矩阵乘法,计算错误
- Arduino计算错误 - 不应该时给出负值
- 当尺寸变大时,会出现矩阵计算错误
- C++ if 语句数学计算错误
- 浮点数的不准确导致计算错误
- 优化标志会导致计算错误
- Kahan求和算法在GCC编译时存在较大的计算错误
- 为什么在函数中传递参数时会出现算术计算错误
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- OpenGL漫射照明计算错误
- 具有参数计算错误的重载函数
- 我的程序中有计算错误吗
- 在C++中使用ceil函数时出现计算错误
- 模拟读数计算错误
- struct和time_t的计算错误
- Pow()计算错误