固定功能vs基于着色器

Bre*_*ett 10 graphics shader

我是计算机图形学的初学者,我正在努力获得更好的理解.我的教授讨论了固定功能管道和基于着色器的编程.这两者如何相互比较?有什么不同?

Tom*_*mmy 13

固定功能管道顾名思义 - 功能是固定的.所以有人写了一个列表,列出了允许变换和光栅化几何的不同方法,这就是可用的一切.从广义上讲,您可以进行线性变换,然后通过纹理进行栅格化,在面上插入颜色,或者通过这些事物的组合和排列.但更重要的是,固定管道确实存在某些缺陷.

例如,在设计时很明显,没有足够的功率来计算每个像素的照明.因此,照明在顶点处计算并在面部上线性插值.

有一些与特定效果相关的中间扩展 - 例如,来自单一来源的每像素照明的dot3加立方图 - 但可编程管道允许您在每个阶段做任何您想做的事情,为您提供完全的灵活性.

首先,允许更好的照明,然后更好的一般特殊效果(反射水上的涟漪,不完美的玻璃等),并且最近已被用于延迟渲染等在其末端翻转管道的事物.

所有对固定功能流水线的支持都是通过在过去十年左右的硬件上编程可编程流水线来实现的.可编程管道是其前身的先进技术,由硬件改进提供.


Str*_*ngs 8

图形处理单元非常简单地使用固定功能启动,允许快速3D数学运算(比CPU数学快得多),纹理查找,以及一些简单的灯光和阴影选项(平面,phong等).

这些是非常基本的,但允许CPU将重复的3D渲染任务卸载到GPU.一旦将图形从CPU中取出并提供给GPU,游戏就实现了巨大的飞跃.

不久之后,需要将固定功能更改为汇编程序,并且很快需要做的不仅仅是固定功能GPU提供的简单着色,基本反射和单个纹理映射.

因此创建了第二代GPU,它有两个不同的管道,一个处理顶点程序并在3D空间中移动顶点,着色器程序使用像素,允许多个纹理合并,更多的灯光和阴影是创建.

现在,在GPU的最新形式中,卡中的所有管道都是通用的,并且可以运行任何类型的GPU汇编代码.这增加了管道的使用次数 - 它们仍然进行顶点映射和像素颜色计算,但它们也执行几何着色器(曲面细分),甚至还有计算着色器(其中并行处理器用于执行非图形作业) ).

所以固定功能有限但很容易,现在除了最有限的设备之外,现在都是.使用OpenGL(GLSL)或DirectX(HLSL)的可编程功能着色器是现代GPU的事实标准.


dat*_*olf 5

本质上,固定功能管道是固定程序的硬连线实现,GPU 处理的每条数据都会遍历该程序,而无法更改任何步骤的细节。您唯一可以参数化的是偶尔在程序中的硬编码路径之间切换的分支(例如启用或禁用照明,或使用单独的镜面反射)或使用的一些常量(灯光颜色和位置、纹理环境基色调制)。每一步都遵循特定的公式。

然而,在可编程管道中,GPU 是干净的。如何执行渲染过程的各个阶段(顶点变换、曲面细分、片段处理)完全取决于程序员。您可以使用您认为适合该任务的任何公式。

固定功能管道 GPU 仅有一种照明模式:朗伯照明模型,使用 Gourad 或 Phong 着色实现。有一些技巧可以稍微改变照明模型,例如使其成为各向异性,但为此您必须以某种方式智取(或超越)GPU。使用可编程管道,您只需做您最初想做的事情即可。