three.js畫布的剪裁方法setScissor()和視口方法setViewport()

該文章參考了網(wǎng)上的一些教程寫的,原文鏈接Three.js Canvas 畫布上局部渲染 剪裁方法 .setScissor() 和視口方法 .setViewport() - 文章教程 - 文江博客 (wenjiangs.com)three.js的學(xué)習(xí)資源太少了,官網(wǎng)的教程api寫的也是很模糊不清...

1、剪裁方法 setScissor()

剪裁方法.setScissor()通過(guò)四個(gè)參數(shù) (x, y, width, height) 定義一個(gè)矩形區(qū)域,這個(gè)矩形區(qū)域稱為剪裁區(qū)域或剪裁框。

  • x:剪裁框相對(duì)canvas畫布左側(cè)像素。默認(rèn)值:0。
  • y:剪裁框相對(duì)canvas畫布頂部像素。默認(rèn)值:0。
  • width:剪裁框區(qū)域?qū)挾?。默認(rèn)值:canvas畫布的寬度。
  • height:剪裁框區(qū)域高度。默認(rèn)值:canvas畫布的高度。
<html>

<head>
    <title>My first three.js app</title>
    <style>
        body {
            margin: 0;
        }

        canvas {
            width: 100%;
            height: 100%
        }
    </style>

</head>

<body>
    <script src="./js/three.js-master/build/three.js"></script>

    <script>
        // 場(chǎng)景、渲染器等初始化的操作
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        var geometry = new THREE.BoxBufferGeometry(1, 1, 1);
        var material = new THREE.MeshBasicMaterial({
            color: 0xffff00
        });
        var mesh = new THREE.Mesh(geometry, material);
        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
        //開啟WebGL剪裁測(cè)試功能,如果不開啟,.setScissor方法設(shè)置的范圍不起作用
        renderer.setScissorTest(true)
        // 渲染函數(shù)
        function render() {
            // 距離畫布左側(cè)50,頂部100   渲染區(qū)域?qū)捀叨榷际钱嫴紝捀叩娜种?            renderer.setScissor(100, 200, window.innerWidth / 3, window.innerHeight / 3);
            // setViewport方法設(shè)置的視口變換區(qū)域和剪裁方法setScissor設(shè)置的渲染區(qū)域保持一致
            // setScissor方法設(shè)置的是render影響范圍
            // setViewport方法影響的是圖形變換
            renderer.setViewport(100, 200, window.innerWidth / 3, window.innerHeight / 3)
            // 設(shè)置setScissor方法定義的渲染區(qū)域的背景顏色
            renderer.setClearColor(0xffffff, 1)
            renderer.render(scene, camera);
            mesh.rotateY(0.01);
            requestAnimationFrame(render);
        }
        render();
    </script>
</body>

</html>
2、同理,可以對(duì)多個(gè)區(qū)域進(jìn)行剪裁

剪裁方法 .setScissor() 設(shè)置兩個(gè)剪裁區(qū)域是互不影響

        // 場(chǎng)景、渲染器等初始化的操作
        var scene = new THREE.Scene();
        var camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
        var geometry = new THREE.BoxBufferGeometry(1, 1, 1);
        var material = new THREE.MeshBasicMaterial({
            color: 0xffff00
        });
        var mesh = new THREE.Mesh(geometry, material);
        var renderer = new THREE.WebGLRenderer();
        renderer.setSize(window.innerWidth, window.innerHeight);
        document.body.appendChild(renderer.domElement);
        //開啟WebGL剪裁測(cè)試功能,如果不開啟,.setScissor方法設(shè)置的范圍不起作用
        renderer.setScissorTest(true)
        // 渲染函數(shù)
        function render() {
            renderer.setScissor(50, 100, 100, 50);
            renderer.setViewport(50, 100, 100, 50)
            // 設(shè)置setScissor方法定義的渲染區(qū)域的背景顏色
            renderer.setClearColor(0xffffff, 1)
            renderer.render(scene, camera);

            // 同理,可以設(shè)置多個(gè)剪裁的區(qū)域部分
            renderer.setScissor(300, 100, 100, 50);
            renderer.setViewport(300, 100, 100, 50)
            // 設(shè)置setScissor方法定義的渲染區(qū)域的背景顏色
            renderer.setClearColor(0xffff00, 1)
            renderer.render(scene, camera);
            mesh.rotateY(0.01);
            requestAnimationFrame(render);
        }
        render();
3、setScissor()方法和setViewport()的區(qū)別

功能上劃分:

  • setScissor()是屬于剪裁方法
  • setViewport()是屬于視口方法

剪裁方法setScissor()定義的是Threejs渲染結(jié)果像素覆蓋影響的范圍,剪裁方法setScissor()并不影響Threejs場(chǎng)景中模型的平移縮放變換。
視口方法setViewport()影響Threejs場(chǎng)景中模型的平移縮放變換。

4、setScissorTest() 方法的作用

Threejs渲染器的剪裁測(cè)試方法setScissorTest()用于開啟WebGL剪裁區(qū)域功能,如果不開啟,setScissor方法設(shè)置的范圍不起作用該方法封裝了原生WebGL的代碼enable( gl.SCISSOR_TEST );disable( gl.SCISSOR_TEST );

renderer.setScissorTest(true); //開啟剪裁測(cè)試功能,等價(jià)于原生的WebGL:enable(gl.SCISSOR_TEST )
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容