home *** CD-ROM | disk | FTP | other *** search
- //------------------------------------------------------------------------------------------
- // Vertex shader para superficies oceßnicas
- //------------------------------------------------------------------------------------------
- // Constantes:
- // c0 - c3: Matriz mundo/vista/proyecci≤n
- // (*) CV_WORLDVIEWPROJ_0 0
- // (*) CV_WORLDVIEWPROJ_1 1
- // (*) CV_WORLDVIEWPROJ_2 2
- // (*) CV_WORLDVIEWPROJ_3 3
- //
- // c4: Punto de vista
- // (*) CV_VIEWERPOS 4
- //
- // c5: Constantes de usos multiples
- // (*) CV_CONSTANTS 5
- //
- // c10: Escala de bump UV
- // |__c10.x: para la u
- // |__c10.y: para la V
- // (*) CV_BUMP_UV_SCALE 10
- //
- // c11: Escala de la malla XYZ (vector --> para cada coordenada)
- // (*) CV_MESH_XYZ_SCALE 11
- //
- // c12: Offset para tilear la malla oceßnica (vector)
- // (*) CV_MESH_XYZ_OFFSET 12
- //
- // c13: Factor de curvatura
- // |__c13.x: factor
- // (*) CV_CURVATURE 13
- //
- // c14: Factor para aproximar el efecto fresnel
- // |__c14.x: factor
- // (*) CV_FRESNELAPPROX_POWFACTOR 14
- //
- // c15:
- // |__c15.x: Factor de rango dinßmico para el environment map (com·n)
- // |__c15.y: Factor de rango dinßmico para el environment map (especular)
- // | (*) CV_DYNAMIC_RANGE 15
- // |__c15.z: Coef A de la ecuaci≤n del factor de niebla (A-B*d) A = end / end-start
- // |__c15.w: Coef B de la ecuaci≤n del factor de niebla (A-B*d) B = 1 / end-start
- //-----------------------------------------------------------------------
- // Componentes del vΘrtice:
- // v0: Posicion (*) srcV v0
- // v1: Normal (*) srcN v1
- // v2: Coords. tex (*) srcTex v2
- //-----------------------------------------------------------------------
- // Registros:
- // r0: (*) V
- // r1: (*) E
- // r2: (*) S
- // r3: (*) SxT
- // r4: (*) T
- // r10: (*) Temp
- // r11: (*) Temp1
- //-----------------------------------------------------------------------
-
- vs.1.1
-
- dcl_position v0
- dcl_normal v1
- dcl_texcoord v2
-
- //----------------------------------------------
- // Escalado y offset de la posici≤n del vΘrtice
- //----------------------------------------------
- //mov r0, v0
- mul r0, v0, c11
- add r0, r0, c12
-
- //----------------------------
- // Aplicar grado de curvatura
- //----------------------------
- //add r10, r0, -c4
- //mul r10, r10, c5.zxz
- //dp3 r10, r10, r10
- //mad r0.y, -r10.x, c13.x, r0.y
-
- //---------------------------------------------------------------------
- // Genera triedro tangente. Construye la matriz de reflexi≤n por pixel
- // SxT: Normal (r3)
- // S: Tangente 1 (r2)
- // T: Tangente 2 (r4)
- //---------------------------------------------------------------------
-
- // Normalizaci≤n de la normal --> SxT
- dp3 r3.w, v1, v1
- rsq r3.w, r3.w
- mul r3, v1, r3.w
-
- // r2=(1,0,0)
- mov r2, c5.zxx
-
- // Prod vectorial --> T
- mul r4, r3.zxyw, r2.yzxw
- mad r4, r3.yzxw, r2.zxyw, -r4
-
- // Normalizaci≤n de T
- dp3 r4.w, r4, r4
- rsq r4.w, r4.w
- mul r4, r4, r4.w
-
- // Prod vectorial --> S
- mul r2, r4.zxyw, r3.yzxw
- mad r2, r4.yzxw, r3.zxyw, -r2
-
- // Normalizaci≤n de S
- dp3 r2.w, r2, r2
- rsq r2.w, r2.w
- mul r2, r2, r2.w
-
- // Con el triedro construimos la matriz de reflexi≤n por pixel
- mov oT1.xyz, r2
- mov oT2.xyz, r3
- mov oT3.xyz, r4
-
- // Se calcula el vector al punto de vista y se pasa a la matriz de reflexion por pixel
- add oT1.w, c4.x, -r0.x
- add oT2.w, c4.y, -r0.y
- add oT3.w, c4.z, -r0.z
-
- //---------------------------------------------------------
- // Escalado de las coordenadas de textura para el bump map
- //---------------------------------------------------------
- mul oT0.xy, v2.xy, c10.xy
-
- //--------------------------------------------------
- // Calculo del vector al punto de vista normalizado
- //--------------------------------------------------
- add r1, c4, -r0
- dp3 r1.w, r1, r1
- rsq r1.w, r1.w
- mul r1.xyz, r1.xyz, r1.www
-
- //--------------------------
- // - Calculo de la NIEBLA -
- //--------------------------
- rcp r6.w, r1.w // Obtenemos la distancia del punto a la cßmara para que sirva para calcular la niebla
- mul r6.w, -r6.w, c15.w // F = A - B*d A = (end / (end - start)) B = 1 / (end - start)
- add oFog, r6.w, c15.z
- //mov oFog, c5.z
-
- //------------------------------------------------
- // Calculo del termino de Fresnel aproximado
- // 1
- // F = ---------------------------
- // ( 1 + E.N ) ^ Fresnel_Power_Factor(c14.x)
- //------------------------------------------------
- dp3 r10, r1, r3
- add r10, c5.z, r10
- mov r10.y, c14.x
- lit r10.z, r10.xxyy
- rcp r10.z, r10.z
- mul r10.z, r10.z, c15.x
-
- // setup dynamic range fresnel term
- expp r11.y, r10.z
- mov oD0.w, r11.y
-
- add r10.z, r10.z, -r11.y
- mul oD1.w, r10.z, c15.y
-
- // setup lerp factor for ocean color
- dp3 oD0.xyz, r1, r3
-
- // vertex to screen
- dp4 oPos.x, r0, c0
- dp4 oPos.y, r0, c1
- dp4 oPos.z, r0, c2
- dp4 oPos.w, r0, c3
-