logarithmic-depth-buffer.html 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <title>spine-threejs</title>
  5. <script src="https://unpkg.com/[email protected]/build/three.js"></script>
  6. <script src="../dist/iife/spine-threejs.js"></script>
  7. <script src="./OrbitalControls.js"></script>
  8. </head>
  9. <style>
  10. * {
  11. margin: 0;
  12. padding: 0;
  13. }
  14. body,
  15. html {
  16. height: 100%;
  17. }
  18. canvas {
  19. position: absolute;
  20. width: 100%;
  21. height: 100%;
  22. }
  23. </style>
  24. <body>
  25. <script>
  26. (function () {
  27. let scene, camera, renderer;
  28. let geometry, material, mesh, skeletonMesh;
  29. let assetManager;
  30. let canvas;
  31. let controls;
  32. let lastFrameTime = Date.now() / 1000;
  33. let baseUrl = "assets/";
  34. let skeletonFile = "raptor-pro.json";
  35. let atlasFile = skeletonFile
  36. .replace("-pro", "")
  37. .replace("-ess", "")
  38. .replace(".json", ".atlas");
  39. let animation = "walk";
  40. function init() {
  41. // create the THREE.JS camera, scene and renderer (WebGL)
  42. let width = window.innerWidth,
  43. height = window.innerHeight;
  44. camera = new THREE.PerspectiveCamera(75, width / height, 1, 3000);
  45. camera.position.y = 100;
  46. camera.position.z = 400;
  47. scene = new THREE.Scene();
  48. renderer = new THREE.WebGLRenderer({ logarithmicDepthBuffer: true });
  49. renderer.setSize(width, height);
  50. document.body.appendChild(renderer.domElement);
  51. canvas = renderer.domElement;
  52. controls = new OrbitControls(camera, renderer.domElement);
  53. // load the assets required to display the Raptor model
  54. assetManager = new spine.AssetManager(baseUrl);
  55. assetManager.loadText(skeletonFile);
  56. assetManager.loadTextureAtlas(atlasFile);
  57. requestAnimationFrame(load);
  58. }
  59. function load(name, scale) {
  60. if (assetManager.isLoadingComplete()) {
  61. // Add a box to the scene to which we attach the skeleton mesh
  62. geometry = new THREE.BoxGeometry(200, 200, 200);
  63. material = new THREE.MeshBasicMaterial({
  64. color: 0xff0000,
  65. wireframe: true,
  66. });
  67. mesh = new THREE.Mesh(geometry, material);
  68. scene.add(mesh);
  69. // Load the texture atlas using name.atlas and name.png from the AssetManager.
  70. // The function passed to TextureAtlas is used to resolve relative paths.
  71. atlas = assetManager.require(atlasFile);
  72. // Create a AtlasAttachmentLoader that resolves region, mesh, boundingbox and path attachments
  73. atlasLoader = new spine.AtlasAttachmentLoader(atlas);
  74. // Create a SkeletonJson instance for parsing the .json file.
  75. let skeletonJson = new spine.SkeletonJson(atlasLoader);
  76. // Set the scale to apply during parsing, parse the file, and create a new skeleton.
  77. skeletonJson.scale = 0.4;
  78. let skeletonData = skeletonJson.readSkeletonData(
  79. assetManager.require(skeletonFile)
  80. );
  81. // Create a SkeletonMesh from the data and attach it to the scene
  82. // Provide a custom vertex/fragment shader pair that supports
  83. // the logarithmic depth buffer.
  84. // See https://discourse.threejs.org/t/shadermaterial-render-order-with-logarithmicdepthbuffer-is-wrong/49221/3
  85. skeletonMesh = new spine.SkeletonMesh(
  86. skeletonData,
  87. (materialParameters) => {
  88. materialParameters.vertexShader = `
  89. attribute vec4 color;
  90. varying vec2 vUv;
  91. varying vec4 vColor;
  92. #include <common>
  93. #include <logdepthbuf_pars_vertex>
  94. void main() {
  95. vUv = uv;
  96. vColor = color;
  97. gl_Position = projectionMatrix*modelViewMatrix*vec4(position,1.0);
  98. #include <logdepthbuf_vertex>
  99. }
  100. `;
  101. materialParameters.fragmentShader = `
  102. uniform sampler2D map;
  103. #ifdef USE_SPINE_ALPHATEST
  104. uniform float alphaTest;
  105. #endif
  106. varying vec2 vUv;
  107. varying vec4 vColor;
  108. #include <common>
  109. #include <logdepthbuf_pars_fragment>
  110. void main(void) {
  111. #include <logdepthbuf_fragment>
  112. gl_FragColor = texture2D(map, vUv)*vColor;
  113. #ifdef USE_SPINE_ALPHATEST
  114. if (gl_FragColor.a < alphaTest) discard;
  115. #endif
  116. }
  117. `;
  118. }
  119. );
  120. skeletonMesh.state.setAnimation(0, animation, true);
  121. mesh.add(skeletonMesh);
  122. requestAnimationFrame(render);
  123. } else requestAnimationFrame(load);
  124. }
  125. let lastTime = Date.now();
  126. function render() {
  127. // calculate delta time for animation purposes
  128. let now = Date.now() / 1000;
  129. let delta = now - lastFrameTime;
  130. lastFrameTime = now;
  131. // resize canvas to use full page, adjust camera/renderer
  132. resize();
  133. // Update orbital controls
  134. controls.update();
  135. // update the animation
  136. skeletonMesh.update(delta);
  137. // render the scene
  138. renderer.render(scene, camera);
  139. requestAnimationFrame(render);
  140. }
  141. function resize() {
  142. let w = window.innerWidth;
  143. let h = window.innerHeight;
  144. if (canvas.width != w || canvas.height != h) {
  145. canvas.width = w;
  146. canvas.height = h;
  147. }
  148. camera.aspect = w / h;
  149. camera.updateProjectionMatrix();
  150. renderer.setSize(w, h);
  151. }
  152. init();
  153. })();
  154. </script>
  155. </body>
  156. </html>