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 / WaterSurface.vsh < prev    next >
Text File  |  2005-02-12  |  9KB  |  216 lines

  1. //----------------------------------------------------------------------------------------------------------
  2. // Vertex-shader para simulaci≤n de superficies de agua. Reflexi≤n y refracci≤n por environment maping,
  3. // deformaci≤n de malla por combinaci≤n de funciones senoidales dependientes del tiempo y de las
  4. // coordenadas de textura de la malla --> inc altura = f(u,v,t), y textura adicional para la superficie del
  5. // agua con alfa blending para la integraci≤n de los bordes con el entorno
  6. //----------------------------------------------------------------------------------------------------------
  7. // Constantes especificadas por la aplicacion:
  8. //    c0      --> Constantes ( 0.0, 6.283185, 0.5, 1.0)
  9. //    |__c0.x -------> cero
  10. //    |__c0.y -------> 2 * PI
  11. //    |__c0.z -------> 0.5
  12. //    |__c0.w -------> 1
  13. //
  14. //    c1 - c3 --> Matriz transformaci≤n a mundo
  15. //    c4 - c7 --> Matriz vista/proyecci≤n
  16. //    c8      --> Posici≤n cßmara
  17. //    |___c8.x ------> Posici≤n X de la cßmara 
  18. //    |___c8.y ------> Posici≤n Y de la cßmara 
  19. //    |___c8.z ------> Posici≤n Z de la cßmara 
  20. //    |___c8.w ------> (((((TIEMPO para las funciones de onda)))))
  21. //
  22. //    c9      --> Variables 1                      
  23. //    |___c9.x ------> Indice de refracci≤n relativo
  24. //    |___c9.y ------> Indice de refracci≤n relativo ^ 2
  25. //    |___c9.z ------> Profundidad (coordenada altura del fondo
  26. //    |___c9.w ------> (((((Relaci≤n unidades geometrφa/textura))))
  27. //    
  28. //    c10     --> Variables 3
  29. //    |__c10.x ------> Direcci≤n X onda 1
  30. //    |__c10.y ------> Direcci≤n Y onda 1
  31. //    |__c10.z ------> Amplitud onda 1
  32. //    |__c10.w ------> Amplitud onda 2
  33. //
  34. //    c11     --> Variables 4
  35. //    |__c11.x ------> Direcci≤n X onda 2
  36. //    |__c11.y ------> Direcci≤n Y onda 2
  37. //    |__c11.z ------> Velocidad lineal onda 1
  38. //    |__c11.w ------> Velocidad lineal onda 2
  39. //  
  40. //    c12     --> Constantes coeficientes del polinomio de Taylor del seno: O - (O^3)/3! + (O^5)/5! - (O^7)/7!
  41. //    |__c12.x ------> 1 / 3! = 0.16666
  42. //    |__c12.y ------> 1 / 5! = 0.00833333
  43. //    |__c12.z ------> 1 / 7! = 0.0001984
  44. //    |__c12.w ------> ((((Velocidad de la textura de la superficie del agua))))
  45. //
  46. //    c13     --> Variables 5
  47. //    |__c13.x ------> Longitud de onda 1
  48. //    |__c13.y ------> Longitud de onda 2
  49. //    |__c13.z ------> Velocidad textura de la superficie en 'u'    (c12.w)
  50. //    |__c13.w ------> Velocidad textura de la superficie en 'v'    (c12.w)
  51. //
  52. //    c14     --> Variables 6
  53. //    |__c14.x ------> Relacion unidades geometria/textura en 'u'   (c9.w)
  54. //    |__c14.y ------> Relacion unidades geometria/textura en 'v'   (c9.w)
  55. //    |__c14.z ------> Coef A de la ecuaci≤n del factor de niebla (A-B*d)  A = end / end-start
  56. //    |__c14.w ------> Coef B de la ecuaci≤n del factor de niebla (A-B*d)  B = 1 / end-start
  57. // 
  58. // Vertex components (as specified in the vertex DECL):
  59. //    v0    = Position   (stream 0)
  60. //    v1    = Normal     (stream 0)
  61. //    v2    = Texcoords  (stream 0)
  62. //----------------------------------------------------------------------------------------------------------
  63. vs.1.1
  64.  
  65. dcl_position v0
  66. dcl_normal   v1
  67. dcl_texcoord v2
  68. dcl_color    v3
  69.  
  70. mov oD1, v3
  71.  
  72. //------------------------------------------------------
  73. // - EFECTO DE ONDAS / TRANSFORMACION DEL PUNTO -
  74. //------------------------------------------------------ 
  75. mul r2.xy, v2.xy, c10.xy      // Direccion onda 1   (x*dx, y*dy)
  76. mul r11.xy, v2.xy, c11.xy     // Direccion onda 2
  77.  
  78. add r2.x, r2.x, r2.y          // (x*dx + y*dy) / L  ,para onda 1
  79. add r2.y, r11.x, r11.y        // (x*ux + y*uy) / L  ,para onda 2
  80.  
  81. // Versi≤n vieja ---------------------------------------------------------------------------------------<<<<
  82. //sub r3.xy, c8.ww, r2.xy       // (t - (x*ux + y*uy) / v)      --> tiempo
  83. //mul r2.xy, r3.xy, c11.zw      // w * (t - (x*ux + y*uy) / v)  --> Frecuencias de las ondas
  84. //frc r2.xy, r2.xy              // Acotamos a (0, 1)
  85. //sub r2.xy, r2.xy, c0.zz       // - 0.5 ---> (-0.5, 0.5)
  86. //mul r2.xy, r2.xy, c0.yy       // * 2PI ---> (-PI, PI)
  87. // Versi≤n vieja --------------------------------------------------------------------------------------->>>>
  88.  
  89. // Nueva versi≤n ---------------------------------------------------------------------------------------<<<<
  90. mov r3.xy, c8.ww
  91. mul r3.xy, r3.xy, c11.zw      // v*t  !!!!!!!!!!!!!!!!!!!!!Hay que hacerlo fuera
  92. add r2.xy, r3.xy, r2.xy       // v*t + (x*ux + y*uy)
  93. mul r2.xy, r2.xy, c13.xy      // (v*t + (x*ux + y*uy)) / L
  94.  
  95. frc r2.xy, r2.xy              // Acotamos a (0, 1)
  96. sub r2.xy, r2.xy, c0.zz       // - 0.5 ---> (-0.5, 0.5)
  97. mul r2.xy, r2.xy, c0.yy       // * 2PI ---> (-PI, PI)
  98. // Nueva versi≤n --------------------------------------------------------------------------------------->>>>
  99.  
  100. //--------------------------------------------------------------------------
  101. // -- Polinomio de Taylor del seno en 0: O - (O^3)/3! + (O^5)/5! - (O^7)/7! -------------<<<<
  102. //--------------------------------------------------------------------------
  103. mul r3.xy, r2.xy, r2.xy         // R3 = ang^2
  104. mul r4.xy, r3.xy, r2.xy         // R4 = ang^3 
  105. mul r5.xy, r4.xy, r2.xy         // R5 = ang^4 
  106. mul r6.xy, r5.xy, r2.xy         // R6 = ang^5
  107. mul r7.xy, r6.xy, r2.xy         // R7 = ang^6
  108. mul r8.xy, r7.xy, r2.xy         // R8 = ang^7
  109.  
  110. mad r2.xy, r4.xy, c12.xx, r2.xy
  111. mad r2.xy, r6.xy, c12.yy, r2.xy
  112. mad r2.xy, r8.xy, c12.zz, r2.xy
  113. //--------------------------------------------------------------------------------------->>>>
  114.  
  115. mov r10, v0
  116. mad r10.y, r2.x, c10.z, r10.y     // contribucion de la onda 1 (* amplitud)    !!!Cambiar coordenada
  117. mad r10.y, r2.y, c10.w, r10.y     // contribucion de la onda 2 (* amplitud)
  118.  
  119. m4x3 r0, r10, c1                  // Transformaci≤n de vΘrtice
  120. mov r0.w, c0.w
  121.  
  122. m4x4 oPos, r0, c4                 // Matriz de vista/proyecci≤n
  123.  
  124. //------------------------------------------------------
  125. // - TRANSFORMACION  NORMAL -
  126. //------------------------------------------------------
  127. m3x3 r1, v1, c1                  // Transformaci≤n de la normal a mundo
  128.  
  129. //add r1.x, r2.x, r1.x
  130.  
  131. dp3 r1.w, r1.xyz, r1.xyz         // Normalizaci≤n de la normal
  132. rsq r1.w, r1.w
  133. mul r1.xyz, r1.xyz, r1.www
  134.  
  135. //------------------------------------------------------
  136. // - OBTENCION VECTOR DE INCIDENCIA -
  137. //------------------------------------------------------
  138. sub r3.xyz, r0.xyz, c8.xyz       // r3 = Pos.punto - Pos.camara
  139. dp3 r3.w, r3.xyz, r3.xyz         // Se normaliza para que el producto vectorial 
  140. rsq r3.w, r3.w                   //   sirva para mezclar reflexion y refracci≤n
  141. mul r3.xyz, r3.xyz, r3.www
  142.  
  143. //--------------------------
  144. // - Calculo de la NIEBLA - 
  145. //--------------------------
  146. rcp r3.w, r3.w          // Obtenemos la distancia del punto a la cßmara para que sirva para calcular la niebla
  147. mul r3.w, -r3.w, c14.w  // F = A - B*d      A = (end / (end - start))       B = 1 / (end - start)
  148. add oFog, r3.w, c14.z
  149.  
  150. //-------------------------------------------------------------
  151. // - PSEUDO-FACTOR DE FRESNELL (Mezcla reflexion/refraccion) -
  152. //-------------------------------------------------------------
  153. dp3 r4.w, r3.xyz, r1.xyz         // Se utiliza el producto escalar de N.I negado
  154. mov oD0.w, -r4.w                 // Se manda por el canal alfa del color SPECULAR
  155. //mov oD1.xyz, c0.www
  156.  
  157. //------------------------------------------------------
  158. // - CALCULO REFLEXION -
  159. //------------------------------------------------------
  160. add r5.w, r4.w, r4.w
  161. mad r6.xyz, r1.xyz, -r5.www, r3.xyz
  162. mov r6.w, c0.w
  163.  
  164. // cambio de ejes
  165. mov r6.z, -r6.z
  166. mov r6.xy, r6.xz
  167.  
  168. // Coordenadas para el esphere-map = proy{R}xy * 0.5 + 0.5
  169. mul r6.xy, r6.xy, c0.zz
  170. add r6.xy, r6.xy, c0.zz
  171. mov oT1.xy, r6.xy
  172.  
  173. //-----------------------------------------------------------
  174. // - REFRACCION -
  175. //-----------------------------------------------------------
  176. // float IdotN = I.N
  177. // float k = 1 - eta*eta*(1 - IdotN*IdotN)
  178. // return k < 0 ? (0,0,0) : eta*I + (eta*IdotN + sqrt(k))*N
  179. //-----------------------------------------------------------
  180. dp3 r4.w, -r3.xyz, r1.xyz              // r4.w = N.(-I)
  181. mad r10.x, -r4.w, r4.w, c0.w           // r10.x = (-I.N)*(I.N) + 1
  182. mul r10.x, r10.x, c9.y                 // r10.x = (1 + (-I.N)*(I.N)) * eta^2
  183. sub r10.x, c0.w, r10.x                 // r10.x = 1 - eta^2 * (1 + (-I.N)*(I.N)) 
  184. rsq r2.x, r10.x
  185. rcp r2.x, r2.x                         // r2.x = sqrt(1 - eta^2 * (1 + (-I.N)*(I.N)))
  186. mad r2.x, c9.x, r4.w, -r2.x            // r2.x = eta * (-I.N) + sqrt(1 - eta^2 * (1 + (-I.N)*(I.N)))
  187. mul r2.xyz, r1.xyz, r2.xxx             // r2.xyz = N * (eta * (-I.N) + sqrt(1 - eta^2 * (1 + (-I.N)*(I.N))))
  188. 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)))))
  189.  
  190. // normalizacion
  191. dp3 r6.w, r6.xyz, r6.xyz
  192. rsq r6.w, r6.w
  193. mul r6.xyz, r6.xyz, r6.www
  194.  
  195. //mov r6.xyz, r6.xzy
  196. //mov r6.z, -r6.z
  197.  
  198. // Cßlculo coordenadas textura fondo (plane-mapping(TM))
  199. sub r7.w, c9.z, r0.y
  200. rcp r6.y, r6.y
  201. mul r7.w, r7.w, r6.y
  202. mul r6.xz, r6.xz, r7.ww
  203. mov r6.z, -r6.z
  204. mad r6.xy, r6.xz, c14.xy, v2.xy
  205.  
  206. mov oT0.xy, r6.xy
  207.  
  208. //------------------------------------------------------
  209. // - TEXTURA ADICIONAL (Con desplazamiento) -
  210. //------------------------------------------------------
  211. mov r0, v2
  212. mov r1.w, c8.w
  213. mad oT2.xy, c13.zw, r1.ww, r0.xy
  214.  
  215.  
  216.