过去几周我一直在学习 OpenGL,但在实现 Phong 着色器时遇到了一些麻烦。smooth
尽管我使用了限定符,但它似乎没有在顶点之间进行插值。我在这里错过了什么吗?为了在应得的地方给予赞扬,顶点和片段着色器的代码大量来自OpenGL SuperBible第五版。我强烈推荐这本书!
顶点着色器:
#version 330
in vec4 vVertex;
in vec3 vNormal;
uniform mat4 mvpMatrix; // mvp = ModelViewProjection
uniform mat4 mvMatrix; // mv = ModelView
uniform mat3 normalMatrix;
uniform vec3 vLightPosition;
smooth out vec3 vVaryingNormal;
smooth out vec3 vVaryingLightDir;
void main(void) {
vVaryingNormal = normalMatrix * vNormal;
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
vVaryingLightDir = normalize(vLightPosition - vPosition3);
gl_Position = mvpMatrix * vVertex;
}
片段着色器:
#version 330
out vec4 vFragColor;
uniform vec4 ambientColor;
uniform vec4 diffuseColor;
uniform vec4 specularColor;
smooth in vec3 vVaryingNormal;
smooth in vec3 vVaryingLightDir;
void main(void) {
float diff = max(0.0, dot(normalize(vVaryingNormal), normalize(vVaryingLightDir)));
vFragColor = diff * diffuseColor;
vFragColor += ambientColor;
vec3 vReflection = normalize(reflect(-normalize(vVaryingLightDir),normalize(vVaryingNormal)));
float spec = max(0.0, dot(normalize(vVaryingNormal), vReflection));
if(diff != 0) {
float fSpec = pow(spec, 32.0);
vFragColor.rgb += vec3(fSpec, fSpec, fSpec);
}
}
这张来自维基百科的(公共领域)图像准确地显示了我得到的图像类型和我的目标——我得到的是“平面”图像,但我想要“Phong”图像。
任何帮助将不胜感激。谢谢!
编辑:如果有所作为,我使用的是 PyOpenGL 3.0.1 和 Python 2.6。
编辑2:
解决方案
原来问题出在我的几何学上。科斯是正确的。对于其他在 Blender 模型中遇到此问题的人,Kos 指出这样做可以解决问题Edit->Faces->Set Smooth
。我发现 Wings 3D “开箱即用”。