- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我渲染 3000 个模型实例并将它们保留在 View 区域中时,我得到 55FPS,但是如果我有 5000 个模型实例,但将其中 2000 个实例保留在 View 区域之外,我仍然得到 40 FPS。
camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.01, 10000);
是否有可能它正在正确地剔除,但事实上它必须确定它是否被剔除,是什么减慢了它的速度?我主要是从 https://github.com/mrdoob/three.js/blob/master/examples/webgl_buffergeometry_instancing_dynamic.html 中提取的
编辑*我知道我可以使用geometry.maxInstancedCount = trackCount;这很有帮助,但它与剔除不太一样,因为我已经在当前视口(viewport)之外进行了跟踪,但它仍然会损害性能
有什么建议吗?或者想法?
最佳答案
对于实例几何体, Three.js 无法进行任何视锥体剔除,因为没有有关对象最终位置的信息。这将在顶点着色器中计算,并且 Three.js 对那里发生的情况一无所知。
任何剔除发生的最早可能时间是在为每个实例的每个顶点运行顶点着色器之后。这已经解释了您所看到的帧速率下降的原因。尽管可见的对象/三角形数量相同,但顶点着色器调用数量却高达 166%。
如果您想自己实现剔除,您可以尝试重新排列每个帧的属性缓冲区中的实例(跳过不可见实例)并将最大实例计数调整为可见实例的数量。这可能有点违反直觉,但在每个帧上重新计算所有实例属性缓冲区实际上可以提供更好的性能。
要进行可见性测试,最简单的方法可能是使用 THREE.Frustum()
类和 frustum.containsPoint()
。看起来像这样
const frustum = new Frustum();
const projScreenMatrix = new Matrix();
// assume instances is an array of objects containing all the
// relevant information for all instances
const instances = [
// {position: ...}, {position: ...}, ...
];
// for every frame
projScreenMatrix.multiplyMatrices(
camera.projectionMatrix,
camera.matrixWorldInverse
);
frustum.setFromMatrix(projScreenMatrix);
let visibleInstanceCount = 0;
for (let i = 0; i < instanceCount; i++) {
const pos = instances[i].position;
if (!frustum.containsPoint(pos)) {
continue;
}
// add instance to instance-attribute buffers
pos.toArray(instancePositionBuffer, visibleInstanceCount * 3);
visibleInstanceCount++;
}
geometry.maxInstanceCount = visibleInstanceCount;
关于three.js - ThreeJS InstancedBufferGeometry 剔除问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51312342/
我有一个充满体素的世界,假设我的世界是 320*320*96 体素。我的想法是将整个世界加载到我的视频卡的内存中,这样在将新的“ block ”传输到 GPU 时就不会损失性能。为显示体素世界而生成的
我不知道如何告诉 libgdx 在透明贴花后面绘制绿色球体。 这是我的问题的示例图片: 贴花创建:前两个参数是宽度和高度,最后一个标志是透明与否。 Decal.newDecal(count * (GU
我有 vector ,我想检索一个包含所有条目的 vector ,这些条目在所有输入 vector 中的任何地方都不重复。 #include int main() { std::vector a
我正在尝试为网站设置代码块的样式。容器 div 设置为垂直和水平溢出。问题是当它水平溢出时,斑马条纹背景颜色被剔除。我也尝试过使用背景图片,但它也剔除了它。为什么会这样?我该如何解决? 谢谢。 图片:
我应该在调用 Canvas 绘制方法之前剔除元素还是让 Canvas 处理剔除。我是否应该实现如下逻辑: if(circle.x+circle.radius>=0 || circle.x-circle
我刚刚发现 Azure Blob 存储上有 100 GB 的日志文件/失败请求日志,这些日志文件多年来一直在累积。是否有管理它们的工具或技术 - 目录结构很复杂,因此它不像按日期排序那么简单(我使用
我是一名优秀的程序员,十分优秀!