En el ejemplo de Specular Bump que aparece en RenderMonkey, veo lo siguiente en el shader:
//**--------------------------------------------
//** Calculate the light vector in object space,
//** and then transform it into texture space.
//**--------------------------------------------
float3 temp_light_position = mul( inv_view_matrix, light_position );
float3 temp_light_vector = temp_light_position - vsInStruct.position;
vsOutStruct.light_vector.x = dot( temp_light_vector, vsInStruct.tangent );
vsOutStruct.light_vector.y = dot( temp_light_vector, vsInStruct.binormal );
vsOutStruct.light_vector.z = dot( temp_light_vector, vsInStruct.normal );
¿No debería convertir la luz en WORLD para poder compararla con la position del vértice que sí está en WORLD SPACE?
Es decir, no debería multiplicarla por WORLD matrix. Incluso en algunos sitios he visto que lo multiplican por la inversa de World. No lo puedo entender, porque estoy restando un vector en object space con otro en world space.
¿alguien puede explicármelo?
Yo creo que debe ser un error en el comentario, ¿no?.
Porque mirando el código, con:
float3 temp_light_position = mul( inv_view_matrix, light_position );
lo que se está haciendo es pasar la luz a world space.
Saludos.
Aunque pensándolo bien, no es un error de comentario ya que dice que calcula el vector luz en object space lo cual, tras la línea:
float3 temp_light_vector = temp_light_position - vsInStruct.position;
es correcto...
Saludos.
¿entonces? :huh:
¿inv_view_matrix=World Space?
Claro, la inversa de la matriz de vista es la matriz de mundo.
Saludos.
PD: o mejor dicho, si multiplicas un vector en view-space por la inversa de la matriz de vista, te da como resultado el vector en world-space.
Veamos:
Object Space -> Matriz World -> World Space
World Space -> Matriz View -> Camera Space
Camera Space -> Matriz Projection -> Clip Space
Entiendo que Camera Space=Object Space si World Space=Indentidad
¿es así la reflexión?
Sip..
Si te das cuenta, en el RenderMonkey no hay variables tipo WORLD_MATRIX, así que yo asumiría que la matriz de mundo es una matriz indentidad . Así pues, pasas directamente de object space a camera space
Una pregunta sobre ese mismo shader:
Resulta que estaba metiendo este shader en mi motor y veo que la luz difusa no quema el color base, es decir por mucho que se acerque a algo no lo ilumina más que a 1.0... ¿cómo se hace para que cuando la luz se acerque mucho a algo queme el color?? me explico?
El máximo de iluminación es 1. No hay nada que lave más blanco!! B)
Lo que tu dices se llama High Dynamic Range. Para eso se utiliza un render target de coma flotante y te permite superar ese 1.
Pues no se si me estaré equivocando...
Os acordais de una demo de sombras de ATI que salían esferas y baldosas rebotando en una habitación con shadow volumes?? Pues en esa demo la iluminación también es phong y a mi me da la impresión de que cuando se acercan mucho a las paredes quema el color.
¿Es eso o es el efecto del especular?
Lo que si está claro es que en mi opinión esas luces de aquella demo se ven distintas y más reales que la de este shader del Render Monkey, desde luego no tan bien como con HDR pero si mejor... :blink:
Efectivamente, más del 1.0 no se puede conseguir y me acabo de dar cuenta que en la demo da la sensación de quemado cuando se suman unas luces encima de otras, pero si pones una sóla luz en la escena no quema.