Graphics 固定功能与基于着色器

Graphics 固定功能与基于着色器,graphics,shader,Graphics,Shader,我是计算机图形学的初学者,我正在努力更好地理解计算机图形学。我的教授讨论了固定函数管道和基于着色器的编程。这两者相比如何?有什么不同吗?固定功能管道正如其名称所示-功能是固定的。所以有人写了一个列表,列出了允许你变换和光栅化几何体的不同方法,这就是所有可用的方法。从广义上讲,你可以做线性变换,然后通过纹理,在一张脸上插入一种颜色,或者通过这些东西的组合和排列来光栅化。但除此之外,固定管道还存在某些缺陷 例如,在设计时很明显,没有足够的功率来计算每像素的照明。因此,在顶点处计算照明,并在整个面上进

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

固定功能管道正如其名称所示-功能是固定的。所以有人写了一个列表,列出了允许你变换和光栅化几何体的不同方法,这就是所有可用的方法。从广义上讲,你可以做线性变换,然后通过纹理,在一张脸上插入一种颜色,或者通过这些东西的组合和排列来光栅化。但除此之外,固定管道还存在某些缺陷

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

有一些与特定效果相关的中间扩展—例如,dot3加上用于单个光源的每像素照明的立方体贴图—但是可编程管道允许您在每个阶段做任何您想做的事情,给您完全的灵活性

首先,它允许更好的照明,然后是更好的一般特殊效果(反射水上的涟漪、不完美的玻璃等),最近被用于延迟渲染,从而翻转管道末端


所有对固定功能管道的支持都是通过在过去十年左右的硬件上编程可编程管道来实现的。可编程流水线是其前身的一个进步,硬件改进提供了这一点。

图形处理单元一开始非常简单,具有固定的功能,允许快速3D数学(比CPU数学快得多)和纹理查找,以及一些简单的照明和着色选项(平板、phong等)

这些都是非常基本的,但允许CPU将非常重复的3D渲染任务卸载到GPU上。一旦图形从CPU上取下,交给GPU,游戏就有了巨大的飞跃

不久之后,固定功能就需要改为汇编程序,很快就需要做的不仅仅是固定功能GPU提供的简单着色、基本反射和单一纹理贴图

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

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


因此,固定功能是有限的,但很容易,现在在过去的所有,但最有限的设备。使用OpenGL(GLSL)或DirectX(HLSL)的可编程函数着色器是现代GPU事实上的标准。

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

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

固定功能管道GPU只有一种照明模式:Lambertian照明模型,使用Gourad或Phong着色实现。有一些技巧可以稍微改变照明模型,例如各向异性,但是你必须以某种方式比GPU更聪明(或更笨才能成为hones)。使用可编程管道,您只需做您想做的事情