【发布时间】:2011-06-09 20:38:31
【问题描述】:
过去几周我一直在学习 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);
}
}
这张来自 Wikipedia 的(公共领域)图像准确地显示了我得到的图像类型以及我的目标——我得到的是“平面”图像,但我想要的是“Phong”图像。
任何帮助将不胜感激。谢谢!
编辑:如果有什么不同,我使用的是 PyOpenGL 3.0.1 和 Python 2.6。
编辑2:
解决方案
原来问题出在我的几何体上;科斯是正确的。对于其他遇到 Blender 模型问题的人,Kos 指出,Edit->Faces->Set Smooth 可以解决问题。我发现 Wings 3D “开箱即用”。
【问题讨论】:
-
同样的解决方案对我有用。非常感谢。
标签: opengl glsl shader pyopengl