我们看到随着每次 OpenGL 或 Direct3D 迭代,数据从系统逐渐传输到图形内存,首先是纹理,然后是顶点,现在甚至是着色器。如果这是获得性能的方法,为什么他们不能在 VRAM 上映射您需要的任何东西并完成它?将显存的着色器与显存的顶点分开是否太重要了?
1 回答
我们看到随着每次 OpenGL 或 Direct3D 迭代,数据从系统逐渐传输到图形内存
这不是我们所看到的。我们看到的是图形 API 的演变,使其抽象概念更接近硬件的实际功能。在 API 中没有缓冲区对象、着色器等概念的情况下,API 所做的一切都是浮云。让我们以陈旧的即时模式为例。最初的 GPU 实际上就是这样工作的。但是 2000 年之后构建的每个 GPU 都希望渲染成批的数据。执行即时模式调用需要 OpenGL 实现就地构建顶点数组,将顶点批处理到 glEnd 的单个绘制调用中。API 的变化反映了硬件的变化以及我们使用它的方式。
现在即使有着色器
你是什么意思?你指的是可分离的着色器对象吗?这与“移动它们”无关。
为什么他们不能在 VRAM 上映射你需要的任何东西
停止!OpenGL 没有定义显存。OpenGL 只定义了客户端内存和服务器内存。还有一个非常非常抽象的对象模型,其中内存是不透明的,无法直接访问。哎呀,使用 OpenGL 缓冲区对象甚至不能保证将东西放在 VRAM 中。完全是抽象的!
区别就在那里,因为这就是底层架构的设计方式。您可以在图形 API 中看到的渐变是由于硬件设计的渐变。
将纹理放置在图形内存中总是有意义的,但是将顶点数据放在那里是后来才发明的。然后这个概念在广义数据对象上得到了扩展(它被称为“超级缓冲区”一段时间)。
将显存的着色器与显存的顶点分开是否太重要了?
你在那里写的是什么分离?着色器是抽象对象,VBO 是抽象存储,纹理也是抽象的。