私はここ数週間 OpenGL を学んでおり、Phong シェーダーの実装で問題が発生しました。smooth
修飾子を使用しているにもかかわらず、頂点間の補間を行わないようです。ここで何か不足していますか?当然のことながら、頂点シェーダーとフラグメント シェーダーのコードは、OpenGL SuperBible Fifth Edition から大幅に引用されています。この本を強くお勧めします!
頂点シェーダー:
#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);
}
}
ウィキペディアのこの (パブリック ドメイン) 画像は、取得している画像の種類と目的を正確に示しています。「フラット」画像を取得していますが、「フォン」画像が必要です。
どんな助けでも大歓迎です。ありがとうございました!
編集:違いがある場合は、PyOpenGL 3.0.1 と Python 2.6 を使用しています。
編集2:
解決
問題は私のジオメトリにあることがわかりました。コスは正しかった。Blender モデルでこの問題を抱えている他の人のために、Kos はそうすることがうまくいくと指摘しましたEdit->Faces->Set Smooth
。Wings 3D は「箱から出してすぐに」動作することがわかりました。