探究OpenGL光照模型的着色器实现
OpenGL的着色器是新一代显卡提供给开发者一个小程序,为的是让开发者对光照、坐标转换以及像素进行一些个性化的处理。OpenGL的着色器有一种专门的语言:GLSL,现在的GLSL应该全面转向Shader Model5,像我这样的初学者还需要花费更长的时间来学习才能基本了解OpenGL的着色器方面的知识。
下面两图展示了OpenGL从固定渲染管线到可编程渲染管线的变化
从图中我们可以很容易地看出,OpenGL的顶点着色器取代了固定渲染管线的转换、光照、纹理坐标生成和转换;片断着色器取代了纹理、颜色求和和雾的操作。在OpenGL3.2版本中加入了几何着色器(GeometryShader)这个概念,在OpenGL4.0中又添加了分格化控制(Tessellation Control)和分格化评估(Tessellation Evaluation)着色器,最新的OpenGL版本4.3则添加了计算着色器(Compute Shader)。看来OpenGL的着色器真是越来越复杂,越来越重要了。
下面介绍一下光照模型在顶点着色器的实现,所有的内容都可以在《OpenGL超级宝典(第四版)》中找到。
漫反射光照是一种简单的光照模型,它只考虑漫反射。它的公式是:
N是顶点的单位法线,L是表示从顶点到光源的单位向量方向。Cmat是表面材料的颜色,Cli是光线的颜色,Cdiff是最终的散射颜色。注意,N和L在传入之前一定要单位化。如果用顶点着色器来实现的话,则是:
uniform vec3 lightPos[1];
void main( void )
{
// 法线的MVP变换
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vec3 N = normalize( gl_NormalMat