GLSL 著色語言中的一些知識筆記
Uniforms(前輟修改)
- Uniform前輟修飾的變數初始值由外部程式賦值。在program中具有統一訪問空間,儲存空間有限。在Shader中是隻讀的,只能由外部主機程式傳入值。
- 它用於儲存shader需要的各種資料,如:變換矩陣、光照引數和顏色。基本上,對於Shader是一個常量,但在編譯時其值未知,則應當作為一個uniform變數。
- Uniform變數在Vertex Shader和Fragment Shader之間共享。當使用glUniform***設定了一個uniform變數的值之後,Vertex Shader和Fragment Shader中具有相同的值。
- Uniform變數被儲存在GPU中的“常量儲存區”,其空間大小是固定的,可通過API查詢(GL_MAX_VERTEX_UNIFORM_VECTORS 或 GL_MAX_FRAGMENT_UNIFORM_VECTORS )。
Attributes(前輟修改) [早期OpenGL版本中使用該欄位]
- Attribute變數是隻能在vertex shader中使用的變數。(它不能在fragment shader中宣告attribute變數,也不能被fragment shader中使用)
- Attribute前輟修飾的變數定義的是每個Vertex的屬性變數,包括位置,顏色,法線和紋理座標
- Attribute 型別的變數在Vertex Shader中是隻讀的,只能由外部主機程式傳入值。
- Attribute 型別的變數:是為每個被正在畫的頂點所指定的資料。在畫圖前,每個頂點的屬性由應用程式輸入。
- 與Uniform變數一樣,其儲存數量也是有限制的。可用glGetIntegerv(GL_MAX_VERTEX_ATTRIBS)進行查詢。GPU至少支援8個屬性,所以Vertex Shader原始碼中不要超過8個attributes。
- 在application中,一般用函式glBindAttribLocation()來繫結每個attribute變數的位置,然後用函式glVertexAttribPointer()為每個attribute變數賦值。 可以使用glBindAttribLocation進行屬性索引繫結。
Varyings [早期OpenGL版本中使用該欄位]
-
Varying變數用於儲存Vertex Shader的輸出和Fragment Shader的輸入,它起到資料轉遞的作用。一般vertex shader修改varying變數的值,然後fragment shader使用該varying變數的值。因此varying變數在vertex和fragment shader二者之間的宣告必須是一致的
-
與Uniform和Attribute一樣,其儲存數量也是有限制的,可用glGetIntegerv(GL_MAX_VARYING_VECTORS)進行查詢。GPU至少支援8個Varying vector,所以Vertex Shader原始碼中不要超過8個Varying vector。
GLint maxVertexAttribs; // n will be >= 8 glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &maxVertexAttribs);
Vertex Attributes
1、 常量頂點屬性(Constant Vertex Attribute)
常量頂點屬性對所有頂點都是一樣的。因此只需要指定一個值就可以應用於所有頂點。一般很少使用。其設定函式有
void glVertexAttrib1f(GLuint index, GLfloat x);
void glVertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
void glVertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
void glVertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z,GLfloat w);
void glVertexAttrib1fv(GLuint index, const GLfloat *values);
void glVertexAttrib2fv(GLuint index, const GLfloat *values);
void glVertexAttrib3fv(GLuint index, const GLfloat *values);
2、 如何裝載頂點資料?(Vertex Arrays)
Vertex Array(頂點陣列):是一個儲存在應用程式空間(Client)中的記憶體buffer,它儲存了每個頂點的屬性資料。
如何把頂點資料組的資料傳遞給GPU呢?
void glVertexAttribPointer(GLuint index,
GLint size, //每個屬性元素個數有效值1-4(x,y,z,w)
GLenum type, //陣列中每個元素的資料型別
GLboolean normalized,
GLsizei stride, //如果資料連續存放,則為0或
//size*sizeof(type)
const void *ptr) //頂點陣列指標
reference:
https://www.cnblogs.com/sanjin/p/3580331.html
https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glBindAttribLocation.xml
https://blog.csdn.net/jeffasd/article/details/78209965
https://blog.csdn.net/racehorse/article/details/6634830