什么是 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>)
- 须要画三角形的时候应用渲染器程序
好了,就这些。具体的例子能够看这篇文章.