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

游戏引擎

开发平台:

Visual C++

  1. /* light shader (diffuse, specular, gloss, cubemap modulation)
  2.  * defines: VERTEX, NV3X, HALF, TEYLOR
  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. <matrix0>       transform
  54. <matrix1> light_transform
  55. /*
  56.  */
  57. <vertex>
  58. !!ARBvp1.0
  59. ATTRIB xyz = vertex.attrib[0];
  60. ATTRIB normal = vertex.attrib[1];
  61. ATTRIB tangent = vertex.attrib[2];
  62. ATTRIB binormal = vertex.attrib[3];
  63. ATTRIB st = vertex.attrib[4];
  64. PARAM mvp[4] = { state.matrix.mvp };
  65. PARAM camera = program.local[0];
  66. PARAM light = program.local[1];
  67. PARAM light_color = program.local[2];
  68. PARAM transform[4] = { state.matrix.program[0] };
  69. PARAM light_transform[4] = { state.matrix.program[1].transpose };
  70. DP4 result.position.x, mvp[0], xyz;
  71. DP4 result.position.y, mvp[1], xyz;
  72. DP4 result.position.z, mvp[2], xyz;
  73. DP4 result.position.w, mvp[3], xyz;
  74. MOV result.texcoord[0], st;
  75. TEMP dir;
  76. SUB dir, light, xyz;
  77. DP3 result.texcoord[1].x, tangent, dir;
  78. DP3 result.texcoord[1].y, binormal, dir;
  79. DP3 result.texcoord[1].z, normal, dir;
  80. MOV result.texcoord[1].w, light.w;
  81. #ifdef HALF
  82. DP3 dir.w, dir, dir;
  83. RSQ dir.w, dir.w;
  84. MUL dir, dir, dir.w;
  85. TEMP half;
  86. SUB half, camera, xyz;
  87. DP3 half.w, half, half;
  88. RSQ half.w, half.w;
  89. MUL half, half, half.w;
  90. ADD half, half, dir;
  91. DP3 result.texcoord[2].x, tangent, half;
  92. DP3 result.texcoord[2].y, binormal, half;
  93. DP3 result.texcoord[2].z, normal, half;
  94. #else
  95. SUB dir, camera, xyz;
  96. DP3 result.texcoord[2].x, tangent, dir;
  97. DP3 result.texcoord[2].y, binormal, dir;
  98. DP3 result.texcoord[2].z, normal, dir;
  99. #endif /* HALF */
  100. TEMP temp;
  101. SUB dir, xyz, light;
  102. DP3 temp.x, transform[0], dir;
  103. DP3 temp.y, transform[1], dir;
  104. DP3 temp.z, transform[2], dir;
  105. DP3 result.texcoord[3].x, light_transform[0], temp;
  106. DP3 result.texcoord[3].y, light_transform[1], temp;
  107. DP3 result.texcoord[3].z, light_transform[2], temp;
  108. MOV result.color, light_color;
  109. END
  110. /*
  111.  */
  112. <fragment>
  113. #ifdef NV3X
  114. /*****************************************************************************/
  115. /*                                                                           */
  116. /* NV3X fragment program code                                                */
  117. /*                                                                           */
  118. /*****************************************************************************/
  119. !!FP1.0
  120. DP3H H0.w, f[TEX1], f[TEX1]; // H0.w - |light - xyz|
  121. MADH_SAT H5.w, H0.w, -f[TEX1].w, 1.0; // H5.w - 1.0 - |light - xyz| / (radius * radius)
  122. TEX H0, f[TEX0], TEX1, 2D; // H0 - normal
  123. MADX H0, H0, 2.0, -1.0; // expand normal
  124. TEX H1, f[TEX1], TEX2, CUBE; // H1 - light direction
  125. MADX H1, H1, 2.0, -1.0;
  126. TEX H2, f[TEX2], TEX2, CUBE; // H2 - camera direction or half angle
  127. MADX H2, H2, 2.0, -1.0;
  128. #ifdef TEYLOR
  129. DP3X H6.x, H0, H0;
  130. DP3X H6.y, H1, H1;
  131. DP3X H6.z, H2, H2;
  132. MADX H6, H6, -0.5, 0.5;
  133. MADX H0, H0, H6.x, H0;
  134. MADX H1, H1, H6.y, H1;
  135. MADX H2, H2, H6.z, H2;
  136. #endif /* TEYLOR */
  137. DP3X H4.w, H0, H1;
  138. TEX H3, f[TEX0], TEX0, 2D; // H3 - diffuse
  139. MULX H4, H4.w, H3; // H4 - diffuse * base
  140. #ifdef HALF
  141. DP3X_SAT H2.w, H0, H2;
  142. POWH_SAT H2.w, H2.w, 32.0; // H2 - specular
  143. #else
  144. RFLH H1, H0, H1;
  145. DP3X_SAT H2.w, H2, H1;
  146. POWH_SAT H2.w, H2.w, 16.0;
  147. #endif /* HALF */
  148. MADX H4, H2.w, H3.w, H4; // (diffuse * base + specular)
  149. MULX H4, H4, H5.w; // (diffuse * base + specular) * attenuation
  150. TEX H0, f[TEX3], TEX3, CUBE; // modulate texture
  151. MULX H4, H4, H0; // (diffuse * base + specular) * attenuation * modulate
  152. MOVX H4.w, 1.0;
  153. MULX o[COLH], H4, f[COL0]; // (diffuse * base + specular) * attenuation * modulate * color
  154. END
  155. #else
  156. /*****************************************************************************/
  157. /*                                                                           */
  158. /* ARB fragment program code                                                 */
  159. /*                                                                           */
  160. /*****************************************************************************/
  161. !!ARBfp1.0
  162. TEMP dist, light_dir, camera_dir, normal, base, color, temp, reflect;
  163. DP3 dist.w, fragment.texcoord[1], fragment.texcoord[1];
  164. MAD_SAT dist.x, dist.w, -fragment.texcoord[1].w, 1.0; // attenuation
  165. TEX normal, fragment.texcoord[0], texture[1], 2D;
  166. MAD normal, normal, 2.0, -1.0; // expand normal
  167. TEX light_dir, fragment.texcoord[1], texture[2], CUBE; // light direction
  168. MAD light_dir, light_dir, 2.0, -1.0;
  169. TEX camera_dir, fragment.texcoord[2], texture[2], CUBE; // camera direction or half angle
  170. MAD camera_dir, camera_dir, 2.0, -1.0;
  171. #ifdef TEYLOR
  172. DP3 temp.x, normal, normal;
  173. DP3 temp.y, light_dir, light_dir;
  174. DP3 temp.z, camera_dir, camera_dir;
  175. MAD temp, temp, -0.5, 0.5;
  176. MAD normal, normal, temp.x, normal;
  177. MAD light_dir, light_dir, temp.y, light_dir;
  178. MAD camera_dir, camera_dir, temp.z, camera_dir;
  179. #endif /* TEYLOR */
  180. DP3 color.w, normal, light_dir;
  181. TEX base, fragment.texcoord[0], texture[0], 2D;
  182. MUL color, color.w, base;
  183. #ifdef HALF
  184. DP3_SAT color.w, normal, camera_dir;
  185. POW_SAT color.w, color.w, {0,0,0,32}.w;
  186. #else
  187. DP3 temp.w, normal, light_dir;
  188. MUL temp.w, temp.w, 2.0;
  189. MAD reflect, normal, temp.w, -light_dir;
  190. DP3_SAT color.w, reflect, camera_dir;
  191. POW_SAT color.w, color.w, {0,0,0,16}.w;
  192. #endif /* HALF */
  193. MAD color, color.w, base.w, color;
  194. MUL color, color, dist.x;
  195. MUL color, fragment.color, color;
  196. TEX temp, fragment.texcoord[3], texture[3], CUBE;
  197. MUL result.color, color, temp;
  198. END
  199. #endif /* NV3X */
  200. #endif /* VERTEX */