【问题标题】:Three.js usage with stencil bufferThree.js 与模板缓冲区的使用
【发布时间】:2016-05-03 13:45:10
【问题描述】:

我无法将场景绘制成作为模板蒙版创建的形状。相反,代码似乎只是将模板本身呈现为黑色对象。

http://signaturefloors.dev.flooradvisor.com.au/productapp/floor_align.php

我的渲染函数是:

var gl = floor_align.renderer.domElement.getContext('webgl') || floor_align.renderer.domElement.getContext('experimental-webgl');
gl.clearStencil(0);
gl.clear(gl.STENCIL_BUFFER_BIT);
gl.enable(gl.STENCIL_TEST);
gl.stencilFunc(gl.ALWAYS, 1, 1);
gl.stencilOp(gl.KEEP, gl.REPLACE, gl.REPLACE);
gl.colorMask(0, 0, 0, 0);

// Floor Mask (Create a stencil that we render the next pass into)
floor_align.renderer.render(floor_align.maskScene, floor_align.maskCamera);

gl.colorMask(1, 1, 1, 1);
gl.stencilFunc(gl.NOTEQUAL, 1, 1);
gl.stencilOp(gl.KEEP, gl.REPLACE, gl.REPLACE);

// Render a floor pass
floor_align.renderer.render(floor_align.scene, floor_align.camera);

gl.disable(gl.STENCIL_TEST);

渲染器有autoClear = false;

【问题讨论】:

    标签: three.js webgl


    【解决方案1】:

    接受的答案不适用于最新的threejs。如果有人感兴趣,这里有一个最新版本(使用 r111):

    
            gl.enable(gl.STENCIL_TEST);
            gl.stencilOp(gl.KEEP, gl.KEEP, gl.REPLACE);
    
            //renderer.clear(); <-- works without this too
    
            gl.stencilFunc(gl.ALWAYS, 1, 0xFF);
            gl.stencilMask(0xFF);
            renderer.render(maskScene, camera);
    
            gl.stencilFunc(gl.EQUAL, 1, 0xFF);
            gl.stencilMask(0x00);
    
            renderer.render(scene, camera);
            gl.stencilMask(0xFF);
            gl.disable(gl.STENCIL_TEST);
    

    在我的情况下,我没有禁用自动清除,它仍然有效。

    【讨论】:

      【解决方案2】:

      通过反复试验,我将我的代码更新为这个,现在它可以工作了。清除深度缓冲区似乎特别重要,所以我猜我的面具一定是隐藏了更远的地板碎片。

      // Render the scene
      function fla_render() {
      
          floor_align.renderer.clear();
      
          // Background
          //floor_align.renderer.render(floor_align.scene, floor_align.camera);
      
          floor_align.renderer.clearDepth();
      
          var gl = floor_align.renderer.domElement.getContext('webgl') || floor_align.renderer.domElement.getContext('experimental-webgl');
      
          // Clear the stencil buffer
          gl.clearStencil(0);
          gl.clear(gl.STENCIL_BUFFER_BIT);
      
          // Replacing the values at the stencil buffer to 1 on every pixel we draw
          gl.stencilFunc(gl.ALWAYS, 1, 1);
          gl.stencilOp(gl.KEEP, gl.REPLACE, gl.REPLACE);
      
          // Disable color (u can also disable here the depth buffers)
          gl.colorMask(false, false, false, false);
      
          // Write to stencil
          gl.enable(gl.STENCIL_TEST);
      
          // Floor Mask (Create a stencil that we render the next pass into)
          floor_align.renderer.render(floor_align.maskScene, floor_align.maskCamera);
      
          // Telling the stencil now to draw/keep only pixels that equals 1 - which we set earlier
          gl.stencilFunc(gl.EQUAL, 1, 1);
          gl.stencilOp(gl.KEEP, gl.KEEP, gl.KEEP);
      
          // Clear depth buffer (seems important)
          floor_align.renderer.clearDepth();
      
          // Enable color
          gl.colorMask(true, true, true, true);
      
          // Render a floor pass
          floor_align.renderer.render(floor_align.scene, floor_align.camera);
      
          // Disable stencil test;
          gl.disable(gl.STENCIL_TEST);
      
      }
      

      【讨论】:

        猜你喜欢
        • 2013-02-27
        • 2012-03-13
        • 2012-07-08
        • 2011-09-05
        • 2020-11-27
        • 2013-04-08
        • 2020-04-19
        • 2012-07-11
        • 2016-01-31
        相关资源
        最近更新 更多