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