ハイトマップを生成し、それをOpenGLでメッシュとして表示するプログラムがあります。照明を追加しようとすると、メッシュを覆う奇妙な正方形になってしまいます。それらは他の領域よりもいくつかの領域でより目立ちますが、常にそこにあります。
クワッドメッシュを使用していましたが、トライアングルメッシュに切り替えても何も変わりませんでした。頂点法線を計算するために少なくとも3つの異なる方法を使用しましたが、すべて同じ効果があります。シェーダーを使用して手動で照明を行っていましたが、組み込みのOpenGL照明システムを使用しても何も変わりません。
私の最新の通常生成コード(facesは頂点へのインデックスの配列、頂点配列です):
int i;
for (i = 0; i < NINDEX; i += 3) {
vec v[3];
v[0] = verts[faces[i + 0]];
v[1] = verts[faces[i + 1]];
v[2] = verts[faces[i + 2]];
vec v1 = vec_sub(v[1], v[0]);
vec v2 = vec_sub(v[2], v[0]);
vec n = vec_norm(vec_cross(v2, v1));
norms[faces[i + 0]] = vec_add(norms[faces[i + 0]], n);
norms[faces[i + 1]] = vec_add(norms[faces[i + 1]], n);
norms[faces[i + 2]] = vec_add(norms[faces[i + 2]], n);
}
for (i = 0; i < NVERTS; i++) {
norms[i] = vec_norm(norms[i]);
}
私が使ったコードはそれだけではありませんが、それが問題の原因ではないかと思います。
メッシュを描画します:
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, verts);
glEnableClientState(GL_NORMAL_ARRAY);
glNormalPointer(GL_FLOAT, 0, norms);
glDrawElements(GL_TRIANGLES, NINDEX, GL_UNSIGNED_SHORT, faces);
そして、私は現在シェーダーを使用していません。
これを引き起こしている可能性がありますか?
編集:スクリーンショットのより包括的なセット:
最後の1つについては、シェーダーコードは
バーテックス:
varying vec3 lightvec, normal;
void main() {
vec3 lightpos = vec3(0, 0, 100);
vec3 v = vec3(gl_ModelViewMatrix * gl_Vertex);
normal = gl_NormalMatrix * gl_Normal;
lightvec = normalize(lightpos - v);
gl_Position = ftransform();
}
断片:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}