一、顶点着色器
顶点着色器,根据应用程序的设计,只是选择处理:
1.视觉空间变换(模型,法线,纹理).
2.主颜色和辅助颜色的计算生成(光照在摄像机坐标系中进行实时光照计算).
3.纹理坐标计算。
4.雾坐标设置和处理。
5.点大小。
新的顶点着色器或者支持更多的处理。并不是顶点管线的所有操作都可以用顶点着色器替代,下面的一些操作仍然是由固定管线处理:
1)透视除法。硬件实现。
2)视口映射变换。硬件实现。
3)图元装配,在4D裁剪空间中,进行视锥裁剪之前进行。
4)平截头体(视景体)和用户裁剪。
5)背面剔除,视口变换后,光栅化之前进行。
6)双面光照选择。
7)多边形模式处理。(可能是指凹凸模式,着色模式,三角带三角网格模式).
8)多边形偏移,在图元装配阶段进行偏移。
9)深度范围截取,glDepthRange设置后,固定管线内的实现代码进行设置。
顶点着色器,引入的更多实时光照计算,可控制的图形顶点变换效果(从CPU端移动到GPU端),纹理变换,雾,点大小设置可以有效的控制GPU Shader来实现;且其它的OpenGL状态设置,例如背面剔除,多次渲染Pass状态等更加方便的统一到Shader中进行设置。
二、片断着色器(像素着色器)
片段着色器之前,还进行了光栅化插值操作,也是硬件实现的。
片段着色器可以处理的操作是:
1.提取纹理单元,用于纹理贴图。
2.纹理应用。
3.雾.
4.主颜色和辅助颜色汇合。
不论是否使用片断着色器,OGL固定管线都要执行下面的操作:
1)单调或平滑着色(控制片断之间的插值,还需要一层内部过渡处理的)。
2)像素覆盖计算。根据圆形像素点大小,覆盖到的方形像素格子的大小。
3)像素所有权测试. 像素位置是不是当前OGL context实例所有,被其它OGL实例窗口遮挡了则不是。
4)裁剪操作。像素级别还是要进行裁剪的,用户设置的scissor裁剪。
5)点画模式应用(实线虚线,OGL 3.0后已经废除了,OGL3.1删除了)。
6)scissortest,裁剪测试。
7)alpha测试(OGL 3.1后删除了,并用片段着色器替代)。
8)模板测试。
9)深度测试,是基于像素上才能应用深度测试,视口变换后写入glDepthRange是顶点级别还不能确定)
10)alpha混合,blend操作,当前drawcall得到的颜色和原来在后台颜色缓存区中的颜色混合,混合后会在临时缓存会再写入后台颜色缓存,默认写入时GL_COPY。
11)对像素进行逻辑操作,glLogicOP默认是GL_COPY.
12)颜色值的抖动,混合周边的颜色,使得颜色更加丰富些,一般现代硬件都不需要,OGLES上还是需要的默认开启。
13)颜色掩码操作glColorMask, 模板和深度缓存也是有Mask的。
来自 <http://blog.csdn.net/blues1021/article/details/53168185>
Lambertian 着色法
L=kdImax(0,n⋅l)
L 是像素颜色, kd 是散射系数, I 是光照强度, n 和 l 是光源方向和法向量的单位向量。
Blinn-Phong 着色法
L=kdImax(0,n⋅l)+ksImax(0,n⋅h)p
h 是半角向量,ks 是高亮系数,p为Phong指数
Ambient 着色法
L=kaIa+kdImax(0,n⋅l)+ksImax(0,n⋅h)n
ka 是环境系数,Ia 是环境光照强度
多点光源
光有一个非常有用的性质——叠加性,可以得到多点光源下的计算公式:
L=kaIa+∑i=1n[kdIimax(0,n⋅li)+ksIimax(0,n⋅hi)p]
来自 <http://blog.csdn.net/qq_33274326/article/details/54607173>