C++ 为什么图形管道如此专业化?(OpenGL)

C++ 为什么图形管道如此专业化?(OpenGL),c++,opengl,C++,Opengl,OpenGL图形管道每年都在变化。因此,可编程管道正在增长。最后,作为一名opengl程序员,我们创建了许多小程序(顶点、片段、几何体、镶嵌等) 为什么两个阶段之间有如此高的专业化程度?它们是否都在硬件的不同部分上运行?为什么不编写一个代码块来描述最后应该出现的内容,而不是在各个阶段之间切换 在这个管道PDF中,我们看到了野兽。因为每个阶段都有不同的目的 顶点是将点变换到它们应该在屏幕上的位置 片段用于每个片段(读取:三角形的像素)并应用照明和颜色 几何体和细分都做经典顶点和片段着色器无法做的

OpenGL图形管道每年都在变化。因此,可编程管道正在增长。最后,作为一名opengl程序员,我们创建了许多小程序(顶点、片段、几何体、镶嵌等)

为什么两个阶段之间有如此高的专业化程度?它们是否都在硬件的不同部分上运行?为什么不编写一个代码块来描述最后应该出现的内容,而不是在各个阶段之间切换


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

因为每个阶段都有不同的目的

顶点是将点变换到它们应该在屏幕上的位置

片段用于每个片段(读取:三角形的像素)并应用照明和颜色

几何体和细分都做经典顶点和片段着色器无法做的事情(用其他基本体替换绘制的基本体),并且都是可选的


如果仔细查看该PDF,您将看到每个着色器的不同输入和输出/

历史上,对于不同的可编程部件,实际上有不同的处理单元-例如,有顶点着色器处理器和片段着色器处理器。如今,GPU采用“统一着色器体系结构”,所有类型的着色器都在相同的处理单元上执行。这就是为什么非图形化使用GPU,如CUDA或OpenCL是可能的(或者至少是容易的)

请注意,不同的着色器具有不同的输入/输出-为每个顶点执行顶点着色器,为每个基本体执行几何体着色器,为每个片段执行片段着色器。我不认为这可以很容易地在一大块代码中捕获

最后但绝对不是最不重要的一点是性能。可编程部件(如光栅化)之间仍有固定的功能阶段。对于其中一些,如果不将性能降低到爬网

,“地震”(游戏)时代,开发人员可以自由地对其CPU渲染实现进行任何操作,他们控制着“管道”中的一切

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

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

  • GPU能力和成本;GPU随着每次迭代而发展,它是 扔掉你所有的架构并替换它是胡说八道 一夜之间,你会在每次迭代中添加新的特性和增强,尤其是 当开发人员要求时(例如:细分阶段)。想想CPU,英特尔试图用安腾取代x86架构,失去了向后兼容性,失败了,他们最终复制了AMD使用AMDx64架构的做法
  • 由于传统应用程序的支持,它们也无法完全取代传统应用程序,而传统应用程序的使用比人们预期的要广泛

分离每个着色器阶段还允许您混合和匹配从OpenGL 4.1开始的着色器。例如,可以将一个顶点着色器与多个不同的片段着色器一起使用,并根据需要交换片段着色器。当着色器被指定为单个代码块时,如果不是不可能的话,那么这样做是很棘手的


有关该功能的更多信息:

主要是因为如果没有必要,没有人愿意重新发明车轮

如果开发人员必须从头开始编程来绘制一个三角形,那么许多仍然是固定功能的特殊事物只会使开发人员的生活更加困难。例如,如果您必须自己实现基本覆盖或处理属性插值,那么光栅化将非常糟糕。它可能会增加一些新的灵活性,但绝大多数软件并不需要这种灵活性,开发人员从从不考虑这类事情中获益匪浅,除非他们考虑到一些专门的应用程序


说实话,如果您愿意,您可以使用计算着色器自己实现整个图形管道。性能通常不会与通过传统渲染管道推送顶点相比具有竞争力,并且所需的工作量将非常艰巨,但在现有硬件上是可行的。实际上,这种方法对光栅化图形没有太多好处,但使用计算着色器实现基于光线跟踪的管道可能是一种值得花费时间的方法。

感谢您的回答,但如果我们可以将此阶段视为一个带有方法的类(虚拟),则会容易得多。是否也因为向后兼容?