light_dsgoh.shader
上传用户:qccn516
上传日期:2013-05-02
资源大小:3382k
文件大小:6k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* light shader (diffuse, specular, gloss, offset, horizon)
  2.  * defines: VERTEX, NV3X, TEYLOR, OFFSET, HORIZON
  3.  *
  4.  * written by Alexander Zaprjagaev
  5.  * frustum@frustum.org
  6.  * http://frustum.org
  7.  */
  8. #ifdef VERTEX
  9. /*****************************************************************************/
  10. /*                                                                           */
  11. /* simple vertex lighting                                                    */
  12. /*                                                                           */
  13. /*****************************************************************************/
  14. <vertex_local0> ilight
  15. <vertex_local1> light_color
  16. <vertex>
  17. !!ARBvp1.0
  18. ATTRIB xyz = vertex.attrib[0];
  19. ATTRIB normal = vertex.attrib[1];
  20. ATTRIB st = vertex.attrib[4];
  21. PARAM mvp[4] = { state.matrix.mvp };
  22. PARAM light = program.local[0];
  23. PARAM light_color = program.local[1];
  24. DP4 result.position.x, mvp[0], xyz;
  25. DP4 result.position.y, mvp[1], xyz;
  26. DP4 result.position.z, mvp[2], xyz;
  27. DP4 result.position.w, mvp[3], xyz;
  28. MOV result.texcoord[0], st;
  29. TEMP dir, color;
  30. SUB dir, light, xyz;
  31. DP3 dir.w, dir, dir;
  32. MAD color.w, dir.w, -light.w, 1.0;
  33. MAX color.w, color.w, 0.0;
  34. RSQ dir.w, dir.w;
  35. MUL dir, dir, dir.w;
  36. DP3 color.xyz, dir, normal;
  37. MUL color, color, color.w;
  38. MUL result.color, color, light_color;
  39. END
  40. <fragment>
  41. !!ARBtec1.0
  42. modulate texture primary
  43. END
  44. #else
  45. /*****************************************************************************/
  46. /*                                                                           */
  47. /* perpixel lighting                                                         */
  48. /*                                                                           */
  49. /*****************************************************************************/
  50. <vertex_local0> icamera
  51. <vertex_local1> ilight
  52. <vertex_local2> light_color
  53. /*
  54.  */
  55. <vertex>
  56. !!ARBvp1.0
  57. ATTRIB xyz = vertex.attrib[0];
  58. ATTRIB normal = vertex.attrib[1];
  59. ATTRIB tangent = vertex.attrib[2];
  60. ATTRIB binormal = vertex.attrib[3];
  61. ATTRIB st = vertex.attrib[4];
  62. PARAM mvp[4] = { state.matrix.mvp };
  63. PARAM camera = program.local[0];
  64. PARAM light = program.local[1];
  65. PARAM light_color = program.local[2];
  66. DP4 result.position.x, mvp[0], xyz;
  67. DP4 result.position.y, mvp[1], xyz;
  68. DP4 result.position.z, mvp[2], xyz;
  69. DP4 result.position.w, mvp[3], xyz;
  70. MOV result.texcoord[0], st;
  71. TEMP dir;
  72. SUB dir, light, xyz;
  73. DP3 result.texcoord[1].x, tangent, dir;
  74. DP3 result.texcoord[1].y, binormal, dir;
  75. DP3 result.texcoord[1].z, normal, dir;
  76. MOV result.texcoord[1].w, light.w;
  77. SUB dir, camera, xyz;
  78. DP3 result.texcoord[2].x, tangent, dir;
  79. DP3 result.texcoord[2].y, binormal, dir;
  80. DP3 result.texcoord[2].z, normal, dir;
  81. MOV result.color, light_color;
  82. END
  83. /*
  84.  */
  85. <fragment>
  86. #ifdef NV3X
  87. /* NV3X fragment program code
  88.  */
  89. !!FP1.0
  90. DP3H H0.w, f[TEX1], f[TEX1]; // H0.w - |light - xyz|
  91. MADH_SAT H5.w, H0.w, -f[TEX1].w, 1.0; // H5.w - 1.0 - |light - xyz| / (radius * radius)
  92. TEX H1, f[TEX1], TEX2, CUBE;
  93. MADX H1, H1, 2.0, -1.0;
  94. TEX H2, f[TEX2], TEX2, CUBE;
  95. MADX H2, H2, 2.0, -1.0;
  96. #ifdef OFFSET
  97. TEX R0, f[TEX0], TEX3, 2D;
  98. MADX R0, R0, 0.08, -0.04;
  99. MAD R0, R0, H2, f[TEX0];
  100. TEX H0, R0, TEX1, 2D;
  101. TEX H3, R0, TEX0, 2D;
  102. #else
  103. TEX H0, f[TEX0], TEX1, 2D; // H0 - normal
  104. TEX H3, f[TEX0], TEX0, 2D; // H3 - diffuse
  105. #endif /* OFFSET */
  106. MADX H0, H0, 2.0, -1.0; // expand normal
  107. #ifdef TEYLOR
  108. DP3X H6.x, H0, H0;
  109. DP3X H6.y, H1, H1;
  110. DP3X H6.z, H2, H2;
  111. MADX H6, H6, -0.5, 0.5;
  112. MADX H0, H0, H6.x, H0;
  113. MADX H1, H1, H6.y, H1;
  114. MADX H2, H2, H6.z, H2;
  115. #endif /* TEYLOR */
  116. DP3X H4.w, H0, H1;
  117. MULX H4, H4.w, H3; // H4 - diffuse * base
  118. RFLH H1, H0, H1;
  119. DP3X_SAT H2.w, H2, H1;
  120. POWH_SAT H2.w, H2.w, 16.0; // H2 - specular
  121. MADX H4, H2.w, H3.w, H4; // H4 - (diffuse * base + specular)
  122. MULX H4, H4, H5.w; // H4 - (diffuse * base + specular) * attenuation
  123. #ifdef HORIZON
  124. TEX H0, f[TEX1], TEX4, CUBE; // H0 - horizon lookup
  125. #ifndef OFFSET
  126. MOV R0, f[TEX0];
  127. #endif /* OFFSET */
  128. MOVX R0.z, H0.x;
  129. TEX H1, R0, TEX5, 3D; // H1 - horizon
  130. SUBX_SAT H0.w, H0.y, H1.x; // self shadowing
  131. MULH_SAT H0, H0.w, 8.0; // H0 - shadow
  132. MULX H4, H4, H0; // H4 - (diffuse * base + specular) * attenuation * shadow
  133. #endif /* HORIZON */
  134. MULX o[COLH], f[COL0], H4;
  135. END
  136. #else
  137. /* ARB fragment program code
  138.  */
  139. !!ARBfp1.0
  140. PARAM specular_exponent = { 0.0, 0.0, 0.0, 16.0 };
  141. TEMP dist, light_dir, camera_dir, normal, base, color, offset, temp, reflect;
  142. DP3 dist.w, fragment.texcoord[1], fragment.texcoord[1];
  143. MAD_SAT dist.x, dist.w, -fragment.texcoord[1].w, 1.0; // attenuation
  144. TEX light_dir, fragment.texcoord[1], texture[2], CUBE;
  145. MAD light_dir, light_dir, 2.0, -1.0; // light direction
  146. TEX camera_dir, fragment.texcoord[2], texture[2], CUBE;
  147. MAD camera_dir, camera_dir, 2.0, -1.0; // camera direction
  148. #ifdef OFFSET
  149. TEX offset, fragment.texcoord[0], texture[3], 2D;
  150. MAD offset, offset, 0.08, -0.04;
  151. MAD offset, offset, camera_dir, fragment.texcoord[0];
  152. TEX normal, offset, texture[1], 2D;
  153. TEX base, offset, texture[0], 2D;
  154. #else
  155. TEX normal, fragment.texcoord[0], texture[1], 2D;
  156. TEX base, fragment.texcoord[0], texture[0], 2D;
  157. #endif /* OFFSET */
  158. MAD normal, normal, 2.0, -1.0; // expand normal
  159. #ifdef TEYLOR
  160. DP3 temp.x, normal, normal;
  161. DP3 temp.y, light_dir, light_dir;
  162. DP3 temp.z, camera_dir, camera_dir;
  163. MAD temp, temp, -0.5, 0.5;
  164. MAD normal, normal, temp.x, normal;
  165. MAD light_dir, light_dir, temp.y, light_dir;
  166. MAD camera_dir, camera_dir, temp.z, camera_dir;
  167. #endif /* TEYLOR */
  168. DP3 color.w, normal, light_dir;
  169. MUL color, color.w, base;
  170. DP3 temp.w, normal, light_dir;
  171. MUL temp.w, temp.w, 2.0;
  172. MAD reflect, normal, temp.w, -light_dir;
  173. DP3_SAT color.w, reflect, camera_dir;
  174. POW_SAT color.w, color.w, specular_exponent.w;
  175. MAD color, color.w, base.w, color;
  176. MUL color, color, dist.x;
  177. #ifdef HORIZON
  178. TEMP lookup, horizon, shadow;
  179. TEX lookup, fragment.texcoord[1], texture[4], CUBE;
  180. #ifndef OFFSET
  181. TEMP offset;
  182. MOV offset, fragment.texcoord[0];
  183. #endif /* OFFSET */
  184. MOV offset.z, lookup.x;
  185. TEX horizon, offset, texture[5], 3D;
  186. SUB_SAT shadow.w, lookup.y, horizon.x;
  187. MUL_SAT shadow, shadow.w, 8.0;
  188. MUL color, color, shadow;
  189. #endif /* HORIZON */
  190. MUL result.color, fragment.color, color;
  191. END
  192. #endif /* NV3X */
  193. #endif /* VERTEX */