shader学习笔记(一)
什么是shader?
Shader中文翻译 着色器,是一种较为短小的程序片段,用于高速图形硬件如何计算和输出图像,过去由汇编语言来编写,现在也可以使用高级语言来编写,
一句话概括:shader 是可编程图形管线的算法片段。
它主要分为两类,Vertex Shader和 Frament Shader
Vertex Shader顶点处理shader(计算机中图形都是无数个顶点组成的)
Frament Shader片段Shader(也可以说是顶点颜色填充处理)
什么是渲染管线?
渲染管线也称为渲染流水线,是显示芯片内部处理图形信号相互独立的并行处理单元。一个流水线是一个序列可以并行和按照固定顺序进行的阶段。每个阶段都从它的前一个阶段结束接收输入,然后把输出发给随后的阶段,就像一个在同一时间内,不同阶段不同汽车一起制造的装配线,传统的图形硬件流水线以流水的方式处理大量的顶点,几何图元和片段。
Vertex处理完后 Frament 处理
如果一次渲染有100顶点要处理,一次就会同时执行100次VertexShader的调用,类似上面说的汽车装配流水线,一次有100个车同时装配左车门,下一步骤就是同时装配右车门
下面是几个流程图
图1应用到展现的大概过程,GPU CPU分割线就是 调用GPUAPI 阶段的一次入口
图2和图1 意思大致一样
图3 GPU内的流程图,顺序从左到右。
第一步
Transform是指模型的空间变换也就是模型位置,
texGen(Texture coordinate generation) 纹理坐标生成
本来模型的纹理坐标是在做模型的时候赋予各个顶点的。
但是有时模型表面非常复杂,或者要做一些特效时,就需要其他方法来生成纹理坐标。
Lighting光照
这三部是一些GPU集成好的计算过程,无法修改。
VertexShader可以代替上面这些步骤,来自己编写这一步骤
第二步(不是很懂为什么不是之前先裁剪再进行顶点计算)
Culling裁剪(机的剥离不需要渲染的位置,减少GPU数据处理数量进行裁剪)
Depth Test深度测试(摄像机最近和最远的渲染区域)
第三步
Textuing纹理采样,就是一个顶点上应该渲染什么颜色值
Fog雾化,颜色值进行二次处理,做出雾的效果
上面这两点也是一些GPU集成的效果 这一步可以用FragmentShader来替代
第四部
Alpha Test进行透明测试,绘制变透明和全透明信息(不是很懂为什么这一步单独进行)
第五步
(教学上没讲,我查了下,渲染透明时需要做混合,也就是几次渲染颜色混合,尤其是透明渲染需要混合才能出来效果,类似调色板肯定需要 这个吧)
Blending就是控制透明的。处于光栅化的最后阶段。
这里例如我们给一个模型贴一个材质,那么在某个点计算出来颜色值称为源,而该点之前累积的颜色值。
渲染流程一次就是一次DC,
DrawCall是指CPU收集数据,传输给GPU调用GPU一次渲染命令,合理的控制DC可以增加你的渲染性能。
总结,渲染管线就是一次渲染流程,也是经常说的Draw Call一次DC。
Shader和材质,贴图的关系
Shader(着色器) 实际上就是一段脚本,它负责将输入的顶点数据以指定的方式和输入的贴图或者颜色算法,组合起来,然后输出,绘制图形单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的shader,以及对 Shader的特定的参数,将这些内容打包存储在一起,就得到一个Material 所谓的材质球,之后我们可以将材质赋予有带有顶点信息的三维物体进行渲染输出了。
材质好比引擎最终使用的商品,Shader好比生产这种商品的加工方法,而贴图就是原材料。
�>����