home *** CD-ROM | disk | FTP | other *** search
- //----------------------------------------------------------------------------------------------------------
- // Vertex-shader para simulaci≤n de superficies de agua. Reflexi≤n y refracci≤n por environment maping,
- // deformaci≤n de malla por combinaci≤n de funciones senoidales dependientes del tiempo y de las
- // coordenadas de textura de la malla --> inc altura = f(u,v,t), y textura adicional para la superficie del
- // agua con alfa blending para la integraci≤n de los bordes con el entorno
- //----------------------------------------------------------------------------------------------------------
- // Constantes especificadas por la aplicacion:
- // c0 --> Constantes ( 0.0, 6.283185, 0.5, 1.0)
- // |__c0.x -------> cero
- // |__c0.y -------> 2 * PI
- // |__c0.z -------> 0.5
- // |__c0.w -------> 1
- //
- // c1 - c3 --> Matriz transformaci≤n a mundo
- // c4 - c7 --> Matriz vista/proyecci≤n
- // c8 --> Posici≤n cßmara
- // |___c8.x ------> Posici≤n X de la cßmara
- // |___c8.y ------> Posici≤n Y de la cßmara
- // |___c8.z ------> Posici≤n Z de la cßmara
- // |___c8.w ------> (((((TIEMPO para las funciones de onda)))))
- //
- // c9 --> Variables 1
- // |___c9.x ------> Indice de refracci≤n relativo
- // |___c9.y ------> Indice de refracci≤n relativo ^ 2
- // |___c9.z ------> Profundidad (coordenada altura del fondo
- // |___c9.w ------> (((((Relaci≤n unidades geometrφa/textura))))
- //
- // c10 --> Variables 3
- // |__c10.x ------> Direcci≤n X onda 1
- // |__c10.y ------> Direcci≤n Y onda 1
- // |__c10.z ------> Amplitud onda 1
- // |__c10.w ------> Amplitud onda 2
- //
- // c11 --> Variables 4
- // |__c11.x ------> Direcci≤n X onda 2
- // |__c11.y ------> Direcci≤n Y onda 2
- // |__c11.z ------> Velocidad lineal onda 1
- // |__c11.w ------> Velocidad lineal onda 2
- //
- // c12 --> Constantes coeficientes del polinomio de Taylor del seno: O - (O^3)/3! + (O^5)/5! - (O^7)/7!
- // |__c12.x ------> 1 / 3! = 0.16666
- // |__c12.y ------> 1 / 5! = 0.00833333
- // |__c12.z ------> 1 / 7! = 0.0001984
- // |__c12.w ------> ((((Velocidad de la textura de la superficie del agua))))
- //
- // c13 --> Variables 5
- // |__c13.x ------> Longitud de onda 1
- // |__c13.y ------> Longitud de onda 2
- // |__c13.z ------> Velocidad textura de la superficie en 'u' (c12.w)
- // |__c13.w ------> Velocidad textura de la superficie en 'v' (c12.w)
- //
- // c14 --> Variables 6
- // |__c14.x ------> Relacion unidades geometria/textura en 'u' (c9.w)
- // |__c14.y ------> Relacion unidades geometria/textura en 'v' (c9.w)
- // |__c14.z ------> Coef A de la ecuaci≤n del factor de niebla (A-B*d) A = end / end-start
- // |__c14.w ------> Coef B de la ecuaci≤n del factor de niebla (A-B*d) B = 1 / end-start
- //
- // Vertex components (as specified in the vertex DECL):
- // v0 = Position (stream 0)
- // v1 = Normal (stream 0)
- // v2 = Texcoords (stream 0)
- //----------------------------------------------------------------------------------------------------------
- vs.1.1
-
- dcl_position v0
- dcl_normal v1
- dcl_texcoord v2
- dcl_color v3
-
- mov oD1, v3
-
- //------------------------------------------------------
- // - EFECTO DE ONDAS / TRANSFORMACION DEL PUNTO -
- //------------------------------------------------------
- mul r2.xy, v2.xy, c10.xy // Direccion onda 1 (x*dx, y*dy)
- mul r11.xy, v2.xy, c11.xy // Direccion onda 2
-
- add r2.x, r2.x, r2.y // (x*dx + y*dy) / L ,para onda 1
- add r2.y, r11.x, r11.y // (x*ux + y*uy) / L ,para onda 2
-
- // Versi≤n vieja ---------------------------------------------------------------------------------------<<<<
- //sub r3.xy, c8.ww, r2.xy // (t - (x*ux + y*uy) / v) --> tiempo
- //mul r2.xy, r3.xy, c11.zw // w * (t - (x*ux + y*uy) / v) --> Frecuencias de las ondas
- //frc r2.xy, r2.xy // Acotamos a (0, 1)
- //sub r2.xy, r2.xy, c0.zz // - 0.5 ---> (-0.5, 0.5)
- //mul r2.xy, r2.xy, c0.yy // * 2PI ---> (-PI, PI)
- // Versi≤n vieja --------------------------------------------------------------------------------------->>>>
-
- // Nueva versi≤n ---------------------------------------------------------------------------------------<<<<
- mov r3.xy, c8.ww
- mul r3.xy, r3.xy, c11.zw // v*t !!!!!!!!!!!!!!!!!!!!!Hay que hacerlo fuera
- add r2.xy, r3.xy, r2.xy // v*t + (x*ux + y*uy)
- mul r2.xy, r2.xy, c13.xy // (v*t + (x*ux + y*uy)) / L
-
- frc r2.xy, r2.xy // Acotamos a (0, 1)
- sub r2.xy, r2.xy, c0.zz // - 0.5 ---> (-0.5, 0.5)
- mul r2.xy, r2.xy, c0.yy // * 2PI ---> (-PI, PI)
- // Nueva versi≤n --------------------------------------------------------------------------------------->>>>
-
- //--------------------------------------------------------------------------
- // -- Polinomio de Taylor del seno en 0: O - (O^3)/3! + (O^5)/5! - (O^7)/7! -------------<<<<
- //--------------------------------------------------------------------------
- mul r3.xy, r2.xy, r2.xy // R3 = ang^2
- mul r4.xy, r3.xy, r2.xy // R4 = ang^3
- mul r5.xy, r4.xy, r2.xy // R5 = ang^4
- mul r6.xy, r5.xy, r2.xy // R6 = ang^5
- mul r7.xy, r6.xy, r2.xy // R7 = ang^6
- mul r8.xy, r7.xy, r2.xy // R8 = ang^7
-
- mad r2.xy, r4.xy, c12.xx, r2.xy
- mad r2.xy, r6.xy, c12.yy, r2.xy
- mad r2.xy, r8.xy, c12.zz, r2.xy
- //--------------------------------------------------------------------------------------->>>>
-
- mov r10, v0
- mad r10.y, r2.x, c10.z, r10.y // contribucion de la onda 1 (* amplitud) !!!Cambiar coordenada
- mad r10.y, r2.y, c10.w, r10.y // contribucion de la onda 2 (* amplitud)
-
- m4x3 r0, r10, c1 // Transformaci≤n de vΘrtice
- mov r0.w, c0.w
-
- m4x4 oPos, r0, c4 // Matriz de vista/proyecci≤n
-
- //------------------------------------------------------
- // - TRANSFORMACION NORMAL -
- //------------------------------------------------------
- m3x3 r1, v1, c1 // Transformaci≤n de la normal a mundo
-
- //add r1.x, r2.x, r1.x
-
- dp3 r1.w, r1.xyz, r1.xyz // Normalizaci≤n de la normal
- rsq r1.w, r1.w
- mul r1.xyz, r1.xyz, r1.www
-
- //------------------------------------------------------
- // - OBTENCION VECTOR DE INCIDENCIA -
- //------------------------------------------------------
- sub r3.xyz, r0.xyz, c8.xyz // r3 = Pos.punto - Pos.camara
- dp3 r3.w, r3.xyz, r3.xyz // Se normaliza para que el producto vectorial
- rsq r3.w, r3.w // sirva para mezclar reflexion y refracci≤n
- mul r3.xyz, r3.xyz, r3.www
-
- //--------------------------
- // - Calculo de la NIEBLA -
- //--------------------------
- rcp r3.w, r3.w // Obtenemos la distancia del punto a la cßmara para que sirva para calcular la niebla
- mul r3.w, -r3.w, c14.w // F = A - B*d A = (end / (end - start)) B = 1 / (end - start)
- add oFog, r3.w, c14.z
-
- //-------------------------------------------------------------
- // - PSEUDO-FACTOR DE FRESNELL (Mezcla reflexion/refraccion) -
- //-------------------------------------------------------------
- dp3 r4.w, r3.xyz, r1.xyz // Se utiliza el producto escalar de N.I negado
- mov oD0.w, -r4.w // Se manda por el canal alfa del color SPECULAR
- //mov oD1.xyz, c0.www
-
- //------------------------------------------------------
- // - CALCULO REFLEXION -
- //------------------------------------------------------
- add r5.w, r4.w, r4.w
- mad r6.xyz, r1.xyz, -r5.www, r3.xyz
- mov r6.w, c0.w
-
- // cambio de ejes
- mov r6.z, -r6.z
- mov r6.xy, r6.xz
-
- // Coordenadas para el esphere-map = proy{R}xy * 0.5 + 0.5
- mul r6.xy, r6.xy, c0.zz
- add r6.xy, r6.xy, c0.zz
- mov oT1.xy, r6.xy
-
- //-----------------------------------------------------------
- // - REFRACCION -
- //-----------------------------------------------------------
- // float IdotN = I.N
- // float k = 1 - eta*eta*(1 - IdotN*IdotN)
- // return k < 0 ? (0,0,0) : eta*I + (eta*IdotN + sqrt(k))*N
- //-----------------------------------------------------------
- dp3 r4.w, -r3.xyz, r1.xyz // r4.w = N.(-I)
- mad r10.x, -r4.w, r4.w, c0.w // r10.x = (-I.N)*(I.N) + 1
- mul r10.x, r10.x, c9.y // r10.x = (1 + (-I.N)*(I.N)) * eta^2
- sub r10.x, c0.w, r10.x // r10.x = 1 - eta^2 * (1 + (-I.N)*(I.N))
- rsq r2.x, r10.x
- rcp r2.x, r2.x // r2.x = sqrt(1 - eta^2 * (1 + (-I.N)*(I.N)))
- mad r2.x, c9.x, r4.w, -r2.x // r2.x = eta * (-I.N) + sqrt(1 - eta^2 * (1 + (-I.N)*(I.N)))
- mul r2.xyz, r1.xyz, r2.xxx // r2.xyz = N * (eta * (-I.N) + sqrt(1 - eta^2 * (1 + (-I.N)*(I.N))))
- mad r6.xyz, c9.xxx, r3.xyz, r2.xyz // r6.xyz = eta*I + (N * (eta * (-I.N) + sqrt(1 - eta^2 * (1 + (-I.N)*(I.N)))))
-
- // normalizacion
- dp3 r6.w, r6.xyz, r6.xyz
- rsq r6.w, r6.w
- mul r6.xyz, r6.xyz, r6.www
-
- //mov r6.xyz, r6.xzy
- //mov r6.z, -r6.z
-
- // Cßlculo coordenadas textura fondo (plane-mapping(TM))
- sub r7.w, c9.z, r0.y
- rcp r6.y, r6.y
- mul r7.w, r7.w, r6.y
- mul r6.xz, r6.xz, r7.ww
- mov r6.z, -r6.z
- mad r6.xy, r6.xz, c14.xy, v2.xy
-
- mov oT0.xy, r6.xy
-
- //------------------------------------------------------
- // - TEXTURA ADICIONAL (Con desplazamiento) -
- //------------------------------------------------------
- mov r0, v2
- mov r1.w, c8.w
- mad oT2.xy, c13.zw, r1.ww, r0.xy
-
-
-