Ich habe ein Programm, das eine Heightmap generiert und zeigt es dann als ein Netz mit OpenGL. Wenn ich versuche, Beleuchtung hinzuzufügen, endet es mit seltsamen quadratischen Formen, die das Netz abdecken. Sie sind in einigen Bereichen stärker als andere, sind aber immer da.Seltsame quadratische Beleuchtung Artefakte in OpenGL
Ich benutzte ein Quad-Mesh, aber nach dem Wechsel zu einem Dreiecksnetz änderte sich nichts. Ich habe mindestens drei verschiedene Methoden verwendet, um die Eckennormalen zu berechnen, alle mit demselben Effekt. Ich habe die Beleuchtung manuell mit Shadern gemacht, aber nichts ändert sich, wenn ich das integrierte OpenGL-Beleuchtungssystem verwende.
Mein letzter normale erzeugenden Code (Flächen ist ein Array von Indizes in verts, die Vertex-Array):
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]);
}
Obwohl das nicht der einzige Code, die ich verwendet habe, so dass ich bezweifle, dass es ist die Ursache des Problems.
Ich zeichne das Netz mit:
Und ich bin zur Zeit keine Shadern verwenden.
Was könnte das verursachen?
EDIT: Eine umfassende Reihe von Screenshots:
Für die letzte ist der Shader-Code
Vertex:
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();
}
Fragment:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
Könnten Sie zwei Screenshots derselben Szene posten, eine mit einem Drahtmodell und eine ohne? –
Werden 'Normen' initialisiert? Sie sammeln Ihre Vektoren hinein, ohne sie vorher auf Null zu setzen. Wenn sie jedoch an einer anderen Stelle im Programm auf Null gesetzt werden, sollte das kein Problem sein. – genpfault
verwenden Sie glatte Interpolation für normale Attribute im Shader? Vielleicht kann es ein bisschen "flat" werden, um das Problem zu lokalisieren. Auch OpenGL-Beleuchtung neigt dazu, für mich sehr fehlerhaft zu sein - ich bin normalerweise sicherer über den Code, den ich selbst geschrieben habe. –