C++ 镜面反射光出现在两侧
我有一个非常奇怪的镜面反射(phong灯光模型)灯光行为。它似乎出现在所有物体的两侧。有人知道可能是什么问题吗? 实际的计算似乎是正确的,因为我可以看到光随着物体的旋转而改变它的位置C++ 镜面反射光出现在两侧,c++,opengl,freeglut,specular,phong,C++,Opengl,Freeglut,Specular,Phong,我有一个非常奇怪的镜面反射(phong灯光模型)灯光行为。它似乎出现在所有物体的两侧。有人知道可能是什么问题吗? 实际的计算似乎是正确的,因为我可以看到光随着物体的旋转而改变它的位置 #version 330 in vec4 CameraPos0; in vec3 Pos0; in vec4 Colour0; in vec3 Normal0; out vec4 FragColor; // Ambient light parameters uniform vec3 gAmbientLigh
#version 330
in vec4 CameraPos0;
in vec3 Pos0;
in vec4 Colour0;
in vec3 Normal0;
out vec4 FragColor;
// Ambient light parameters
uniform vec3 gAmbientLightIntensity;
// Directional light parameters
uniform vec3 gDirectionalLightIntensity;
uniform vec3 gDirectionalLightDirection;
// Specular light parameter
uniform vec3 gSpecularLightIntensity;
uniform vec3 gLightSourcePosition;
uniform vec3 gCameraPosition;
// Material constants
uniform float gKa;
uniform float gKd;
uniform float gKs;
void main()
{
// Calculate the ambient light intensity at the vertex
// Ia = Ka * ambientLightIntensity
vec4 ambientLightIntensity = gKa * vec4(gAmbientLightIntensity, 1.0);
// Setup the light direction and normalise it
vec3 lightDirection = normalize(-gDirectionalLightDirection);
//lightDirection = normalize(gDirectionalLightDirection);
// Id = kd * lightItensity * N.L
// Calculate N.L
float diffuseFactor = dot(Normal0, lightDirection);
diffuseFactor = clamp(diffuseFactor, 0.0, 1.0);
// N.L * light source colour * intensity
vec4 diffuseLightIntensity = gKd * vec4(gDirectionalLightIntensity, 1.0f) * diffuseFactor;
// Phong light
vec3 L = normalize(gLightSourcePosition - Pos0);
vec3 V = normalize(-Pos0);
vec3 R = normalize(2 * Normal0 * dot(Normal0, L) - L);
float specularFactor = pow(dot(R, V), 0.1f);
vec4 specularLightIntensity = gKs * vec4(gSpecularLightIntensity, 1.0f) * specularFactor;
specularLightIntensity = clamp(specularLightIntensity, 0.0, 1.0);
// Final vertex colour is the product of the vertex colour
// and the total light intensity at the vertex
vec4 lightedFragColor = Colour0 * (ambientLightIntensity + diffuseLightIntensity + specularLightIntensity);
FragColor = lightedFragColor;
}
顶点着色器
#version 330
layout (location = 0) in vec3 Position;
layout (location = 1) in vec3 Normal;
layout (location = 2) in vec4 Colour;
out vec3 Pos0;
out vec4 Colour0;
out vec3 Normal0;
out vec4 CameraPos0;
uniform mat4 gModelToWorldTransform;
uniform mat4 gWorldToViewTransform;
uniform mat4 gProjectionTransform;
void main()
{
vec4 vertexPositionInModelSpace = vec4(Position, 1);
vec4 vertexInWorldSpace = gModelToWorldTransform * vertexPositionInModelSpace;
vec4 vertexInViewSpace = gWorldToViewTransform * vertexInWorldSpace;
vec4 vertexInHomogeneousClipSpace = gProjectionTransform * vertexInViewSpace;
gl_Position = vertexInHomogeneousClipSpace;
vec3 normalInWorldSpace = (gModelToWorldTransform * vec4(Normal, 0.0)).xyz;
normalInWorldSpace = normalize(normalInWorldSpace);
Normal0 = normalInWorldSpace;
CameraPos0 = vertexInViewSpace;
Pos0 = vertexInWorldSpace.xyz;
Colour0 = Colour;
}
您需要
钳制饱和演算的点
结果,因为在背面,结果是负数,pow
可以返回正数,而不是钳制为零
float specularFactor=pow(钳位(dot(R,V),0.0,1.0),0.1f)代码>
编辑:
另外,V
应该是指向相机位置的向量,而不是指向世界空间中的顶点位置:
vec3 V=normalize(CameraPos0-Pos0)代码>不幸的是,这没有帮助。还是一样的问题,也没用。我认为顶点着色器也可能有问题,因为我不确定Pos0和CamerPos0的具体性能。它是在世界空间还是在模型空间?除了对象->世界矩阵中的旋转之外,您是否还应用了其他操作?如果是这样,则不应使用该矩阵变换法线。