固定功能 GPU 中的着色器
Shaders in Fixed Function GPUs
我一直在阅读有关 GPU 架构的更多信息,但有一点让我感到困惑。大多数资源将 "shaders" 定义为在图形管道的各个部分运行的一段代码,用于投影 3D 场景的最终渲染。较旧的 GPU 架构是 "fixed functions"...这是否意味着图形程序员当时真的无法控制如何将滤镜和效果应用于其 3D 场景?
现在有人可以向我确认一下 "programmable GPUs" 这是否意味着着色器 functions/programs 已发送到 GPU?
这让我想到了另一个想法,如果图形程序员无法控制,GPU 的术语 "fixed function" 是否意味着这些着色器是在硬件上实现的(通过 transistors/gates)?对不起,我是硬件新手,所以我的术语可能不正确。
遗留 'fixed-function' 管线在现代 GPU 着色器意义上不是完全可编程的。在最早的日子里,它是一个带有一些参数的软件渲染器,但在 90 年代后期,它在 Direct3D 6/7 中被称为顶点 "Hardware Transform & Light" 和像素 "Multitexturing" 。要控制固定功能管道,您可以设置 ton of state 来为各种操作配置它。换句话说,它是可配置但不是可编程。
现代 GPU 上的遗留 'fixed-function' 管道由可编程着色器模拟,您可以在 Direct3D FixedFuncEMU 示例中查看这些着色器的外观示例。因为它是为 Direct3D 9 及更早版本模拟的,所以 Direct3D 10 及更高版本根本不支持旧版固定功能管道。
即使在现代 GPU 上,管道的某些方面 'fixed function' 由可配置状态而非可编程着色器控制,例如三角形光栅化、渲染目标 alpha 混合、纹理采样,depth/stencil测试等。这里的权衡是非常快速和便宜的硬件实现的通用性较低,允许轻松复制这些功能单元。
Older GPU architectures were "fixed functions"... does this mean that graphics programmers then had really no control on how filters and effects were applied to their 3D scene?
没有。这意味着您必须在实现效果的方式上具有创造性。有些效果是绝对不可能实现的。对于其他效果,某些近似值是可能的。
最大的区别是,对于可自由编程的 GPU(着色器模型 2 或更高版本),它是将程序流控制到像素级别;将其视为能够 select在 Photoshop 或类似程序中使用一些画笔工具灵活地绘图。
使用固定功能 GPU,您可以做的基本上等同于处理整个层;您可以混合它们,将多个图层堆叠在一起,进行多次渲染等。凭借一些创造力,您可以实现非常疯狂的事情。我个人最引以为豪的成就是使用 GeForce2 class GPU(建于 1999 年)实现水波纹效果(完成近似折射和反射)。
This leads me to another thought, if graphics programmers had no control, does the term "fixed function" for the GPU mean that these shaders were implemented on hardware (through transistors/gates)?
没有。这意味着 根本没有着色器!
GPU 所做的基本上就是在屏幕上绘制纹理清晰的三角形,对传入的几何体应用一组固定的操作以将其转换到位并确定局部照明值。您可以将一些开关设置为 select,具体的计算应该发生,例如您可以加载多个纹理(在最新的固定功能硬件中最多 8 个)和 select 所谓的 "register combiners" select编辑了这些纹理应该如何 "mixed" 与其他东西。例如,您可以将法线贴图纹理与光方向矢量进行点积混合以调制照明(凹凸贴图);您也可以使用该法线纹理来确定立方体贴图的纹理坐标,以提供反射效果。
即使在今天的现代 GPU 上,也有一些方面不是完全可编程的(仅仅是因为很难使其具有高性能)。例如混合。与其说是实际的混合操作,不如说是昂贵的;问题是,它必须以某种方式组合像素,如果没有确定确切的操作,这会引入很多同步滞后。
我一直在阅读有关 GPU 架构的更多信息,但有一点让我感到困惑。大多数资源将 "shaders" 定义为在图形管道的各个部分运行的一段代码,用于投影 3D 场景的最终渲染。较旧的 GPU 架构是 "fixed functions"...这是否意味着图形程序员当时真的无法控制如何将滤镜和效果应用于其 3D 场景?
现在有人可以向我确认一下 "programmable GPUs" 这是否意味着着色器 functions/programs 已发送到 GPU?
这让我想到了另一个想法,如果图形程序员无法控制,GPU 的术语 "fixed function" 是否意味着这些着色器是在硬件上实现的(通过 transistors/gates)?对不起,我是硬件新手,所以我的术语可能不正确。
遗留 'fixed-function' 管线在现代 GPU 着色器意义上不是完全可编程的。在最早的日子里,它是一个带有一些参数的软件渲染器,但在 90 年代后期,它在 Direct3D 6/7 中被称为顶点 "Hardware Transform & Light" 和像素 "Multitexturing" 。要控制固定功能管道,您可以设置 ton of state 来为各种操作配置它。换句话说,它是可配置但不是可编程。
现代 GPU 上的遗留 'fixed-function' 管道由可编程着色器模拟,您可以在 Direct3D FixedFuncEMU 示例中查看这些着色器的外观示例。因为它是为 Direct3D 9 及更早版本模拟的,所以 Direct3D 10 及更高版本根本不支持旧版固定功能管道。
即使在现代 GPU 上,管道的某些方面 'fixed function' 由可配置状态而非可编程着色器控制,例如三角形光栅化、渲染目标 alpha 混合、纹理采样,depth/stencil测试等。这里的权衡是非常快速和便宜的硬件实现的通用性较低,允许轻松复制这些功能单元。
Older GPU architectures were "fixed functions"... does this mean that graphics programmers then had really no control on how filters and effects were applied to their 3D scene?
没有。这意味着您必须在实现效果的方式上具有创造性。有些效果是绝对不可能实现的。对于其他效果,某些近似值是可能的。
最大的区别是,对于可自由编程的 GPU(着色器模型 2 或更高版本),它是将程序流控制到像素级别;将其视为能够 select在 Photoshop 或类似程序中使用一些画笔工具灵活地绘图。
使用固定功能 GPU,您可以做的基本上等同于处理整个层;您可以混合它们,将多个图层堆叠在一起,进行多次渲染等。凭借一些创造力,您可以实现非常疯狂的事情。我个人最引以为豪的成就是使用 GeForce2 class GPU(建于 1999 年)实现水波纹效果(完成近似折射和反射)。
This leads me to another thought, if graphics programmers had no control, does the term "fixed function" for the GPU mean that these shaders were implemented on hardware (through transistors/gates)?
没有。这意味着 根本没有着色器!
GPU 所做的基本上就是在屏幕上绘制纹理清晰的三角形,对传入的几何体应用一组固定的操作以将其转换到位并确定局部照明值。您可以将一些开关设置为 select,具体的计算应该发生,例如您可以加载多个纹理(在最新的固定功能硬件中最多 8 个)和 select 所谓的 "register combiners" select编辑了这些纹理应该如何 "mixed" 与其他东西。例如,您可以将法线贴图纹理与光方向矢量进行点积混合以调制照明(凹凸贴图);您也可以使用该法线纹理来确定立方体贴图的纹理坐标,以提供反射效果。
即使在今天的现代 GPU 上,也有一些方面不是完全可编程的(仅仅是因为很难使其具有高性能)。例如混合。与其说是实际的混合操作,不如说是昂贵的;问题是,它必须以某种方式组合像素,如果没有确定确切的操作,这会引入很多同步滞后。