问题标签 [geometry-instancing]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 在 OpenGL 中实例化数百万个对象:提高每秒帧数
我的最终目标是以 60 fps 的速度渲染 100 万个不同大小和颜色的球体。我也希望能够在屏幕上移动相机。
我已经修改了我正在学习的教程的此页面上的代码,以尝试实例化许多球体。但是,我发现在 64 球时,我的 fps 低于 60,而在 900 球时,我的 fps 仅为区区 4。我对实例化的理解是幼稚的,但我相信我应该获得比每秒更多的帧数这个。只有 64 个球体应该可以达到 60 fps。我相信我在某种程度上导致 CPU 和 GPU 的通信频率超出了它们应有的频率。所以我的问题是:我如何实例化这么多对象(理想情况下是数百万)而不导致 fps 下降(理想情况下为 60 fps)?
我通过(10 / time_elapsed)
每 10 帧计算一次来计算 fps,这time_elapsed
是自上次 fps 调用以来经过的时间。我正在使用printf
代码的第 118 行将其打印出来。
我一直在通过本教程学习 OpenGL ,因此我在 Visual Studio 2013 中使用32 位 GLEW和32 位 GLFW 。我在具有2.30 GHz CPU的 64 位操作系统 (Windows 7) 上有 8 GB RAM 。
我已经尝试根据上面的教程编写自己的示例。源代码:
(将第 2 行设置为要实例化的球体的数量。确保第 2 行具有整数平方根。将第 4 行设置为球体的细节,它可以达到的最低值是 0。更高的数字 =更详细。)
顶点着色器:(命名为 core.vs)
片段着色器:(命名为 core.frag)
着色器类:(命名为 Shader.h)
opengl - 提高实例化几何场景的帧率
我正在渲染大量(数百万)实例化几何体。几何本身很简单,一个没有底面的盒子。渲染的场景实际上是一个 3D 图形,其中框是线(使用剔除一次仅渲染 3 个面)。
当场景占据屏幕的小区域(缩小或小窗口)时,帧率还可以,但当它变得更大时,帧率会低于可接受的水平。场景不会不断重绘,只是在用户更改视图(旋转、缩放)并且帧速率限制为 60 fps 时。
首先,确定问题。我不确定我是否达到了填充率限制或像素着色器吞吐量限制(多处理器太少而无法处理所有片段)。像素着色器什么都不做,只是输出颜色,但这仍然会导致处理器运行代码。我在 Optimus 架构中的 Nvidia 635m 上运行它,并且可以预期类似的移动 GPU 可以运行它。我如何确定哪些是问题?
确定问题后的下一步就是解决问题。通常,没有很多遮挡片段(就像我渲染一个房间然后在它前面放置墙一样),因此在这方面进行优化会有边际改进。还有什么其他方法可以提高帧率?
c - OpenGL属性除数的最大值
在 OpenGL 中绘制实例时,属性除数只能设置为 255 作为最大值,因此要组合大网格我必须分成几个实例。我需要更多地了解 OpenGL 中的除数,最大限制是否取决于驱动程序/GPU,或者每个设备上总是 255?
javascript - 实例化 vs bufferGeometry vs interleavedBuffer
我需要绘制数千个具有位置、大小和颜色属性的点和线,它们的位置是动态的(拖动时交互)。
直到现在我一直在使用缓冲区几何,但现在我又发现了两件事
- 实例化
- 交错缓冲区
我想知道这些是什么以及它们是如何工作的?它们的优点和缺点是什么?它们更适合我的情况还是简单的缓冲区几何最适合我?
你能给我一个完整的比较这三个吗?
webgl2 - 使用 TWGL.js 除数错误的 Webgl2 实例绘制
我正在使用 Twgl.js 库来使用 webgl2
我有一个如下所示的数组,我正在使用它制作缓冲区并与 VAO 一起createBufferInfoFromArrays
使用drawObjectList
来绘制它,但是在我更改我的数组以使用一些无符号字节值而不是浮点数之后,我遇到了哪个 chrome 导致此错误的问题
更改前的数组:
更改后的数组
错误是说没有没有除数的缓冲区,但第一个(pos 缓冲区)没有除数!我错了什么?
提前致谢
c++11 - OpenGL 碰撞检测与实例化对象
我在我的项目中实现了碰撞检测,所以我为每个对象都有一个原点以及最大和最小顶点,所以我可以计算出碰撞检测根本不准确,这是我在那个阶段想要的,但我可能有很多实例对象,这只是一个对象并使用我传递给它的变换矩阵在顶点着色器中重复多次。我在 CPU 中进行了碰撞测试,所以除了它们的矩阵数组之外,它对实例一无所知。我可以应用我用于实例化对象的方法吗?
webgl2 - Webgl 着色器属性类型不匹配
我有一个像这样的缓冲区,用它来实例化曲线几何
Distance: {
numComponents: 1,
data: new Uint8Array(0),
type: gl.BYTE , // signed byte
normalize: true,
divisor: 1
}
顶点着色器是:
片段着色器是:
当我运行代码时,它没有给我任何错误,但只有一个警告
[.Offscreen-For-WebGL-00000200FD87E610]GL ERROR :GL_INVALID_OPERATION : glDrawArraysIntancedANGLE: vertexAttrib function must match shader attrib type
任何人都可以帮助我我做错了什么吗?
提前致谢
three.js - Three.js InstancedBufferGeometry 中的每个实例 UV 纹理映射
我有一个由单个平面组成的 InstancedBufferGeometry:
我将纹理应用到每个平面,它按预期工作,但是我希望将纹理的不同区域应用到每个实例,我不确定正确的方法。
目前,我尝试根据单个平面的 uv 结构为每个实例构建 uv:
当我这样做时,我没有任何错误,但每个实例都只是一种颜色(所有实例都是相同的颜色)。我尝试更改实例大小以及每个属性的网格(我不完全理解,努力在文档中找到一个好的解释)。
我觉得我很接近,但我错过了一些东西,所以在正确的方向上的一点会很棒!
(作为参考,这是我的着色器):
opengl - 如何使用实例化生成 2 个不同的纹理?
例如,我有两个变换矩阵:WVP_Left 和 WVP_Right。
我可以使用实例化生成左纹理和右纹理来渲染几何体(如兔子)吗?
左侧纹理应该只有一只具有 WVP_Left 效果的兔子,而右侧纹理应该只有一只具有 WVP_Right 效果的兔子。
现在,我得到两个纹理,它们都有 2 只兔子和一些重叠部分。
我该如何解决?
我不想将左右场景渲染为一个纹理,并在另一遍中将其拆分为 2 个纹理。
另外,我不想使用几何着色器来完成这件事,因为几何着色器会增加 GPU 的工作量
opengl - 无法理解合并实例的概念
我正在阅读有关“合并实例化”的演示文稿中的幻灯片。(演示文稿来自 Emil Persson,链接:www.humus.name/Articles/Persson_GraphicsGemsForGames.pptx,来自幻灯片 19)
我不明白发生了什么,我只知道来自openGL的实例,我认为它只能多次绘制相同的网格。有人可以解释一下吗?它与directX 的工作方式不同吗?