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

游戏引擎

开发平台:

Visual C++

  1. /* light shader (diffuse, specular, gloss)
  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. /*
  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. #ifdef HALF
  78. DP3 dir.w, dir, dir;
  79. RSQ dir.w, dir.w;
  80. MUL dir, dir, dir.w;
  81. TEMP half;
  82. SUB half, camera, xyz;
  83. DP3 half.w, half, half;
  84. RSQ half.w, half.w;
  85. MUL half, half, half.w;
  86. ADD half, half, dir;
  87. DP3 result.texcoord[2].x, tangent, half;
  88. DP3 result.texcoord[2].y, binormal, half;
  89. DP3 result.texcoord[2].z, normal, half;
  90. #else
  91. SUB dir, camera, xyz;
  92. DP3 result.texcoord[2].x, tangent, dir;
  93. DP3 result.texcoord[2].y, binormal, dir;
  94. DP3 result.texcoord[2].z, normal, dir;
  95. #endif /* HALF */
  96. MOV result.color, light_color;
  97. END
  98. /*
  99.  */
  100. <fragment>
  101. #ifdef NV3X
  102. /*****************************************************************************/
  103. /*                                                                           */
  104. /* NV3X fragment program code                                                */
  105. /*                                                                           */
  106. /*****************************************************************************/
  107. !!FP1.0
  108. DP3H H0.w, f[TEX1], f[TEX1]; // H0.w - |light - xyz|
  109. MADH_SAT H5.w, H0.w, -f[TEX1].w, 1.0; // H5.w - 1.0 - |light - xyz| / (radius * radius)
  110. TEX H0, f[TEX0], TEX1, 2D; // H0 - normal
  111. MADX H0, H0, 2.0, -1.0; // expand normal
  112. TEX H1, f[TEX1], TEX2, CUBE; // H1 - light direction
  113. MADX H1, H1, 2.0, -1.0;
  114. TEX H2, f[TEX2], TEX2, CUBE; // H2 - camera direction or half angle
  115. MADX H2, H2, 2.0, -1.0;
  116. #ifdef TEYLOR
  117. DP3X H6.x, H0, H0;
  118. DP3X H6.y, H1, H1;
  119. DP3X H6.z, H2, H2;
  120. MADX H6, H6, -0.5, 0.5;
  121. MADX H0, H0, H6.x, H0;
  122. MADX H1, H1, H6.y, H1;
  123. MADX H2, H2, H6.z, H2;
  124. #endif /* TEYLOR */
  125. DP3X H4.w, H0, H1;
  126. TEX H3, f[TEX0], TEX0, 2D; // H3 - diffuse
  127. MULX H4, H4.w, H3; // H4 - diffuse * base
  128. #ifdef HALF
  129. DP3X_SAT H2.w, H0, H2;
  130. POWH_SAT H2.w, H2.w, 32.0; // H2 - specular
  131. #else
  132. RFLH H1, H0, H1;
  133. DP3X_SAT H2.w, H2, H1;
  134. POWH_SAT H2.w, H2.w, 16.0;
  135. #endif /* HALF */
  136. MADX H4, H2.w, H3.w, H4; // (diffuse * base + specular)
  137. MULX H4, H4, H5.w; // (diffuse * base + specular) * attenuation
  138. MULX o[COLH], H4, f[COL0]; // (diffuse * base + specular) * attenuation * color
  139. END
  140. #else
  141. /*****************************************************************************/
  142. /*                                                                           */
  143. /* ARB fragment program code                                                 */
  144. /*                                                                           */
  145. /*****************************************************************************/
  146. !!ARBfp1.0
  147. TEMP dist, light_dir, camera_dir, normal, base, color, temp, reflect;
  148. DP3 dist.w, fragment.texcoord[1], fragment.texcoord[1];
  149. MAD_SAT dist.x, dist.w, -fragment.texcoord[1].w, 1.0; // attenuation
  150. TEX normal, fragment.texcoord[0], texture[1], 2D;
  151. MAD normal, normal, 2.0, -1.0; // expand normal
  152. TEX light_dir, fragment.texcoord[1], texture[2], CUBE; // light direction
  153. MAD light_dir, light_dir, 2.0, -1.0;
  154. TEX camera_dir, fragment.texcoord[2], texture[2], CUBE; // camera direction or half angle
  155. MAD camera_dir, camera_dir, 2.0, -1.0;
  156. #ifdef TEYLOR
  157. DP3 temp.x, normal, normal;
  158. DP3 temp.y, light_dir, light_dir;
  159. DP3 temp.z, camera_dir, camera_dir;
  160. MAD temp, temp, -0.5, 0.5;
  161. MAD normal, normal, temp.x, normal;
  162. MAD light_dir, light_dir, temp.y, light_dir;
  163. MAD camera_dir, camera_dir, temp.z, camera_dir;
  164. #endif /* TEYLOR */
  165. DP3 color.w, normal, light_dir;
  166. TEX base, fragment.texcoord[0], texture[0], 2D;
  167. MUL color, color.w, base;
  168. #ifdef HALF
  169. DP3_SAT color.w, normal, camera_dir;
  170. POW_SAT color.w, color.w, {0,0,0,32}.w;
  171. #else
  172. DP3 temp.w, normal, light_dir;
  173. MUL temp.w, temp.w, 2.0;
  174. MAD reflect, normal, temp.w, -light_dir;
  175. DP3_SAT color.w, reflect, camera_dir;
  176. POW_SAT color.w, color.w, {0,0,0,16}.w;
  177. #endif /* HALF */
  178. MAD color, color.w, base.w, color;
  179. MUL color, color, dist.x;
  180. MUL result.color, fragment.color, color;
  181. END
  182. #endif /* NV3X */
  183. #endif /* VERTEX */