1. Shader起步
1.1. 可编程管线
仅考虑Vertex shader和fragment shader:
1.2. Shader Object
在编译阶段生成,把shader源代码编译成Shader 对象。
Shader对象分类
- Vertex Shader
- Fragment Shader
- Geometry Shader
- Tess EvaluationShader
- Tess ControlShader
API:
glCreateShader
glCompileShader
glDeleteShader
glGetShaderiv
glGetShaderInfoLog
1.3. Shader Program
在链接阶段,创建shader程序,链接shader对象。
API:
glCreateProgram
glAttachShader
glLinkProgram
glUseProgram
glDeleteProgram
glGetProgramiv
glGetProgramInfoLog
2. Shader编程入门
2.1. 编写Shader
Vertex Shader:
#version 400
in vec3 VertexPosition;
in vec3 VertexColor;
out vec3 Color; void main()
{
Color = VertexColor;
gl_Position = vec4(VertexPosition,1.0);
}
// Color: 输出变量,在fragment shader中使用
// gl_position: 内建的输出变量
Fragment Shader:
#version 400
in vec3 Color;
out vec4 FragColor;
void main()
{
FragColor = vec4(Color, 1.0);
}
2.2. 绑定参数
定义顶点属性索引与vertex shader输入变量之间的映射关系
glBindAttribLocation(programHandle,0, "VertexPosition");
glBindAttribLocation(programHandle,1, "VertexColor");
glBindFragDataLocation(programHandle,0, "FragColor");
2.3. 创建几何对象
Buffer对象 (VBO)
glGenBuffers // 创建buffer对象
glBindBuffer // 指定当前要绑定的VBO
glBufferData// 设置Buffer对象数据
VertexArray对象(VAO):把VBO组装成VAO
glGenVertexArrays
glBindVertexArray //指定当前要绑定的VAO
glEnableVertexAttribArray //启用渲染使用的Buffer
glBindBuffer// 指定当前要绑定的VBO
glVertexAttribPointer//设置VAO如何使用的VBO数据
2.4. 绘制几何对象
glBindVertexArray//指定当前要绑定的VAO
glDrawArrays//绘制图元格式
2.5. 技巧
2.5.1. layout qualifiers
在shader中指定输入参数对应的vertex buffer index
layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexColor;
layout (location = 0) out vec4 FragColor;
2.5.2. element arrays
使用index buffer
2.5.3. Interleaved arrays
用一个buffer object存放vertex的多个属性。
不建议使用。