學習OpenTk,筆記四

1、頂點着色器的內置變量,當字典查詢

名稱 類型 描述
gl_Color vec4 輸入屬性-表示頂點的主顏色
gl_SecondaryColor vec4 輸入屬性-表示頂點的輔助顏色
gl_Normal vec3 輸入屬性-表示頂點的法線值
gl_Vertex vec4 輸入屬性-表示物體空間的頂點位置
gl_MultiTexCoordn vec4 輸入屬性-表示頂點的第n個紋理的座標
gl_FogCoord float 輸入屬性-表示頂點的霧座標
gl_Position vec4 輸出屬性-變換後的頂點的位置,用於後面的固定的裁剪等操作。所有的頂點着色器都必須寫這個值。
gl_ClipVertex vec4 輸出座標,用於用戶裁剪平面的裁剪
gl_PointSize float 點的大小
gl_FrontColor vec4 正面的主顏色的varying輸出
gl_BackColor vec4 背面主顏色的varying輸出
gl_FrontSecondaryColor vec4 正面的輔助顏色的varying輸出
gl_BackSecondaryColor vec4 背面的輔助顏色的varying輸出
gl_TexCoord[] vec4 紋理座標的數組varying輸出
gl_FogFragCoord float 霧座標的varying輸出

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

片段着色器的內置變量如下表:

名稱 類型 描述
gl_Color vec4 包含主顏色的插值只讀輸入
gl_SecondaryColor vec4 包含輔助顏色的插值只讀輸入
gl_TexCoord[] vec4 包含紋理座標數組的插值只讀輸入
gl_FogFragCoord float 包含霧座標的插值只讀輸入
gl_FragCoord vec4 只讀輸入,窗口的x,y,z和1/w
gl_FrontFacing bool 只讀輸入,如果是窗口正面圖元的一部分,則這個值爲true
gl_PointCoord vec2 點精靈的二維空間座標範圍在(0.0, 0.0)到(1.0, 1.0)之間,僅用於點圖元和點精靈開啓的情況下。
gl_FragData[] vec4 使用glDrawBuffers輸出的數據數組。不能與gl_FragColor結合使用。
gl_FragColor vec4 輸出的顏色用於隨後的像素操作
gl_FragDepth float 輸出的深度用於隨後的像素操作,如果這個值沒有被寫,則使用固定功能管線的深度值代替
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2、頂點着色器的內置常量
  (1). 頂點數據的最大量,就是單次可以指定的,最多支持多少個頂點同時輸入。
    const mediump int gl_MaxVertexAttribs = 16;
  (2). 頂點着色器中,最多支持的Uniform修飾的數據是多少。
    const mediump int gl_MaxVertexUniformVectors = 256;
  (3). 輸出的變量的最大數量。
    const mediump int gl_MaxVertexOutputVectors = 16;
  (4). 最多可以單次使用多少個紋理單元。
    const mediump int gl_MaxVertexTextureImageUnits = 16;
  (5). 在頂點着色器和片元着色器中,兩個一起可以使用的最多的紋理單元的數量
    const mediump int gl_MaxCombinedTextureImageUnits = 32;
3、紋理的創建需要有ActiveTexture函數,默認不使用該函數就會使用0號紋理單元,通過BindTexture進行綁定,只能的操作都是在該綁定的紋理單元內進行
4、紋理和採樣器是關聯的,默認創建的採樣器是使用0號紋理單元,多個採樣需要指定具體的紋理單元(吐槽,就像css裏面取圖,圖裏有許許多多小素材,位置對了就可以取相對的圖像)
5、學習線性代數和矩陣,讀書學過複習一下
6、旋轉變化需要了解,比如函數CreateRotationZ,代表繞Z軸旋轉,參數是弧度,1弧度=180/π,1度=π/180
7、在數據綁定的時候,VBO和VAO綁定要同時,解除綁定也要同時,這樣多個組件繪製的時候纔不會衝突
比如
GL.BindVertexArray(_vertexArrayObject);
GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBufferObject);
GL.BindVertexArray(0);
GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
擴展一下,如果做遊戲需要做什麼,比如RPG
1、遊戲內的經驗值設計,舉例:經驗值=基礎值+(等級-1)*調整係數,100+(2-1)*1.2=112,爲了增加難度和體現成長,可以提高獲取經驗的門檻
2、獲得的經驗值=原本可以獲得的經驗值/(玩家等級-敵人等級)如此一來,若是玩家攻擊的是比自己等級要低的敵人,獲得的經驗值將會在公式的處理下變得較少
3、素材製作,比如像素圖的繪製:在線設計https://www.piskelapp.com/,https://chuiliu.github.io/demo/pixel/,應用下載Aseprite

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章