Advertisement
aeroson

Untitled

Dec 18th, 2013
163
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. VERTEX_SHADER
  2.  
  3. #version 400
  4.  
  5. layout(location=0) in vec3 in_Position;
  6. layout(location=1) in vec3 in_Normal;
  7. layout(location=2) in vec2 in_UV;
  8. layout(location=3) in vec3 in_Tangent;
  9.  
  10. out vec4 ex_Color;
  11. out vec3 ex_Normal;
  12. out vec3 ex_WorldPos;
  13. out vec2 ex_UV;
  14. out vec3 ex_Tangent;
  15. out vec3 ex_ShadowCoord;
  16.  
  17.  
  18. uniform mat4 ModelMatrix;
  19. uniform mat4 ViewMatrix;
  20. uniform mat4 ProjectionMatrix;
  21. uniform mat4 depthPV;
  22. uniform mat4 depthBiasPV;
  23.  
  24. void main(void)
  25. {
  26. gl_Position = (ProjectionMatrix * ViewMatrix * ModelMatrix) * vec4(in_Position,1);
  27. ex_Normal = (ModelMatrix * vec4(in_Normal,0)).xyz;
  28. ex_WorldPos = (ModelMatrix * vec4(in_Position,1)).xyz;
  29. ex_UV=in_UV;
  30. ex_Tangent=normalize( (ModelMatrix * vec4(in_Tangent,0)).xyz );
  31. ex_ShadowCoord = (depthPV * ModelMatrix * vec4(in_Position,1)).xyz;
  32. ex_ShadowCoord = (ex_ShadowCoord/2)+0.5;
  33. //ex_ShadowCoord = (ex_ShadowCoord);
  34. //ex_ShadowCoord = (depthBiasPV * ModelMatrix * vec4(in_Position,1)).xyz;
  35. }
  36.  
  37.  
  38.  
  39.  
  40.  
  41. FRAGMENT_SHADER
  42.  
  43. #version 400
  44.  
  45. float packColor(vec3 color) {
  46. return color.r + color.g * 256.0 + color.b * 256.0 * 256.0;
  47. }
  48. vec3 unpackColor(float f) {
  49. vec3 color;
  50. color.b = floor(f / 256.0 / 256.0);
  51. color.g = floor((f - color.b * 256.0 * 256.0) / 256.0);
  52. color.r = floor(f - color.b * 256.0 * 256.0 - color.g * 256.0);
  53. // now we have a vec3 with the 3 components in range [0..256]. Let's normalize it!
  54. return color / 256.0;
  55. }
  56. float rand(vec2 co){
  57. return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
  58. }
  59.  
  60. in vec4 ex_Color;
  61. in vec3 ex_Normal;
  62. in vec3 ex_WorldPos;
  63. in vec2 ex_UV;
  64. in vec3 ex_Tangent;
  65. in vec3 ex_ShadowCoord;
  66.  
  67. out vec4 out_Color;
  68.  
  69.  
  70. struct Light {
  71. vec3 color;
  72. vec3 position; // position == 0,0,0 => directional light
  73. vec3 direction; // direction == 0,0,0 => point light
  74. float attenuation;
  75. float cutOff;
  76. };
  77. const int MAX_LIGHTS = 10;
  78. uniform Light lights[MAX_LIGHTS];
  79. uniform int lightsNum;
  80.  
  81.  
  82.  
  83. uniform vec3 lightPos;
  84. uniform vec3 lightColor;
  85. uniform vec3 ambientColor;
  86. uniform vec3 diffuseColor;
  87. uniform vec3 specularColor;
  88. uniform vec3 camPos;
  89. uniform float specularPower;
  90. uniform sampler2D ColorMap;
  91. uniform sampler2D NormalMap;
  92. uniform sampler2D SpecularMap;
  93. uniform sampler2D ShadowMap;
  94.  
  95. void main(void)
  96. {
  97. float ooo=1;
  98.  
  99. vec3 N = normalize(ex_Normal);
  100. if(length(ex_Tangent)>0.1) {
  101. vec3 nmap=2*texture2D(NormalMap, ex_UV).xyz-1;
  102. vec3 T = normalize(ex_Tangent);
  103. vec3 B;
  104. T=normalize(T-dot(T,N)*N);
  105. B=normalize(cross(T,N));
  106. N=normalize(
  107. mat3(B,T,N)*
  108. nmap*5
  109. );
  110. }
  111.  
  112.  
  113.  
  114. const vec2 poissonDisk[4] = vec2[](
  115. vec2( -0.94201624, -0.39906216 ),
  116. vec2( 0.94558609, -0.76890725 ),
  117. vec2( -0.094184101, -0.92938870 ),
  118. vec2( 0.34495938, 0.29387760 )
  119. );
  120. const float shadowEdgeDistance=0.2f;
  121. float visibility = 1.0;
  122. if(
  123. ex_ShadowCoord.x>shadowEdgeDistance && ex_ShadowCoord.y>shadowEdgeDistance &&
  124. ex_ShadowCoord.x<1-shadowEdgeDistance && ex_ShadowCoord.y<1-shadowEdgeDistance
  125. ) {
  126. const int im=4;
  127. for (int x=0;x<im;x++) {
  128. for (int y=0;y<im;y++) {
  129. float bias=0.0005;
  130. //vec2 r=vec2(rand(ex_WorldPos.xy+gl_FragCoord.xy),rand(ex_WorldPos.xy+gl_FragCoord.xy));
  131. //vec2 r=vec2(rand(ex_WorldPos.xy),rand(ex_WorldPos.xy));
  132. //vec2 r=vec2(rand(ex_WorldPos.xy),rand(ex_WorldPos.xy));
  133. //vec3 smp=texture2D( ShadowMap, ex_ShadowCoord.xy + poissonDisk[i%4]/700.0 ).xyz;
  134. //float d=clamp(dot(N,normalize(lights[0].direction)),0,1);
  135. //bias=d/1000;
  136. vec3 smp=texture2D( ShadowMap, ex_ShadowCoord.xy + vec2(x,y)/(im*im*700.0)).xyz;
  137. float depth=packColor(smp)/65025;
  138. if ( depth < ex_ShadowCoord.z + bias ) {
  139. visibility -= 1.0/(im*im);
  140. }
  141. }
  142. }
  143. }
  144.  
  145.  
  146.  
  147.  
  148.  
  149.  
  150.  
  151.  
  152.  
  153. vec3 cameraDirection = normalize(ex_WorldPos-camPos);
  154. vec3 lightsColor=vec3(0,0,0);
  155.  
  156. for(int i=0; i<lightsNum; i++) {
  157. Light light=lights[i];
  158.  
  159. vec3 lightToPixel;
  160. float koef=1;
  161.  
  162. if(light.position==vec3(0,0,0)) {
  163. lightToPixel=normalize(light.direction);
  164. } else {
  165. lightToPixel = normalize(light.position-ex_WorldPos);
  166. }
  167.  
  168. if(light.cutOff>0) {
  169. float spotFactor = dot(lightToPixel,normalize(light.direction));
  170. if(spotFactor > light.cutOff) {
  171. koef *= (1.0 - (1.0 - spotFactor) *
  172. 1.0 / (1.0 - light.cutOff ));
  173. } else {
  174. koef *= 0;
  175. }
  176. }
  177.  
  178.  
  179. float diffuseFactor = max(0,dot(N,lightToPixel));
  180. vec3 lightColor=light.color*diffuseFactor;
  181. if(specularPower>0) {
  182. float specularFactor = clamp(pow(max(0,dot(cameraDirection,reflect(lightToPixel,N))),specularPower),0,1);
  183. specularFactor*=texture2D(SpecularMap, ex_UV).xyz;
  184. lightColor+=light.color*specularFactor;
  185. }
  186.  
  187. if(light.attenuation>0) {
  188. float distance=distance(light.position,ex_WorldPos);
  189. float attenuation=light.attenuation*distance*distance;
  190. koef/=max(attenuation,1);
  191. }
  192.  
  193.  
  194. if(i==0) koef*=visibility; //TOFIX first light = shadowcaster
  195.  
  196.  
  197. lightsColor+=lightColor*koef;
  198.  
  199. //lightsColor+= vec3(diffuseFactor,diffuseFactor,diffuseFactor);
  200. }
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207.  
  208.  
  209. float ambientFactor = 1;
  210.  
  211.  
  212.  
  213. vec3 c = texture2D(ColorMap, ex_UV).xyz;
  214. c = c*ambientColor + c*lightsColor;
  215. out_Color=vec4(c,0.1);
  216. //out_Color=vec4(1,1,1,1)*visibility;
  217. //out_Color=vec4(1,1,1,1)* texture2D( ShadowMap, (ex_ShadowCoord.xy) ).z;
  218. //out_Color=vec4(1,1,1,1)* ex_ShadowCoord.z;
  219. //out_Color = normalize(1+vec4(N,0));
  220. //out_Color = texture2D(NormalMap, ex_UV);
  221. //out_Color=vec4(N,0);
  222. //out_Color=vec4(0,diffuse,0,1);
  223. //out_Color=vec4(0,1,0,1);
  224. //out_Color=vec4(0,out_Color.x,0,1);
  225. //out_Color=vec4(lightPos,0);
  226. //out_Color=texture2D(ColorMap, ex_UV);
  227. //out_Color=texture2D(NormalMap, ex_UV);
  228. //out_Color=vec4(gl_FragCoord.z,gl_FragCoord.z,gl_FragCoord.z,1);
  229. //out_Color=vec4(1,1,1,1)*visibility;
  230. //out_Color=texture2D(ShadowMap, ex_ShadowCoord.xy);
  231. //out_Color=texture2D(ShadowMap, ex_UV);
  232. //out_Color=vec4(ex_ShadowCoord,1);
  233. //out_Color=vec4(T,1);
  234. //out_Color=vec4(1,1,1,1)*ooo;
  235.  
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement