Buenash! Pues veréis, estoy haciendo un muro curvo, poniendo distintas normales para cada parte... y me dijeron que si no las normalizo peta... o se ve peor de lo que debería.

for (i = 0; i < 9; ++i) {
d3d_vertex_normal_texture(x-50, y-50, 0, cos(degtorad(i*11.25)), sin(degtorad(i*11.25)), 1, 4, 0);
d3d_vertex_normal_texture(x-50-550*cos(degtorad(i*11.25)), y-50-550*sin(degtorad(i*11.25)), 600, cos(degtorad(i*11.25)), sin(degtorad(i*11.25)), 1, i, 8);
}


Con ese código se dibuja un triángulo, si os fijáis tengo cos y sin en las normales.

La idea es que primero viene la normal 1,0,1 i al final 0,1,1, es decir, apuntar a la derecha, y abajo. Entremedio hay un cono de normales. Pero ninguna de ellas está normalizada... ¿esto afectará a la calidad? Veo que esto funciona, pero quizás no todo lo bien que podría funcionar... si fuera así, cómo hago para normalizarlas?

En el código hay unos errores, como este "++i", y falta un vértice para que se forme un triángulo, pero supongo que el código no es exactamente igual al que estás usando.

Si el modelo ya se ilumina en la forma que quieres, entonces puedes hacer que los vectores normales sean "unitarios" o "normalizados" dividiendo el mismo vector entre su módulo o longitud, en código:
[gml]
nx = cos(degtorad(i*11.25));
ny = sin(degtorad(i*11.25));
nz = 1;
modulo = point_distance_3d( 0,0,0, nx,ny,nz );
nx/=modulo;  ny/=modulo;  nz/=modulo;
d3d_vertex_normal_texture(x-50, y-50, 0, nx, ny, nz, 4, 0);
[/gml]

Matemática básica... gracias, me estaba haciendo un lío entre usar pitágoras (o aristóteles, ya no me sé ni el nombre) haciendo la raíz cuadrada de los cuadrados de las componentes y demás... estoy muy verde. Aunque creo que sí era eso, pero me faltaba el DIVIDIR entre el módulo, era la clave...

Y sí.. el code es ese, sí funciona :) no faltan triangulos. Y el ++i funciona en GMStudio, en las anteriores era i += 1.

Vale, lo he hecho... y el resultado es el mismo! En el caso de
d3d_vertex_normal_texture(x-50-100*cos(degtorad(i*11.25)), y-50-100*sin(degtorad(i*11.25)), 109, cos(degtorad(i*11.25))/sqrt(2), sin(degtorad(i*11.25))/sqrt(2), 1/sqrt(2), i/2.67, 1.35);

Tenemos nz=1, y nx+ny = 1 siempre, pues una es el seno y la otra el coseno. Entonces el módulo sería sqrt(2) (alternativa a tu point_distance), divido.. y no cambia. Quiere decir que d3d_vertex_normal_texture ya normaliza por él mismo? Sería algo... lógico para ahorrar trabajo, y genial