OpenGL Shader Key Points (1)


 

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的多個屬性。

不建議使用。

 


發佈了175 篇原創文章 · 獲贊 19 · 訪問量 61萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章