Pas2JS_WebGL_Terrain.html 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. <html>
  2. <head>
  3. <meta charset="utf-8"/>
  4. <script type="application/javascript" src="../Pas2JS_WebGL_Terrain.js"></script>
  5. </head>
  6. <body>
  7. <pre id="debug-console"></pre>
  8. <script type="application/glsl" id="vertex.glsl">
  9. attribute vec3 in_position;
  10. attribute vec2 in_texCoord;
  11. attribute vec3 in_normal;
  12. uniform mat4 projTransform;
  13. uniform mat4 viewTransform;
  14. uniform mat4 modelTransform;
  15. uniform mat4 inverseViewTransform;
  16. uniform vec3 lightPosition;
  17. varying vec3 toLight;
  18. varying vec3 surfaceNormal;
  19. varying vec3 toCamera;
  20. varying vec2 vertexTexCoord;
  21. varying float visibility;
  22. // constants
  23. const float density = 0.02;
  24. const float gradient = 1.5;
  25. void main() {
  26. vec4 worldPosition = modelTransform * vec4(in_position, 1);
  27. vec4 positionRelativeToCamera = viewTransform * worldPosition;
  28. gl_Position = projTransform * viewTransform * worldPosition;
  29. surfaceNormal = (modelTransform * vec4(in_normal, 0)).xyz;
  30. toLight = lightPosition - worldPosition.xyz;
  31. toCamera = (inverseViewTransform * vec4(0, 0, 0, 1)).xyz - worldPosition.xyz;
  32. vertexTexCoord = in_texCoord;
  33. // fog
  34. // TODO: make this relative to some actual distance in glcoords
  35. float dist = length(positionRelativeToCamera.xyz) / 6.0;
  36. visibility = exp(-pow((dist * density), gradient));
  37. visibility = clamp(visibility, 0.0, 1.0);
  38. }
  39. </script>
  40. <script type="application/glsl" id="fragment.glsl">
  41. precision mediump float;
  42. uniform vec3 lightColor;
  43. uniform float shineDamper;
  44. uniform float reflectivity;
  45. uniform sampler2D sampler;
  46. varying vec3 toLight;
  47. varying vec3 surfaceNormal;
  48. varying vec3 toCamera;
  49. varying vec2 vertexTexCoord;
  50. varying float visibility;
  51. const vec3 skyColor = vec3(0.9, 0.9, 0.9);
  52. const float ambientLight = 0.3;
  53. void main() {
  54. vec3 unitToLight = normalize(toLight);
  55. vec3 unitSurfaceNormal = normalize(surfaceNormal);
  56. float brightness = dot(unitToLight, unitSurfaceNormal);
  57. brightness = max(brightness, 0.0);
  58. vec3 diffuseLight = lightColor * brightness;
  59. diffuseLight = max(diffuseLight, ambientLight);
  60. vec3 lightDirection = -unitToLight;
  61. vec3 reflectedDirection = reflect(lightDirection, unitSurfaceNormal);
  62. float specular = dot(reflectedDirection, normalize(toCamera));
  63. specular = max(specular, 0.0);
  64. float damper = pow(specular, shineDamper);
  65. vec3 specularColor = damper * reflectivity * lightColor;
  66. // add color and light
  67. vec4 diffuseColor = texture2D(sampler, vertexTexCoord);
  68. vec4 finalColor = vec4(diffuseLight, 1) * diffuseColor + vec4(specularColor, 1);
  69. finalColor = mix(vec4(skyColor, 1.0), finalColor, visibility);
  70. gl_FragColor = finalColor;
  71. }
  72. </script>
  73. <script type="application/javascript">
  74. rtl.run();
  75. </script>
  76. </body>
  77. </html>