static.fs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #version 120
  2. uniform sampler2D diffuse_map;
  3. uniform sampler2D bump_map;
  4. uniform sampler2D spec_map;
  5. uniform float glossiness;
  6. uniform float bumpiness;
  7. uniform float specular_level;
  8. uniform float alpha_test;
  9. uniform int material;
  10. uniform float clip_near;
  11. uniform float clip_far;
  12. varying vec2 fTexcoord;
  13. varying vec3 fColor;
  14. varying vec3 fPosition;
  15. varying mat4 fTBN;
  16. vec3 to_gamma(vec3 color) {
  17. vec3 ret;
  18. ret.r = pow(color.r, 2.2);
  19. ret.g = pow(color.g, 2.2);
  20. ret.b = pow(color.b, 2.2);
  21. return ret;
  22. }
  23. vec3 from_gamma(vec3 color) {
  24. vec3 ret;
  25. ret.r = pow(color.r, 1.0/2.2);
  26. ret.g = pow(color.g, 1.0/2.2);
  27. ret.b = pow(color.b, 1.0/2.2);
  28. return ret;
  29. }
  30. vec3 swap_red_green_inv(vec3 color) {
  31. float temp = 1.0-color.r;
  32. color.r = 1.0-color.g;
  33. color.g = temp;
  34. return color;
  35. }
  36. float linear_depth(float depth, float near, float far){
  37. return (2.0 * near) / (far + near - depth * (far - near));
  38. }
  39. void main( void ) {
  40. vec2 uvs = vec2(fTexcoord.x, -fTexcoord.y);
  41. vec4 diffuse = texture2D(diffuse_map, uvs);
  42. float spec = texture2D(spec_map, uvs).r * specular_level;
  43. vec4 normal = texture2D(bump_map, uvs);
  44. if (diffuse.a < alpha_test) { discard; }
  45. normal.rgb = swap_red_green_inv(normal.rgb);
  46. normal = mix(normal, vec4( 0.5, 0.5, 1.0, 1.0 ), bumpiness);
  47. normal = (normal * 2.0 - vec4(1.0,1.0,1.0,0.0)) * fTBN;
  48. gl_FragData[0].rgb = from_gamma(diffuse.rgb) * fColor;
  49. gl_FragData[0].a = spec;
  50. gl_FragData[1].rgb = normal.rgb;
  51. gl_FragData[1].a = float(material) + glossiness / 1000;
  52. gl_FragDepth = linear_depth(gl_FragCoord.z, clip_near, clip_far);
  53. }