PageRenderTime 26ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/samples/custom_shader/noise.html

https://github.com/Anachid/CubicVR.js
HTML | 250 lines | 204 code | 46 blank | 0 comment | 0 complexity | 2b0bfcb0df99349780e08d0bbbd446ff MD5 | raw file
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
  2. <html>
  3. <head>
  4. <title>
  5. CubicVR.js: Custom Material Shader using GLSL perlin noise by Stefan Gustavson
  6. </title>
  7. <script src="../../CubicVR.js" type="text/javascript">
  8. </script>
  9. <script id="vs" type="x-shader/x-vertex">
  10. uniform float myTimer;
  11. void main(void)
  12. {
  13. vertexTexCoordOut = cubicvr_texCoord();
  14. gl_Position = matrixProjection * matrixModelView * cubicvr_transform();
  15. vertexNormalOut = matrixNormal * cubicvr_normal();
  16. cubicvr_lighting();
  17. }
  18. </script>
  19. <script id="fs" type="x-shader/x-fragment">
  20. uniform float myTimer;
  21. //
  22. // GLSL textureless classic 3D noise "cnoise",
  23. // with an RSL-style periodic variant "pnoise".
  24. // Author: Stefan Gustavson (stefan.gustavson@liu.se)
  25. // Version: 2011-08-22
  26. //
  27. // Many thanks to Ian McEwan of Ashima Arts for the
  28. // ideas for permutation and gradient selection.
  29. //
  30. // Copyright (c) 2011 Stefan Gustavson. All rights reserved.
  31. // Distributed under the MIT license. See LICENSE file.
  32. // https://github.com/ashima/webgl-noise
  33. //
  34. vec4 mod289(vec4 x)
  35. {
  36. return x - floor(x * (1.0 / 289.0)) * 289.0;
  37. }
  38. vec3 mod289(vec3 x)
  39. {
  40. return x - floor(x * (1.0 / 289.0)) * 289.0;
  41. }
  42. vec4 permute(vec4 x)
  43. {
  44. return mod289(((x*34.0)+1.0)*x);
  45. }
  46. vec4 taylorInvSqrt(vec4 r)
  47. {
  48. return 1.79284291400159 - 0.85373472095314 * r;
  49. }
  50. vec3 fade(vec3 t) {
  51. return t*t*t*(t*(t*6.0-15.0)+10.0);
  52. }
  53. // Classic Perlin noise
  54. float cnoise(vec3 P)
  55. {
  56. vec3 Pi0 = floor(P); // Integer part for indexing
  57. vec3 Pi1 = Pi0 + vec3(1.0); // Integer part + 1
  58. Pi0 = mod289(Pi0);
  59. Pi1 = mod289(Pi1);
  60. vec3 Pf0 = fract(P); // Fractional part for interpolation
  61. vec3 Pf1 = Pf0 - vec3(1.0); // Fractional part - 1.0
  62. vec4 ix = vec4(Pi0.x, Pi1.x, Pi0.x, Pi1.x);
  63. vec4 iy = vec4(Pi0.yy, Pi1.yy);
  64. vec4 iz0 = Pi0.zzzz;
  65. vec4 iz1 = Pi1.zzzz;
  66. vec4 ixy = permute(permute(ix) + iy);
  67. vec4 ixy0 = permute(ixy + iz0);
  68. vec4 ixy1 = permute(ixy + iz1);
  69. vec4 gx0 = ixy0 * (1.0 / 7.0);
  70. vec4 gy0 = fract(floor(gx0) * (1.0 / 7.0)) - 0.5;
  71. gx0 = fract(gx0);
  72. vec4 gz0 = vec4(0.5) - abs(gx0) - abs(gy0);
  73. vec4 sz0 = step(gz0, vec4(0.0));
  74. gx0 -= sz0 * (step(0.0, gx0) - 0.5);
  75. gy0 -= sz0 * (step(0.0, gy0) - 0.5);
  76. vec4 gx1 = ixy1 * (1.0 / 7.0);
  77. vec4 gy1 = fract(floor(gx1) * (1.0 / 7.0)) - 0.5;
  78. gx1 = fract(gx1);
  79. vec4 gz1 = vec4(0.5) - abs(gx1) - abs(gy1);
  80. vec4 sz1 = step(gz1, vec4(0.0));
  81. gx1 -= sz1 * (step(0.0, gx1) - 0.5);
  82. gy1 -= sz1 * (step(0.0, gy1) - 0.5);
  83. vec3 g000 = vec3(gx0.x,gy0.x,gz0.x);
  84. vec3 g100 = vec3(gx0.y,gy0.y,gz0.y);
  85. vec3 g010 = vec3(gx0.z,gy0.z,gz0.z);
  86. vec3 g110 = vec3(gx0.w,gy0.w,gz0.w);
  87. vec3 g001 = vec3(gx1.x,gy1.x,gz1.x);
  88. vec3 g101 = vec3(gx1.y,gy1.y,gz1.y);
  89. vec3 g011 = vec3(gx1.z,gy1.z,gz1.z);
  90. vec3 g111 = vec3(gx1.w,gy1.w,gz1.w);
  91. vec4 norm0 = taylorInvSqrt(vec4(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110)));
  92. g000 *= norm0.x;
  93. g010 *= norm0.y;
  94. g100 *= norm0.z;
  95. g110 *= norm0.w;
  96. vec4 norm1 = taylorInvSqrt(vec4(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111)));
  97. g001 *= norm1.x;
  98. g011 *= norm1.y;
  99. g101 *= norm1.z;
  100. g111 *= norm1.w;
  101. float n000 = dot(g000, Pf0);
  102. float n100 = dot(g100, vec3(Pf1.x, Pf0.yz));
  103. float n010 = dot(g010, vec3(Pf0.x, Pf1.y, Pf0.z));
  104. float n110 = dot(g110, vec3(Pf1.xy, Pf0.z));
  105. float n001 = dot(g001, vec3(Pf0.xy, Pf1.z));
  106. float n101 = dot(g101, vec3(Pf1.x, Pf0.y, Pf1.z));
  107. float n011 = dot(g011, vec3(Pf0.x, Pf1.yz));
  108. float n111 = dot(g111, Pf1);
  109. vec3 fade_xyz = fade(Pf0);
  110. vec4 n_z = mix(vec4(n000, n100, n010, n110), vec4(n001, n101, n011, n111), fade_xyz.z);
  111. vec2 n_yz = mix(n_z.xy, n_z.zw, fade_xyz.y);
  112. float n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x);
  113. return 2.2 * n_xyz;
  114. }
  115. void main(void)
  116. {
  117. vec2 texCoord = cubicvr_texCoord();
  118. float q = myTimer+100.0;
  119. float texScale = 20.0;
  120. float rnoise = cnoise(vec3((texCoord-0.5)*texScale,q*0.65));
  121. float gnoise = cnoise(vec3((texCoord-0.5)*texScale,q*-0.7));
  122. float bnoise = cnoise(vec3((texCoord-0.5)*texScale,q*0.8));
  123. vec4 color = vec4(rnoise/2.0,gnoise,bnoise,1.0); // use half of red
  124. vec3 normal = cubicvr_normal(texCoord);
  125. color = cubicvr_environment(color,normal,texCoord);
  126. color = cubicvr_lighting(color,normal,texCoord);
  127. color.r += rnoise/2.0; // add half red back in after lighting
  128. gl_FragColor = clamp(color,0.0,1.0);
  129. }
  130. </script>
  131. <script type='text/javascript'>
  132. function webGLStart() {
  133. // by default generate a full screen canvas with automatic resize
  134. var gl = CubicVR.init();
  135. var canvas = CubicVR.getCanvas();
  136. if (!gl) {
  137. alert("Sorry, no WebGL support.");
  138. return;
  139. };
  140. var myShader = new CubicVR.CustomShader({
  141. vertex: "#vs",
  142. fragment: "#fs",
  143. init: function(shader) {
  144. shader.myTimer.set(0); // not needed, just here for example purposes
  145. }
  146. });
  147. // Create a box mesh, size 1.0, apply material and UV parameters
  148. var boxMesh = new CubicVR.Mesh({
  149. primitive: {
  150. type: "box",
  151. size: 1.5,
  152. material: {
  153. shader: myShader
  154. },
  155. uvmapper: {
  156. projectionMode: CubicVR.enums.uv.projection.CUBIC,
  157. scale: [1, 1, 1]
  158. }
  159. },
  160. compile: true
  161. });
  162. // New scene with our canvas dimensions and default camera with FOV 80
  163. var scene = new CubicVR.Scene(canvas.width, canvas.height, 80);
  164. // set initial camera position and target
  165. scene.camera.position = [1, 1, 1];
  166. scene.camera.target = [0, 0, 0];
  167. // Add a simple directional light
  168. scene.bind(new CubicVR.Light({
  169. type: "directional",
  170. specular: [1, 1, 1],
  171. direction: [-0.6, -0.5, 0.6],
  172. }));
  173. CubicVR.setGlobalAmbient([0.1,0.1,0.1]);
  174. // SceneObject container for the mesh
  175. var boxObject = new CubicVR.SceneObject(boxMesh);
  176. // encapsulate the rotation in a sceneobject TICK event
  177. var boxEvent = boxObject.addEvent({
  178. id: "tick",
  179. action:function(event,evh) {
  180. var lus = event.getLastUpdateSeconds();
  181. var sceneObj = event.getSubject();
  182. if (myShader.isReady()) {
  183. myShader.myTimer.value = event.getSeconds();
  184. }
  185. sceneObj.rotation[0]+=lus*15.0;
  186. sceneObj.rotation[2]+=lus*13.0;
  187. }
  188. });
  189. // Add SceneObject containing the mesh to the scene
  190. scene.bind(boxObject);
  191. // Add our scene to the window resize list
  192. CubicVR.addResizeable(scene);
  193. // Start our main drawing loop, it provides a timer and the gl context as parameters
  194. CubicVR.MainLoop(function(timer, gl) {
  195. scene.render();
  196. scene.runEvents(timer.getSeconds());
  197. });
  198. // initialize a mouse view controller
  199. var mvc = new CubicVR.MouseViewController(canvas, scene.camera);
  200. }
  201. </script>
  202. </head>
  203. <body onLoad="webGLStart();"></body>
  204. </html>