shader也称着色器,着色器是运行在GPU上的小程序,着色器是一种C风格语言——GLSL。
一、GLSL
GLSL是为图形量身定制的,它为向量和矩阵运算提供了很大帮助。
1、着色器的开头总是要声明版本,接着是输入和输出变量、uniform和main函数。main函数时每个着色器的入口,用于处理所有输入变量,并用输出变量输出处理结果。
2、类型:着色器的类型包括:int、float、double、uint、bool。GLSL的两种容器类型:向量和矩阵。 向量是有1、2、3或4个元素的基本类型容器。vecn:包含n个默认为float元素的向量;其他还有bvecn、ivecn、uvecn、dvecn,可以使用vec.x、.y、.z、.w来获取它们的1、2、3、4号元素,GLSL也允许使用rgba来获取颜色的元素,或者stpq获取纹理坐标元素。
3、in和out:着色器是各自独立的小程序,每个着色器都是用这两个关键字定义输入和输出。使用layout元数据制定输入变量,这样才可以在CPU上配置顶点属性。
4、定点着色器:
layout (location = 0) in vec3 position;
out vec4 vertexColor;
void main()
{
gl_Position = vec4(position, 1.0);
vertexColor = vec4(0.5f, 0.0f, 0.0f, 1.0f);
}
5、像素着色器
in vec4 vertexColor;
out vec4 color;
void main()
{
color = vertexColor;
}
6、uniform
uniform 是另一种从CPU应用向GPU着色器发送数据的方式;
uniform和顶点属性的不同:
1)uniform是全局的:在所有着色器程序对象中都是独一无二的,可以在任何着色器程序的任何阶段使用,并且无论吧uniform值设置成什么,uniform都会一直保存着它们的数据,直到它们被重置或更新;
2)uniform是constant的:不能在着色器中修改,任何修改都会报错;
out vec4 color;
uniform vec4 ourColor;
void main()
{
color = ourColor;
}
而视频/游戏中酷炫逼真的效果又是由shader来控制实现的。所以想要提高自己技能就必须啃下shader这个硬骨头。学习OpenGL现在市面上比较受欢迎的书籍就是《OpenGL超级宝典(中文第5版3.3或者英文第七版4.5)》和《OpenGL编程指南(中文第九版4.5)》。建议先学习OpenGL超级宝典第五版,虽然现在OpenGLl已经到最新的4.6了,而超级宝典第五版里面只是到3.3,但是并没有关系,因为3.3到4.6之间的核心架构都没变,只是引进了一些新的功能以及改善了某些功能的实现而已。而且书中细节讲解的很清晰,还有大量的例子来佐证,非常适合OpenGL初学者。当看完超级宝典第五版后建议再学习下OpenGL编程指南第九版,该书针对OpenGL4.5版本,不仅引入了很多有意思和高大上的技能讲解,可以继续更深层次学习3.3往后的版本技能。
二、实时开发shader
shader 调试
片元着色器使用后缀: .frag 等,参考
brew update
brew upgrade
brew install glslviewer
SublimeText-3 插件安装
glslViewer sublimeText 安装
cd ~/Library/Application Support/Sublime Text 3/Packages/
git clone https://github.com/patriciogonzalezvivo/sublime-glslViewer.git
package control 安装
工具栏中查找 package control, 则control安装成功。
组合键 Command+Shift+P ,
搜索 package control:Install package
然后进行搜索 OpenGL Shading Language (GLSL), 即可实现 代码高亮
着色器 GLSL
如何进行编写和我们书写GLSL一样,存在部分差异参考glslViewer GitHub:https://github.com/patriciogonzalezvivo/glslViewer
脚本文件和资源文件放在同一文件夹下,终端cd到文件夹下,运行如下:
glslViewer text.frag test.jpg
效果: