为什么图形管道如此高度专业化?(OpenGL的)

use*_*754 8 c++ opengl

OpenGL图形管道每年都在变化.因此可编程管道正在增长.最后,作为一个opengl程序员,我们创建了许多小程序(Vertex,Fragment,Geometry,Tessellation,..)

为什么各阶段之间存在如此高的专业化?它们都运行在硬件的不同部分吗?为什么不写一个代码块来描述最终应该出现什么而不是在各个阶段之间玩杂耍呢?

http://www.g-truc.net/doc/OpenGL%204.3%20Pipeline%20Map.pdf

在这个管道PDF中我们看到了野兽.

con*_*t3d 7

在"Quake"(游戏)时代,开发人员可以自由地使用CPU渲染实现做任何事情,他们可以控制"管道"中的所有内容.

随着固定管道和GPU的引入,您可以获得"更好"的性能,但却失去了很多自由.图形开发人员正在努力恢复自由.因此,每天都有更多的定制管道.GPU现在甚至可以使用CUDA/OpenCL等技术进行"完全"编程,即使它不是严格意义上的图形.

另一方面,GPU厂商无法在一夜之间用完全可编程的管道替换整个管道.在我看来,这归结为多种原因;

  • GPU功能和成本; GPU随着每次迭代而发展,抛弃你拥有的所有架构并在一夜之间替换它是无稽之谈,而是每次迭代都添加新功能和增强功能,特别是当开发人员要求它时(例如:Tessellation阶段).考虑到CPU,英特尔试图用Itanium取代x86架构,失去向后兼容性,失败了,他们最终复制了AMD对AMDx64架构的所作所为.
  • 由于遗留应用程序支持,它们也无法完全取代它,后者比人们预期的更广泛使用.


Rei*_*ica 5

从历史上看,不同的可编程部件实际上有不同的处理单元 - 例如,有Vertex Shader处理器和Fragment Shader处理器.如今,GPU采用"统一着色器架构",其中所有类型的着色器都在相同的处理单元上执行.这就是为什么非图形使用GPU(如CUDA或OpenCL)是可能的(或者至少是简单的).

请注意,不同的着色器具有不同的输入/输出 - 为每个顶点执行顶点着色器,为每个基元执行几何着色器,为每个片段执行片段着色器.我不认为这可以在一大块代码中轻松捕获.

表现最后,但绝对是最不可靠的.可编程部件之间仍然存在固定功能阶段(例如光栅化).而对于其中的一些,这是根本不可能的,而不会降低性能提升到一个使它们可编程(或可调用在管道的具体时间外)抓取.