GLSL每像素照明问题
GLSL per pixel lighting issue
我有每像素照明的问题,因为光越来越接近对象,它开始做奇怪的事情,像https://i.stack.imgur.com/M8Txl.jpg。
当相机离得太近时,我也会得到这样的伪影https://i.stack.imgur.com/8KB67.jpg。
VertShader:
#version 330 core
layout(location = 0) in vec3 vertexPosition_modelspace;
layout(location = 1) in vec4 vertexColor;
layout(location = 2) in vec2 vertexTexCord;
layout(location = 3) in vec3 vertexNormal;
uniform mat4 MVP;
uniform mat4 V;
uniform mat4 P;
uniform mat4 M;
uniform vec3 PointLight1_Position;
out vec4 fragmentColor;
out vec2 UV;
out vec3 Position_worldspace;
out vec3 Normal_cameraspace;
out vec3 EyeDirection_cameraspace;
out vec3 LightDirection_cameraspace;
void main(){
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
Position_worldspace = ( M * vec4(vertexPosition_modelspace,1)).xyz;
vec3 vertexPosition_cameraspace = ( V * M * vec4(vertexPosition_modelspace,1)).xyz;
EyeDirection_cameraspace = - vertexPosition_cameraspace;
vec3 LightPosition_cameraspace = ( V * vec4(PointLight1_Position,1)).xyz;
LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;
vec3 NormalPosition_cameraspace = ( V * M * vec4(vertexNormal,1)).xyz;
Normal_cameraspace = -NormalPosition_cameraspace;
fragmentColor = vertexColor;
UV = vertexTexCord;
}
片段着色器:
#version 330 core
in vec4 fragmentColor;
in vec2 UV;
in vec3 Position_worldspace;
in vec3 Normal_cameraspace;
in vec3 EyeDirection_cameraspace;
in vec3 LightDirection_cameraspace;
out vec3 color;
uniform sampler2D TextureSampler1;
uniform vec3 PointLight1_Position;
void main()
{
vec3 LightColor = vec3(1,1,1);
float LightPower = 10.0f;
vec3 MaterialDiffuseColor = texture2D(TextureSampler1, UV).rgb * fragmentColor.rgb;
vec3 MaterialAmbientColor = vec3(0.1,0.1,0.1) * MaterialDiffuseColor;
vec3 MaterialSpecularColor = vec3(0.3,0.3,0.3);
float distance = length( PointLight1_Position - Position_worldspace );
vec3 n = normalize( Normal_cameraspace );
vec3 l = normalize( LightDirection_cameraspace );
float cosTheta = clamp( dot( n,l ), 0,1 );
vec3 E = normalize(EyeDirection_cameraspace);
vec3 R = reflect(-l,n);
float cosAlpha = clamp( dot( E,R ), 0,1 );
color =
MaterialAmbientColor +
MaterialDiffuseColor * LightColor * LightPower * cosTheta / (distance*distance) +
MaterialSpecularColor * LightColor * LightPower * pow(cosAlpha,5) / (distance*distance);
}
我想你这里有一个错误:
vec3 NormalPosition_cameraspace = ( V * M * vec4(vertexNormal,1)).xyz;
Normal_cameraspace = -NormalPosition_cameraspace;
你应该从vertexNormal使用0作为第四个组件(而不是1)构造一个vec4。这实际上意味着当乘以你的模型/视图矩阵时,任何平移都会被忽略。这就是你想要的,因为法线代表的是一个方向,而不是一个位置。
还有,我不明白这个计算:
LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;
应该是这样的:
LightDirection_cameraspace = LightPosition_cameraspace - vertexPosition_cameraspace;
相关文章:
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- OpenGL VBO正常/照明问题
- 像素着色器中的 c++ DirectX 照明问题
- 使用着色器问题照明立方体
- OpenGL照明的问题
- GLSL每像素照明问题
- Opengl适当的照明问题