我一直在调试这个简单的Phong-Shader,但结果很差。漫反射部分没问题,但镜面反射部分不行。它不随相机移动。
"这是从一个方面“
“另一个”
据我所知,我确实将“位置”转换为“视图空间”,但是,显然,我犯了另一个错误。
顶点着色器:
# 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);
}
}
2条答案
按热度按时间tgabmvqs1#
问题是
dot(-rVec, vVec)
。vVec
是视图空间中的向量,而rVec
是世界空间中的向量。将rVec
从世界空间转换到视图空间:vec3 rVec = normalize(reflect(lVec, nVec));
dvtswwa32#
除了Rabbid76的答案之外,还有一点是错误的,那就是
if(dot(rVec,vVec) < 0.0)
测试的是两者之间的夹角是否大于90度。换句话说,你测试的是模型后面的镜面反射是否可见。你必须把它从小于翻转到大于>
。