我是计算机图形学的初学者,正在努力更好地理解。我的教授讨论了固定功能管道和基于着色器的编程。这两者如何相互比较?有什么不同?
3 回答
固定功能管道顾名思义——功能是固定的。因此,有人写了一个列表,列出了允许您转换和栅格化几何图形的不同方法,这就是所有可用的方法。从广义上讲,您可以进行线性变换,然后通过纹理化、在脸上插入颜色或通过这些事物的组合和排列来光栅化。但不仅如此,固定管道还存在某些缺陷。
例如,在设计时很明显,没有足够的功率来计算每个像素的光照。所以光照是在顶点计算的,并在整个面上线性插值。
有一些与特定效果相关的中间扩展——例如,dot3 加立方体贴图,用于来自单一来源的每像素照明——但可编程管道允许您在每个阶段做任何您想做的事情,为您提供完全的灵活性。
首先允许更好的照明,然后是更好的一般特殊效果(反射水面上的涟漪,不完美的玻璃等),最近已被用于延迟渲染之类的东西,它会翻转管道。
对固定功能流水线的所有支持都是通过在过去十年左右的硬件上对可编程流水线进行编程来实现的。可编程流水线是其前身的进步,由硬件改进提供。
图形处理单元从非常简单的固定函数开始,允许快速 3D 数学(比 CPU 数学快得多)、纹理查找以及一些简单的照明和着色选项(平面、phong 等)。
这些是非常基本的,但允许 CPU 将非常重复的 3D 渲染任务卸载到 GPU。一旦图形从 CPU 中取出,交给 GPU,游戏就实现了巨大的飞跃。
不久之后,需要将固定功能更改为汇编程序,并且很快就需要做的不仅仅是固定功能 GPU 提供的简单着色、基本反射和单一纹理贴图。
因此创建了第二种 GPU,它有两个不同的管道,一个处理顶点程序并在 3D 空间中移动顶点,另一个处理像素的着色器程序允许合并多个纹理,以及更多的灯光和阴影创建的。
现在在最新形式的 GPU 中,卡中的所有管道都是通用的,并且可以运行任何类型的 GPU 汇编代码。这增加了管道的使用次数——它们仍然进行顶点映射和像素颜色计算,但它们也进行几何着色器(镶嵌),甚至计算着色器(并行处理器用于执行非图形工作) )。
因此,固定功能是有限的,但很容易,现在除了最有限的设备之外的所有设备。使用 OpenGL (GLSL) 或 DirectX (HLSL) 的可编程函数着色器是现代 GPU 的事实标准。
本质上,固定功能管道是一个固定程序的硬连线实现,GPU 处理的每条数据都通过该程序遍历,而不能更改任何步骤的细节。您唯一可以参数化的是在程序中的硬编码路径之间切换的偶尔分支(例如启用或禁用照明,或使用单独的镜面反射)或使用的一些常量(灯光颜色和位置,纹理环境基础颜色调制)。每一步都遵循一个特定的公式。
然而,在可编程管道中,GPU 是干净的。如何执行渲染过程的各个阶段(顶点变换、镶嵌、片段处理)完全取决于程序员。您可以使用任何您认为适合该任务的公式。
固定功能管线 GPU 仅具有一种照明模式:朗伯照明模型,使用 Gourad 或 Phong 着色实现。有一些技巧可以稍微改变照明模型,例如使其具有各向异性,但您必须以某种方式超越(或笨拙地成为磨练者)GPU。使用可编程管道,您只需做您想做的事情。