home *** CD-ROM | disk | FTP | other *** search
/ GameStar 2005 February / Gamestar_70_2005-02_dvd.iso / DVDStar / Editace / ogierinstall_103.exe / XRShader_FP20_NDSEATP.fp < prev    next >
Text File  |  2004-12-21  |  11KB  |  322 lines

  1. !!ARBfp1.0
  2.  
  3. #/*»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»*\
  4. #    File:            Program for CXR_Shader::RenderShading_FP20
  5. #                    
  6. #    Author:            Magnus H÷gdahl
  7. #                    
  8. #    Copyright:        Starbreeze AB 2004
  9. #
  10. #    History:
  11. #
  12. #\*____________________________________________________________________________________________*/
  13.  
  14.  
  15. # LightIntensity = ((Diffuse.rgb + FresnelFactor * Specular.rgb) * SilkFactor + Transmission.rgb) * DistanceAttenuation * Projection
  16.  
  17. # Diffuse = DiffuseMap.rgb * DiffuseColor.rgb * Max(0, N*L)
  18.  
  19. # Specular = SpecularMap.rgb * SpecColor.rgb * (Max(0, H*N)^(SpecularMap.a * SpecColor.a) + Environment);
  20.  
  21. # Environment = EnvironmentMap.rgb * EnvColor.rgb * Max(0, N*L)
  22.  
  23. # Transmission = TransmissionMap.rgb * (TransmissionMap.a * Max(0, -N*L) + AttribMap.a * (1 - Abs(L*N - HSCenter))^HSExp )
  24.  
  25. # FresnelFactor = (1 - AttribMap.r) + AttribMap.r * (1 - H*V)^5
  26.  
  27. # SilkFactor = (1 - AttribMap.g) + AttribMap.g*(1 - V*N);
  28.  
  29. # Projection = DistanceAttenuation * ProjectionMap1.rgb + (1 - DistanceAttenuation) * ProjectionMap2.rgb
  30.  
  31. # DistanceAttenuation = (1 - |Ligr1os - PixelPos| / LightRange^2)^2
  32.  
  33. # N = Normal
  34. # L = Light vector
  35. # H = Half angle vector
  36. # V = Eye vector
  37.  
  38. #-----------------------------------------
  39. # Texture0 = Diffuse Map        // Default = 1,1,1,1
  40. # Texture1 = Specular Map        // Default = 1,1,1,1
  41. # Texture2 = Normal map            // Default = 1, 0.5, 0.5
  42. # Texture3 = Attribute Map        // r = Fresnel, g = Silkness, b = ?, a = ?, Default = 0,0,0,0
  43. # Texture4 = Transmission Diffuse Map    // Default = 0,0,0,0
  44. # Texture5 = Projection Map 1        // Default = 1,1,1
  45. # Texture6 = Projection Map 2        // Default = 1,1,1
  46. # Texture7 = Environment Map        // Default = 0,0,0
  47.  
  48. #-----------------------------------------
  49. # TexCoord0 = Mapping tex coord
  50. # TexCoord1 = Animated model space pixel position
  51. # TexCoord2 = Interpolated tangent space light vector (IPTSLV)
  52. # TexCoord3 = Interpolated tangent space eye vector (IPTSEV)
  53. # TexCoord4 = ProjMap tex coord
  54. # TexCoord5 = Tangentspace-2-world transform, row 0
  55. # TexCoord6 = Tangentspace-2-world transform, row 1
  56. # TexCoord7 = Tangentspace-2-world transform, row 2
  57.  
  58. #-----------------------------------------
  59.  
  60. OUTPUT oCol = result.color;
  61.  
  62. ATTRIB vCol = fragment.color;
  63.  
  64. ATTRIB MappingTexCoord = fragment.texcoord[0];
  65. ATTRIB PixelPosition = fragment.texcoord[1];
  66. ATTRIB IPTSLV = fragment.texcoord[2];
  67. ATTRIB IPTSEV = fragment.texcoord[3];
  68. ATTRIB ProjMapTexCoord = fragment.texcoord[4];
  69. ATTRIB TS2W_Mat_0 = fragment.texcoord[5];
  70. ATTRIB TS2W_Mat_1 = fragment.texcoord[6];
  71. ATTRIB TS2W_Mat_2 = fragment.texcoord[7];
  72.  
  73. PARAM Ligr1osition = program.env[0];    # { X, Y, Z, 0 }
  74. PARAM LightRange = program.env[1];    # { 1.0 / Range, Range, 1.0 / Range^2, Range^2 }
  75. PARAM LightColor = program.env[2];    # { R, G, B, 0 } (0-2 range)
  76. PARAM SpecColor = program.env[3];    # { R, G, B, SpecPower } (0-2 range)
  77. PARAM AttribScale = program.env[4];
  78. PARAM EnvMapColor = program.env[5];
  79.  
  80. PARAM const_val = { 0.5, 1.0, 2.0, 4.0 };
  81. PARAM const_val2 = { 0, 0.25, 4, 0 };
  82.  
  83. TEMP DiffuseTexel;
  84. TEMP SpecularTexel;
  85. TEMP ProjMapTexel1;
  86. TEMP ProjMapTexel2;
  87. TEMP NormalMapTexel;
  88. TEMP AttribTexel;
  89. TEMP TransmissionTexel;
  90. TEMP EnvMapTexel;
  91. TEMP TSLV;        # Tangent space light vector
  92. TEMP TSEV;        # Tangent space eye vector
  93. TEMP H;
  94. TEMP HT;        # Half angle vector projected onto tangent plane
  95. TEMP R;
  96. TEMP r0;
  97. TEMP r1;
  98. TEMP m;
  99. TEMP Attenuation;
  100. TEMP F;
  101. TEMP u;    # u = H * TSEV
  102. TEMP t;    # t = H * N
  103. TEMP v; # v = TSEV * N
  104. TEMP v_nosat;
  105. TEMP l; # l = TSLV * N
  106. TEMP lt;
  107. TEMP w;
  108. TEMP Result;
  109.  
  110. #-----------------------------------------
  111. # Fetch Textures
  112. TEX DiffuseTexel, MappingTexCoord, texture[0], 2D;    # Sample diffusemap
  113. TEX SpecularTexel, MappingTexCoord, texture[1], 2D;    # Sample diffusemap
  114. TEX NormalMapTexel, MappingTexCoord, texture[2], 2D;    # Sample normalmap
  115. TEX AttribTexel, MappingTexCoord, texture[3], 2D;
  116. TEX TransmissionTexel, MappingTexCoord, texture[4], 2D;
  117. TEX ProjMapTexel1, ProjMapTexCoord, texture[5], CUBE;
  118. TEX ProjMapTexel2, ProjMapTexCoord, texture[6], CUBE;
  119.  
  120. #TEX TSLV, IPTSLV, texture[3], CUBE;            # Normalize TSLV
  121. #TEX TSEV, IPTSEV, texture[3], CUBE;            # Normalize TSLV
  122. #MAD TSLV.rgb, TSLV, const_val.b, -const_val.g;# Bias and scale the normalmap texel (only rgb) (from 0->1, -1->1)
  123. #MAD TSEV.rgb, TSEV, const_val.b, -const_val.g;# Bias and scale the normalmap texel (only rgb) (from 0->1, -1->1)
  124.  
  125. #MAD NormalMapTexel.rgb, NormalMapTexel, const_val.b, -const_val.g;# Bias and scale the normalmap texel (only rgb) (from 0->1, -1->1)
  126. #TEX NormalMapTexel.rgb, NormalMapTexel, texture[3], CUBE;            # Normalize normal
  127. #MAD NormalMapTexel.rgb, NormalMapTexel, const_val.b, -const_val.g;# Bias and scale the normalmap texel (only rgb) (from 0->1, -1->1)
  128.  
  129. MUL AttribTexel.rgba, AttribTexel, AttribScale;
  130.  
  131. #-----------------------------------------
  132. # Attenuation
  133. SUB r1, Ligr1osition, PixelPosition;
  134. DP3 r1.w, r1, r1;
  135. #DP3 r1.w, IPTSLV, IPTSLV;
  136. MUL_SAT r1.w, r1.w, LightRange.z;
  137. ADD r1.w, const_val.g, -r1.w;
  138. MUL Attenuation.w, r1.w, r1.w;
  139.  
  140. #-----------------------------------------
  141. # Normalize normal
  142. MAD NormalMapTexel.rgb, NormalMapTexel, const_val.b, -const_val.g;# Bias and scale the normalmap texel (only rgb) (from 0->1, -1->1)
  143. DP3 r0.a, NormalMapTexel, NormalMapTexel;
  144. RSQ r0.a, r0.a;
  145. MUL NormalMapTexel.rgb, NormalMapTexel, r0.a;
  146.  
  147. #-----------------------------------------
  148. # Normalize TSLV
  149. DP3 TSLV.a, IPTSLV, IPTSLV;
  150. RSQ TSLV.a, TSLV.a;
  151. MUL TSLV.xyz, IPTSLV, TSLV.a;
  152.  
  153. #-----------------------------------------
  154. # Normalize TSEV
  155. DP3 TSEV.a, IPTSEV, IPTSEV;
  156. RSQ TSEV.a, TSEV.a;
  157. MUL TSEV.xyz, IPTSEV, TSEV.a;
  158.  
  159. #-----------------------------------------
  160. # Calc halfangle vector
  161. ADD H.xyz, TSEV, TSLV;
  162. DP3 H.a, H, H;
  163. RSQ H.a, H.a;
  164. MUL H.xyz, H, H.a;
  165.  
  166. #-----------------------------------------
  167. # Normalize anisotropic direction (yes this is necessary)
  168. MAD TransmissionTexel.rgb, TransmissionTexel, 2, -1;
  169. DP3 TransmissionTexel.a, TransmissionTexel, TransmissionTexel;
  170. RSQ TransmissionTexel.a, TransmissionTexel.a;
  171. MUL TransmissionTexel.xyz, TransmissionTexel, TransmissionTexel.a;
  172.  
  173. DP3_SAT l.a, TSLV, NormalMapTexel;
  174. #-----------------------------------------
  175. # Create a plane = H x A
  176. XPD r1.xyz, H, TransmissionTexel;
  177. DP3 r1.a, r1, r1;
  178. RSQ r1.a, r1.a;
  179. MUL r1.xyz, r1, r1.a;
  180.  
  181. # Project normal onto plane
  182. DP3 r0.a, r1, NormalMapTexel;
  183. MAD r0.xyz, -r0.a, r1, NormalMapTexel;
  184.  
  185. # New normal is lerped between original normal and projected normal depending on desired anisotrophy
  186. ADD r0.a, 1, -l.a;
  187. MUL r0.a, r0.a, r0.a;
  188. MUL r0.a, r0.a, r0.a;
  189. ADD r0.a, 1, -r0.a;
  190. MUL r0.a, 0.8, r0.a;
  191. LRP NormalMapTexel, r0.a, r0, NormalMapTexel;
  192. DP3 r0.a, NormalMapTexel, NormalMapTexel;
  193. RSQ r0.a, r0.a;
  194. MUL NormalMapTexel.rgb, NormalMapTexel, r0.a;
  195.  
  196. #-----------------------------------------
  197. DP3_SAT u.a, H, TSEV;
  198. DP3_SAT t.a, H, NormalMapTexel;
  199. DP3 v_nosat.a, TSEV, NormalMapTexel;
  200. DP3_SAT lt.a, TSLV, -NormalMapTexel;
  201. MOV_SAT v.a, v_nosat.a;
  202.  
  203. #-----------------------------------------
  204. # Calc reflection vector
  205. ADD r0.a, v_nosat.a, v_nosat.a;
  206. MAD R.xyz, NormalMapTexel, r0.a, -TSEV;
  207.  
  208. #-----------------------------------------
  209. # Calc HT
  210. MOV HT.gb, H;
  211. MOV HT.r, 0;
  212. DP3 HT.a, HT, HT;
  213. RSQ HT.a, HT.a;
  214. MUL HT.xyz, HT, HT.a;
  215.  
  216. #-----------------------------------------
  217. # Calc w, cosine of angle between eye vector and anisotropic direction
  218. DP3 w.a, HT, TransmissionTexel;
  219. #DP3 w.a, HT, { 1, 0, 0 };
  220.  
  221. #-----------------------------------------
  222. # Environment mapping
  223. DP3 r0.r, R, TS2W_Mat_0;            # Transform reflection vector to world space
  224. DP3 r0.g, R, TS2W_Mat_1;
  225. DP3 r0.b, R, TS2W_Mat_2;
  226. TEX EnvMapTexel, r0, texture[7], CUBE;
  227.  
  228. #-----------------------------------------
  229. # Self shadowing
  230. SUB r0.a, const_val2.y, -TSLV.x;
  231. MUL_SAT Attenuation.r, r0.a, const_val2.z;
  232.  
  233. #-----------------------------------------
  234. # Fresnel
  235. # MOV AttribTexel.r, 0.0;
  236.  
  237. SUB_SAT r0.a, 1, u.a;
  238. MUL r0.r, r0.a, r0.a;
  239. #MUL r0.r, r0.r, r0.r;
  240. #MUL r0.a, r0.r, r0.a;
  241. LRP F.a, AttribTexel.r, r0.r, 1;
  242.  
  243. #-----------------------------------------
  244. # Silkness factor
  245. SUB r0.a, 1, v.a;
  246. LRP r0.a, AttribTexel.g, r0.a, 1;
  247. MUL Attenuation.r, Attenuation.r, r0.a;
  248.  
  249. #-----------------------------------------
  250. # Diffuse
  251. MUL r1.rgb, LightColor, DiffuseTexel;        # Multiply diffusemap with light color
  252. MUL r1.rgb, r1, const_val.b;            # Scale by 2 for correct brightness
  253. MUL Result.rgb, l.a, r1;                # Diffuse color * Diffuse dotprod
  254.  
  255. #-----------------------------------------
  256. # Anisotropic specular
  257. # D = 1 / (mn(p - pt^2 + t^2)^2) = 1 / (mn(p + (1-p)*t^2)^2)
  258. # p = w^2/m^2 + (1-w^2)/n^2
  259.  
  260. MUL m, SpecularTexel.a, 0.25;
  261. MOV m, 0.05;
  262. MUL m.g, m.r, 0.2;
  263.  
  264. MUL r0.rg, m, m;        # r0.rg = { m^2, n^2 }
  265. RCP r0.r, r0.r;            # r0.r = 1/m^2
  266. RCP r0.g, r0.g;            # r0.g = 1/n^2
  267. MUL r1.r, w.a, w.a;
  268. LRP r0.g, r1.r, r0.r, r0.g;     # r0.g = p = w^2/m^2 + (1-w^2)/n^2
  269.  
  270. MUL r0.a, t.a, t.a;
  271. LRP r0.a, r0.g, 1, r0.a;    # r0.a = (p + (1-p)*t^2)
  272. MUL r0.a, r0.a, r0.a;
  273. MUL r0.r, m.g, m.r;
  274. MUL r0.a, r0.a, r0.r;
  275. RCP r1.a, r0.a;            # 1 / (mn*(p + (1-p)*t^2)^2)
  276. MUL r1.a, r1.a, 0.125;
  277.  
  278. #-----------------------------------------
  279. # Anisotropic specular v2
  280. MOV m, 1048;
  281. MUL m.g, m.r, 0.02;
  282. MUL r1.r, w.a, w.a;
  283. LRP r1.r, r1.r, m.r, m.g;     # r0.g = p = w^2/m^2 + (1-w^2)/n^2
  284. #POW r1.a, t.a, r1.r;
  285.  
  286. #-----------------------------------------
  287. # Specular + EnvMap
  288. #MUL SpecularTexel.a, SpecularTexel.a, SpecColor.a;
  289. MOV SpecularTexel.a, 512;
  290. POW r1.a, t.a, SpecularTexel.a;
  291. MAD r1.rgb, EnvMapTexel, EnvMapColor, r1.a;
  292. MUL r1.rgb, r1, F.a;                # Mul specular with fresnel factor
  293. #MUL r1.rgb, r1, DiffuseTexel;            # Mul specular with specular map
  294. MUL r1.rgb, r1, SpecularTexel;            # Mul specular with specular map
  295. MAD Result.rgb, SpecColor, r1, Result;            # Mul specular with specular color, add to final fragment
  296.  
  297. #-----------------------------------------
  298. MUL Result.rgb, Result, Attenuation.r;            # Multiply final fragment by geometric attenuation and silkness
  299.  
  300. #-----------------------------------------
  301. # Transmitted light
  302. # MAD Result.rgb, lt.a, TransmissionTexel, Result;
  303.  
  304. #-----------------------------------------
  305. MUL Result.rgb, Result, Attenuation.w;            # Multiply final fragment by distance attenuation
  306.  
  307. #-----------------------------------------
  308. # Projection map
  309. #LRP ProjMapTexel1.rgb, Attenuation.w, ProjMapTexel1, ProjMapTexel2;
  310. MUL Result.rgb, Result, ProjMapTexel1;            # Multiply final fragment by projmap
  311.  
  312. # Alpha from diffuse texture
  313. MOV Result.a, DiffuseTexel.a;
  314. #MUL Result.r, w.a, 0.5;
  315.  
  316. #MOV r0.rgb, l.a;
  317. #MUL r0.rgb, 0.25, t.a;
  318.  
  319. # Write result
  320. MOV oCol, Result;
  321. END
  322.