Mmm, creo que más o menos todos teneis razón. Yo tampoco estoy muy relacionado con este sdk, pero todo apunta a que se tiene que parecer al sdk de sony (supongo, yo no lo sé
) si realmente utiliza el motor gráfico de hardware que tiene la consola.
Os recomiendo que hagais una documentación con el doxygen a partir de vuestros ficheros .h de sdk/include. Yo le he echado un vistazo a estos y he sacado algunas conclusiones.
El primer parámetro de
sceGuLight y de
sceGuLightColor es el id de la luz. Tendrian que haber 4 por tanto de 0 a 3.
En cuanto a los tipos de luces hay 3. Direccional, puntual y spot: (GU_DIRECTIONAL, GU_POINTLIGHT y GU_SPOTLIGHT).
1) En el caso de usar un luz direccional el vector indica la dirección de la luz. Si no entiendes el concepto mirate algún tuto de la red sobre tipos de luces. Pero el tema es que para una luz direccional solo necesitas un vector de dirección (por ejemplo un sol).
2) En el caso de luz puntual y en el de spot el vector indica la posición de la luz.
3) Para el caso concreto de spot necesitamos su dirección (ya tenemos la posición), pues entonces utilizamos la función:
sceGuLightSpot(int light, const ScePspFVector3* direction, float exponent, float cutoff)
el primer parámetro, como siempre, es el id; el segundo la dirección, el tercero un coeficiente que bloquea la luz cuando se cumple una propiedad con un producto puntual de los vectores y blah, blah (o sea que limita el alcance del efecto spot, la formula es un poco compleja), y por ultimo tenemos el grado de corte en radianes del spot.
Lo cual nos deja practicamente igual, ya que realizar un spot (si era lo que querias decir con luz direccional) no es trivial, y quizás un poco complejo matematicamente. Mi recomendación es que hagas algunas pruebas, ya que en este caso puntual (spot, perdón
) no te puedo echar una mano (aunque lo más complejo que veo es el factor de corte o 2o parámetro para los amigos). A mi no me suena ver demasiados ejemplos con luces spot, probaré a hacer alguno cuando saque un poco más de tiempo libre y si quiere te posteo mis conclusiones o mis códigos directamente para que puedas seguir con ello.
Además de esto también tenemos la atenuación
sceGuLightAtt(int light, float atten0, float atten1, float atten2)
con valores constante (siempre se atenua por muy cerca del punto de iluminación que esté) y linear y cuadrática (influye la distancia). Si suponemos un distancia
d tendriamos el siguiente resultado
atenuación_final = (atten0 + atten1 * d + atten2 *d^2), donde
d^2 significa distancia al cuadrado.
sceGuLightColor puede cambiar el componente ambiente, difuso, especular o dos a la vez dependiendo de lo que pongas en su segundo parámetro(GU_AMBIENT, GU_DIFFUSE, GU_SPECULAR, GU_AMBIENT_AND_DIFFUSE, GU_DIFFUSE_AND_SPECULAR).
En cuanto a
sceGuLight tienes como 2o parámetro el tipo de luz que puede ser GU_AMBIENT_AND_DIFFUSE, GU_DIFFUSE_AND_SPECULAR o GU_UNKNOWN_LIGHT_COMPONENT, y este último me suena una especie de luz diffusa especial con la que podrias probar a experimentar si quieres
Pues eso, espero ser de alguna ayuda, por lo menos ami me ha servio para repasar un poco, a ver si cojo tiempo y comienzo a portar mi cutre-motor a psp
Un saludo