准确地说,shader是现代游戏程序(图形程序)里无法绕过的一个环节。
在传统GPU中,绘制的流程是固定的,利用驱动或者更高层面(DX、OpenGL)API把各种参数设置进去,然后投入数据就可以画了。在这个时代,如果要实现什么新的图形功能,都是以扩展或者补丁的方式实现的。
后来可编程的GPU管线出现了。最初是分为Vertex Shader和Pixel Shader(OpenGL里是Fragment Shader)两个可编程的部分(也就是在GPU上写代码)。前者是可以对传输进GPU的模型顶点进行变换,比如从三维空间的坐标转换到观察者眼睛里的坐标。后者可以对光栅化后的像素进行处理,比如gamma矫正、滤镜效果等等。可以看这个图:
发展到现在,除了Vertex和Fragment两种之外,还多出了对三维顶点进行几何拆分的shader,以及曲面细分的shader。可以看下面的图:
其中Hull Shader,Tessellator,Domain Shader都是负责曲面细分相关的工作,而Geometry Shader用来扩展形状、创建新的顶点。
RenderMonkey这些属于Shader编辑用的工具,它虽然停止维护了,但是Shader依然在发挥作用。另外,也看到有不少新的工具出现,比如unity里的(第三方?)shader编辑工具,以及visual studio也有shader设计器了。
另外说到shader被淘汰,那个时候可能是GPGPU(通用GPU)普及的时候吧。现在的CUDA、OpenCL一类的工具可以用GPU进行像普通CPU代码一样的计算,但对于专门的图形方面,GPU的管线有不少优化的地方,而GPGPU可能会有额外的开销。所以shader被完全取代可能要等非常以后的未来了,现在还是属于游戏的必不可少的部分。
necolo 1年前
发布