什么是 shader?
Shader 是一品种 C 语法的程序,用于隔离硬件相干局部的的代码。
不同的 shader 程序在应用时编译老本机硬件反对的程序。
shader 分两种:
- 顶点渲染程序 vertex shader
- 片断渲染程序 fragment shader
vertex shader 用于批改 (平移,旋转,扭曲) 顶点的地位:potision 和确定顶点的色彩
fragment shader 用于确定每个像素的色彩,应用照明,材质等等
编写 shader 程序
- 编译 vertex shader,到 ID
- 编译 fragment shader,失去 ID
- 查看是否有编译谬误
-
链接以上两个 shader 程序,失去 ID
- 放弃这个 ID
- 渲染三角形时,应用这个 ID
- 不同的模型能够有不同的 shader 程序
举个例子
顶点渲染器 vertex shader:
in vec4 s_vPosition;
void main () {
// 看,我不须要任何矩阵操作
// s_vPosition 的值须要在 -1.0 和 1.0 之间
gl_Position = s_vPosition;
}
out vec4 s_vColor;
void main() {
// 不管三七二十一,像素都搞成红的!
fColor = vec4 (1.0, 0.0, 0.0, 1.0);
}
与 C 语言一样,main 函数是必须的入口函数。双斜杆为正文。
编译渲染器
能够通过调用一些 OpenGL 函数来编译渲染器程序。
编译渲染器分三步:创立 id,绑定代码, 编译。
-
<GLuint> glCreateShader (<type>)
- 创立一个渲染器 ID, 具备 GLuint 类型
- 如
GLuint ID = glCreateShader(GL_VERTEX_SHADER);
-
glShaderSource (<id>, <count>, <src code>, <lengths>)
- 绑定代码到渲染器程序
- 产生在编译之前
-
glCompileShader (<id>)
- 编译一 局部 渲染器程序
创立、链接、应用渲染器
下面只是搞了一个局部渲染器,残缺的程序须要再来四步:
-
<GLuint> glCreateProgram ()
- 创立一个渲染器程序,返回 ID, 整个程序生命周期须要放弃这个 ID
-
glAttachShader (<prog id>, <shader id>)
- 这个调用须要别离对顶点和片断渲染器搞两次
-
glLinkProgram (<prog id>)
- 真正的链接渲染器程序
-
glUseProgram (<prog id>)
- 须要画三角形的时候应用渲染器程序
好了,就这些。具体的例子能够看这篇文章.