Tengo un programa que genera un mapa de alturas y luego lo muestra como una malla con OpenGL. Cuando trato de agregar iluminación, termina con formas cuadradas extrañas que cubren la malla. Son más notables en algunas áreas que en otras, pero siempre están ahí.Extraños artefactos de iluminación cuadrada en OpenGL
Estaba usando una malla cuádruple, pero nada cambió después de cambiar a una malla triangular. He utilizado al menos tres métodos diferentes para calcular las normales de los vértices, todos con el mismo efecto. Estaba haciendo la iluminación manualmente con sombreadores, pero nada cambia cuando se usa el sistema de iluminación OpenGL incorporado.
Mi último código de generación de la normalidad (se enfrenta a una gran variedad de índices en verts, el conjunto de vértices):
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]);
}
A pesar de que no es el único código que he usado, así que dudo que es la causa del problema
trazo la malla con:
y no estoy usando actualmente cualquiera shaders.
¿Qué podría estar causando esto?
EDIT: Un conjunto más amplio de las capturas:
Para el último, el código de sombreado es
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();
}
Fragmento:
varying vec3 lightvec, normal;
void main(void) {
float l = dot(lightvec, normal);
gl_FragColor = vec4(l, l, l, 1);
}
¿Podría publicar dos capturas de pantalla de la misma escena, una con una estructura alámbrica y otra sin ella? –
¿'Normas' inicializa cero? Estás acumulando tus vectores en él sin ponerlo en cero primero, aunque si se pone a cero en otro lugar del programa, eso no debería ser un problema. – genpfault
¿está utilizando una interpolación uniforme para atributos normales en el sombreado? Quizás cambiar a 'plano 'por un momento podría ayudar a localizar el problema. Además, la iluminación OpenGL tiende a ser muy defectuosa para mí; por lo general, estoy más seguro del código que me escribí. –