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的多個屬性。
不建議使用。