home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
GameStar 2005 May
/
Gamestar_73_2005-05_dvd.iso
/
Dema
/
IMPERIAL_GLORY
/
data1.cab
/
NewComponent1
/
Data.pak
/
Engine
/
WaterSurfaceSimple.vsh
< prev
Wrap
Text File
|
2005-02-12
|
9KB
|
191 lines
//----------------------------------------------------------------------------------------------------------
// Vertex-shader para simulaci≤n de superficies de agua. 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_color0 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 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
//-----------------------------------------------------------
// - 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 oT1.xy, c13.zw, r1.ww, r0.xy
mov oD0, v3