我已经尝试了一段时间来调试这个简单的,但是我发现它很短。弥漫性部分很好,但镜面不是。它不会和摄像机一起移动。
从一边来:

和这里来自另一个:

据我所见,我确实把这个位置转换成了Viewspace,但是,很显然,我犯了另一个错误。
顶点着色器:
#version 330
#extension GL_ARB_explicit_attrib_location : enable
layout(location=0) in vec3 aPosition;
layout(location=1) in vec3 aNormal;
out vec3 vPosition;
out vec3 vNormal;
uniform mat4 uModel;
uniform mat4 uView;
uniform mat4 uProjection;
void main(void)
{
vPosition = vec3(uModel * vec4(aPosition,1.0f));
vNormal = vec3(uModel * vec4(aNormal, 0.0f));
gl_Position = uProjection * uView * uModel * vec4(aPosition, 1.0);
}我的碎片着色器
#version 330
out vec4 FragColor;
in vec3 vPosition;
in vec3 vNormal;
uniform mat4 uView;
uniform vec3 uColor;
uniform vec3 uLightpositions[10];
uniform vec3 uLightcolors[10];
uniform float uPhongSpecular;
void main(void)
{
FragColor = vec4(0.4*uColor, 1.0);//Ambient Value
for(int i = 0; i < 5; i++){
vec3 lVec = normalize(uLightpositions[i] - vPosition);
vec3 nVec = normalize(vNormal);
float diffuse = max(dot(lVec,nVec), 0);
FragColor += 0.5* vec4(uLightcolors[i] * diffuse,0.0f);
vec3 rVec = normalize(reflect(lVec,nVec));
vec3 vVec = -normalize(vec3(uView * vec4(vPosition,1.0)));
float specular = 0;
if(dot(rVec,vVec) < 0.0)
{
specular = pow(max(dot(-rVec,vVec),0),uPhongSpecular);
}
FragColor += 0.2*vec4(uLightcolors[i] * specular,0.0f);
}
}发布于 2022-06-07 15:52:53
除了拉比德76的答案,还有一件事情是错误的,那就是if(dot(rVec,vVec) < 0.0)正在测试两者之间的角度是否大于90度。换句话说,您正在测试模型后面是否可见镜面反射。你必须把它从小于--而不是--转换成--比>更大。
https://stackoverflow.com/questions/72523922
复制相似问题