[英]Shaders in Fixed Function GPUs
我一直在阅读有关GPU架构的更多信息,这使我感到困惑。 大多数资源将“着色器”定义为在图形管道的各个部分中运行以投影3D场景最终渲染的一段代码。 较早的GPU架构是“固定功能”……这是否意味着图形程序员真的无法控制如何将滤镜和效果应用于其3D场景?
现在有人可以向我确认我们拥有“可编程GPU”,这是否意味着着色器功能/程序已发送到GPU?
这使我想到另一个想法,如果图形程序员无法控制,GPU的“固定功能”一词是否意味着这些着色器是在硬件上实现的(通过晶体管/门)? 抱歉,我是硬件新手,所以我的术语可能不正确。
在现代GPU着色器的意义上,传统的“固定功能”管道无法完全编程。 最早的时候,它是带有某些参数的软件渲染器,但在90年代后期,在Direct3D 6/7中,顶点被称为“硬件变换和光照”,像素被称为“多纹理”。 要控制固定功能管道,您需要设置大量状态以对其进行各种操作进行配置。 换句话说,它是可配置的而不是可编程的 。
可编程着色器可模拟现代GPU上的传统“固定功能”流水线,您可以在Direct3D FixedFuncEMU示例中看到这些着色器的外观示例。 因为无论如何它都是针对Direct3D 9和更早版本进行仿真的,所以Direct3D 10和更高版本根本不支持旧的固定功能管道。
即使在现代GPU上,管线的某些方面也是“固定功能”,由可配置状态而非可编程着色器控制,例如三角形光栅化,渲染目标alpha混合,纹理采样,深度/模板测试等。这里的权衡是通用性较低,因此可以快速,廉价地实现硬件,从而可以轻松复制这些功能单元。
较早的GPU架构是“固定功能”……这是否意味着图形程序员真的无法控制如何将滤镜和效果应用于其3D场景?
否。这意味着您必须在实现效果的方式上富有创造力。 有些效果是绝对不可能实现的。 对于其他效果,某些近似是可能的。
最大的区别是,对于可自由编程的GPU(着色器模型2或更高版本),它是将程序流控制到像素级; 认为它能够使用Photoshop或类似程序中的某些画笔工具选择性地进行绘制。
使用固定功能的GPU,您所能做的基本上等同于处理整个图层。 您可以将它们混合,彼此堆叠几层,进行多次渲染等等。 有了一些创造力,您就可以实现一些疯狂的事情。 我个人最自豪的成就是使用GeForce2类GPU(建于1999年)实现了水波纹效果(具有近似的折射和反射效果)。
这使我想到另一个想法,如果图形程序员无法控制,GPU的“固定功能”一词是否意味着这些着色器是在硬件上实现的(通过晶体管/门)?
不,这意味着根本没有着色器!
从本质上讲,GPU在屏幕上绘制清晰纹理的三角形时所执行的操作,是对传入的几何体应用一组固定的操作,以将其转换到适当位置并确定局部照明值。 您可以选择几个开关,进行特定的计算,例如,您可以加载许多纹理(在最新的固定功能硬件中最多可以加载8个纹理),然后选择所谓的“寄存器组合器”,以选择这些纹理的方式应该与其他东西“混合”。 例如,您可以将法线贴图纹理与光方向矢量混合成点积,以调制照明(凹凸贴图); 您也可以使用普通纹理来确定立方体贴图的纹理坐标,以查找反射效果。
即使在当今的现代GPU上,有些方面也不是完全可编程的(这是因为要使其具有很高的性能非常困难)。 例如混合。 实际的混合操作并不算昂贵, 问题是,如果不精确操作,它必须以某种方式合并像素,这会引入很多同步滞后。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.