可编程管线
可编程管线的定制性高,开发者可以根据需要编写顶点渲染与像素渲染中的几个环节,如下图,蓝色底的为可编程的,有属于顶点渲染的顶点着色器,几何着色器,细分着色器和属于像素渲染的片元着色器(像素着色器),着色器可理解为一个小程序,一般我们开发者比较多也必须编写的是顶点着色器和片元着色器,而几何着色器和细分着色器是有默认的,使用默认的即可.
图片来自:OpenGL超级宝典笔记----渲染管线
以下简单介绍上图中的几个阶段:
顶点着色器
它可以用于执⾏自定义计算,实施新的变换,照明或者传统的固定功能所不允许的基于顶点的效果,例如:
- 矩阵变换位置
- 计算光照公式生成逐顶点颜色
- ⽣成/变换纹理坐标
下面是一段GLSL写的顶点着色器代码,需要我们手动编译和链接,具体的语法规则和使用后面会讲.
attribute vec4 position;//顶点坐标
attribute vec2 textCoordinate;//纹理坐标
uniform mat4 rotateMatrix;//变换矩阵
varying lowp vec2 varyTextCoord; //这个也是纹理坐标,通过这个属性传递给片元着色器
void main()
{
varyTextCoord = textCoordinate;
vec4 vPos = position;
vPos = vPos * rotateMatrix;
gl_Position = vPos;
}
基本图形组装(图元装配)
这个不能被开发者改变,这个阶段将顶点数据计算成一个个图元(点,线,三角形).
几何着色器
图元组装阶段的输出会传递给几何着色器(geometry shader)。几何着色器把基本图形形成的一系列顶点的集合作为输入,它可以通过产生新顶点构造出新的(或是其他的)基本图形来生成其他形状。
细分着色器
细分着色器(tessellation shaders)拥有把给定基本图形细分为更多小基本图形的能力。这样我们就能在物体更接近玩家的时候通过创建更多的三角形的方式创建出更加平滑的视觉效果。
光栅化(像素化)
在这个阶段绘制对应的图元(点/线/三角形). 光栅化就是将图元转化成一组二维片段的过程.而这些转化的片段将由片元着⾊器处理.这些⼆二维片段就是屏幕上可绘制的像素
光栅化流程
像素着色器(片元着色器)
它可以用于图片/视频/图形中每个像素的颜色填充(比如给视频添加滤镜,实际上就是将视频中每个图片的像素点颜色填充进行修改.)
- 计算颜⾊
- 获取纹理值
- 往像素点中填充颜色值(纹理值/颜色值);
varying lowp vec2 varyTextCoord;
uniform sampler2D colorMap;
void main()
{
gl_FragColor = texture2D(colorMap, varyTextCoord);
}
测试与混合
这个阶段检测像素的相应的深度(和stencil)值,使用这些来检查这个像素是否在另一个物体的前面或后面,如此做到相应取舍。这个阶段也会查看alpha值(alpha值是一个物体的透明度值)和物体之间的混合(blend)。所以即使在像素着色器中计算出来了一个像素所输出的颜色,最后的像素颜色在渲染多个三角形的时候也可能完全不同。
关于着色器编译及链接,请戳:使用GLSL加载图片
关于变换矩阵,请戳:变换矩阵
关于GLSL语法,请戳:GLSL语法
关于固定管线,请戳:固定管线
网友评论