如何正确使用gl Scissor实现弹出窗口

时间:2018-03-21 09:42:37

标签: javascript three.js

我正在尝试使用当前的webglview创建一个popview。

我的计划如下:每当我需要一个节目弹出窗口时,我创建一个scissorRect并开始向它渲染弹出场景。我希望保留以前屏幕的内容。据我所知,setScissor必须阻止清除弹出窗口之外的内容。但是弹出窗口以外的代码内容将是黑色的。注意当调用renderer.render()时会自动调用glclear

        if (this.options.showPopUP) {
            this.renderer.setScissorTest(true);

            this.renderer.setViewport(popupViewPort.x, popupViewPort.y, popupViewPort.z, popupViewPort.w);
            this.renderer.setScissor(popupViewPort.x, popupViewPort.y, popupViewPort.z, popupViewPort.w);

            this.renderer.render(this.popUpScene, camera.camera);
        }





    if (!this.options.showPopUP) {
        var size = this.renderer.getSize();
        this.renderer.setScissorTest(false);

        this.renderer.setViewport(0, 0, size.width, size.height);
        this.renderer.setScissor(0, 0, size.width, size.height);
        this.renderer.render(this.scene, camera.camera);

    }

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

“我希望保留上一个屏幕的内容”“当renderer.render()被称为”与彼此冲突时,注意glclear会自动调用吗?您应该渲染两者并在非弹出内容之后呈现弹出窗口。

var size = this.renderer.getSize();
this.renderer.setScissorTest(false);

this.renderer.setViewport(0, 0, size.width, size.height);
this.renderer.setScissor(0, 0, size.width, size.height);
this.renderer.render(this.scene, camera.camera);

if (this.options.showPopUP) {
    this.renderer.setScissorTest(true);

    this.renderer.setViewport(popupViewPort.x, popupViewPort.y, popupViewPort.z, popupViewPort.w);
    this.renderer.setScissor(popupViewPort.x, popupViewPort.y, popupViewPort.z, popupViewPort.w);

    this.renderer.render(this.popUpScene, camera.camera);
}

您可能希望在渲染弹出窗口之前清除颜色/ z缓冲区。