[英]GLSL per pixel lighting issue
I am having issues with per pixel lighting, as the light gets closer to the object it starts doing weird things like this http://imgur.com/NbZxvAT . 我遇到了每个像素照明的问题,因为光线越来越靠近对象,它开始执行类似http://imgur.com/NbZxvAT这样的奇怪操作。
Also when the camera gets too close i get artifacts like this http://imgur.com/vDoQlj0 . 另外,当相机离相机太近时,我会得到类似http://imgur.com/vDoQlj0的伪影。
VertShader: 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;
}
Fragment Shader: 片段着色器:
#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);
}
I think you have an error here: 我认为您在这里有一个错误:
vec3 NormalPosition_cameraspace = ( V * M * vec4(vertexNormal,1)).xyz;
Normal_cameraspace = -NormalPosition_cameraspace;
You should construct a vec4 from vertexNormal using 0 as the fourth component (not 1). 您应该使用0作为第四个组件(而非1)从vertexNormal构造一个vec4。 This effectively means that any translation is ignored when multiplying by your model/view matrices.
这实际上意味着与模型/视图矩阵相乘时,任何转换都将被忽略。 This is what you want because the normal represents a direction, not a position.
这就是您想要的,因为法线表示方向,而不是位置。
Also, I don't understand this calculation: 另外,我不理解此计算:
LightDirection_cameraspace = LightPosition_cameraspace + EyeDirection_cameraspace;
Shouldn't this be something like: 这不应该是这样的:
LightDirection_cameraspace = LightPosition_cameraspace - vertexPosition_cameraspace;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.