1. 程式人生 > >GLSL 著色語言中的一些知識筆記

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