javascript - 将 renderer.clear() 放在 render() 的末尾会使我的场景变黑

标签 javascript three.js

我的代码是这样的:

function render() {
    renderer.render( scene, camera );
    renderer.clear();
}

我想知道为什么它会让我的场景变黑。这是因为颜色缓冲区在实际渲染之前被清除了吗?

这样效果很好:

function render() {
    renderer.clear();
    renderer.render( scene, camera );
}

但是在调用 clear() 之前如何确保颜色缓冲区已渲染?

我很好奇最后清除和开始清除之间的区别。

最佳答案

渲染之前和之后清除渲染器帧缓冲区的区别在于 WebGL 内容呈现到网页的方式。问题是 WebGL 总是至少是双缓冲的(在 WebGL Insights 书中,来自 Mozilla 的人说在 Firefox 中 WebGL Canvas 实际上是三缓冲的)。这意味着在 requestAnimationFrame 回调(在您的情况下为 render 函数)内,所有 WebGL 调用仅影响所谓的后台缓冲区。另一个缓冲区(称为前缓冲区)不受影响。然后,当回调结束时,浏览器交换缓冲区:后缓冲区变为前缓冲区,前缓冲区变为后缓冲区。然后浏览器使用新的前端缓冲区来绘制网页。下次调用 rAF 回调时,WebGL 将绘制新的后台缓冲区。需要注意的是,浏览器默认情况下不会在交换缓冲区内容时更改它们(尽管 preserveDrawingBuffer 上下文选项会改变这一点)。

回到你的问题,不同之处在于,当你第一次渲染场景然后清除缓冲区时,你首先会得到奇怪的结果,因为帧缓冲区包含先前渲染的相同帧的渲染结果(你不会看到这些结果)在屏幕上,它们只会在缓冲区的内存中),然后由于清除了缓冲区,所有这些都变得无关紧要。之后,浏览器将按原样向页面呈现干净的缓冲区,或者作为黑色矩形(或一些不同的颜色,具体取决于渲染器的选项)。但是,如果您先清除然后渲染场景,您将获得正确的结果:首先清除会消除前一帧的残留物,然后将新内容放入其中。然后浏览器将其呈现给页面。

所以,总结一下:我们通常首先清除帧缓冲区,以删除先前帧的任何痕迹,因此我们从“干净的石板”开始,然后向其渲染内容。

关于javascript - 将 renderer.clear() 放在 render() 的末尾会使我的场景变黑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44291993/

相关文章:

three.js - 在 three.js 中显示数千张图片

javascript - 编辑切片副本后原始数组仍然发生变化

javascript - GLTF加载对象拖拽使用三个js

javascript - 单击时使提交按钮消失

php - 通过 json_encode 使用 php 填充 highcharts

javascript - 动画 jQuery 属性不能使用变量?

javascript - Uncaught ReferenceError 。在 jQuery 事件处理程序中找不到原型(prototype)函数

3d - 旋转,然后翻译成three.js

javascript - HTTP/2 : stream. 使用 For-Loop 结束

three.js - 在 THREE.Js 的场景中添加同一导入模型的多个副本