完成了最简单的着色器sample后,我们学一下shader基于片元的光照。
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
代码也都加过注释,这里也不做过多累述。效果如下图所示:
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
那么怎么在工程里调用shader呢?我这里给大家提供了一个文教叫做“glslprogram.cpp”,包含了C++的类用来处理shader相关操作。文件在github上。主要调用方法如下:

拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
这是加载,编译和连接shader的,如果报错,也会打出相应的错误信息日志,以供debug。

下面是调用方法,在OpenGL的Display()函数(或实现相同功能的函数)中,这样使用这个C++类:

拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
所有和shader相关的参数设置放在Use()和Use(0)之间。

如果要使用纹理映射的话,其实和之前区别也并不大,首先写好shader内容:
完成了最简单的着色器sample后,我们学一下shader基于片元的光照。
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
然后回到你的C++文件中,在Use()和Use(0)之间,如下设置参数以及绑定纹理:
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
注意你为shader设置的参数要和你当前纹理号相对应,如上图红色区域。

这样就又可以得到地球啦,只是这次是基于shader来做的:
拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
关于shader目前就先讲这么多,具体demo可以到公司Github官网下载。Shader其实还是很复杂的内容,我曾今一个学期学习了shader相关内容,被虐得很惨,今天这一讲内容只是非常浅显的内容,还涉及不到一些复杂的算法等。但是应用还是非常广泛的,不仅仅是OpenGL Shader,在一些引擎比如Unity中,不是采用GLSL,而是CG/HLSL进行编写,流程上也会有些改变。

拓幻图形学工程师教学手册(第九讲)|一字一字敲出OpenGL学习教程
但是不能看出,其实大同小异,Pass就是相当于今天讲的in/out的概念,从第一个stage的shader到下一个stage的shader。因为我们还是主要关注OpenGL相关内容,所以我在这里只介绍GLSL。在南艺我可能会去讲述如何在Unity中实现FaceU,B612,Snapchat中3D道具效果,以及如何使用shader实现大眼瘦脸,网红脸美颜效果,这里先做个预告,具体安排还得听Unity官方消息通知。