Android開發(fā)之OpenGLSL語言(二)

GLSL語言

(一)名詞解釋:

1、圖元:圖形軟件用來描述各種圖形的函數(shù)。
2、OpenGL渲染管線
渲染流水線:是顯卡芯片內(nèi)部處理圖形信號相互獨立的并行處理單元。簡單理解就是把數(shù)據(jù)轉(zhuǎn)化到OpenGL并且生成最終圖像的一個過程!
3、GLSL是什么?
GLSL是一門專門為圖形開發(fā)設(shè)計的編程語言。
4、可編程管線的編程階段


這里寫圖片描述

頂點處理階段:由頂點著色器、細(xì)分著色器和幾何著色器組成。主要功能是決定了圖元的位置。
頂點著色器:當(dāng)緩存數(shù)據(jù)初始化完成之后,頂點著色開始接受頂點數(shù)據(jù),并單獨處理每個頂點,頂點處理完之后,開始激活細(xì)分著色器。
細(xì)分著色器:分為細(xì)分控制著色器和細(xì)分計算著色器。用來描述物體的形狀,在管線中生成新的幾何體,并把這個幾何體處理的更加平順,然后就會成為最終狀態(tài)。
幾何著色器:細(xì)分著色器將最終的模型傳給了幾何著色器,其實在管線內(nèi)部會對這些圖元都進(jìn)行修改,因為有的合適有的不合適,所以到了幾何著色器就開始對所有的圖像進(jìn)行修改,改變幾何圖元的類型或者放棄掉沒有用的圖元。
片元處理階段:由片元裁剪、光柵化和片元著色器組成。主要決定了片元的存在以及片元的顏色。
圖元裁剪:剪切掉光柵化之前我們看不到(視口以外)的圖元。
光柵化:將輸入圖元的數(shù)學(xué)描述轉(zhuǎn)換為與屏幕位置對應(yīng)的像素片元的過程。
片元著色器:主要處理光柵化之后的單獨片元,主要計算了片元的顏色和深度值,然后開始傳遞到片元測試和混合模塊。這里像光照,霧化處理都在這一步。

(二)GLSL變量

(1)GLSL支持的基本數(shù)據(jù)類型:
float、int、bool、uint/double。
(2)標(biāo)量:只有大小沒有方向
(3)變量命名規(guī)范:

  1. 數(shù)字和“_”不能作為開頭
  2. 變量名不能包含連續(xù)的下劃線
  3. 用戶變量不能用“gl”開頭
  4. 見名識意
    (4)變量的初始化:
    float f=1.0;
    bool b=true;
    int I=15;
    (5)類型轉(zhuǎn)換(win):
    float f=1.0;
    bool b=bool(f)
    (6)聚合類型——向量
    向量 :有方向的量
    向量在著色器中的作用:位置,顏色,紋理
    基本類型


    這里寫圖片描述

    向量初始化:
    1、聲明變量的初始化
    vec3 xyz=vec3(1.0,1.0,1.0);
    float x= xyz.x;
    vec3 rgb=vec3(1.0,1.0,1.0);
    float r=rgb.r;
    float g=rgb.g;
    當(dāng)三個值相等的時候
    vec3 rgb=vec3(1.0 );等價于vec3 rgb=vec3(1.0,1.0,1.0);
    2、類型之間等價交換
    vec3 xyz1=vec3(1.0,1.0,1.0);
    vec3 xyz2=vec3(xyz1);
    3、截短
    vec3 xyz1=vec3(1.0,1.0,1.0);
    vec2 xy=vec2(xyz1);
    4、加長
    vec2 xy=vec2(xyz1);
    vec3 xyz1=vec3(xy ,1.0);
    (7)矩陣
    矩陣在3D開發(fā)中的作用:位移,旋轉(zhuǎn),縮放
    .矩陣類型


    這里寫圖片描述

    矩陣初始化
    只傳一個值:m=mat3(4.0);
    這里寫圖片描述

    以下三種寫法得到效果是一樣的:
    mat3 m=( 1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0);
    ////
    vec3 f1=vec3(1.0,2.0,3.0);
    vec3 f2=vec3(4.0,5.0,6.0);
    vec3 f3=vec3(7.0,8.0,9.0);
    mat3 m=mat3( f1,f2,f3 );
    ////
    vec2 f1=vec2(1.0,2.0);
    vec2 f2=vec2(4.0,5.0);

    vec2 f3=vec2(7.0,8.0);
    mat3 m=mat3(f1,3.0,f2,6.0,f3 ,9.0
    GLSL首先填充列 然后填充行:


    這里寫圖片描述

(8)向量和矩陣內(nèi)的元素訪問
1、什么是分量?
聚合類型的元素
例如:vec3 xyz = vec3(1.0,1.0,1.0);
xyz.x:分量,也是聚合類型的元素
2、分量名稱三種形式的集合

這里寫圖片描述

3、向量與矩陣中的元素訪問方式?
向量:使用分量的名稱
矩陣:可以以二維數(shù)組的方式進(jìn)行訪問
4、向量內(nèi)元素訪問(詳解)
例如:vect3 rgb = vec3(1.0,1.0,1.0);
float r = rgb.r;
float g = rgb.g;
數(shù)組方式獲取:
float r1 = rgb[0];
5、矩陣內(nèi)元素的訪問(詳解)
例如:mat4 m = mat4(2.0);
這里寫圖片描述

獲取矩陣的第二列:vect4 xyzw = m[2];
獲取具體的標(biāo)量:float f = m[2][2];//也可以這樣寫:m[2].z;
6、齊次坐標(biāo):就是將n維的向量用一個n+1維來表示。
(4,2,1)和(8,4,2)都表示的二維點(4,2)。
(9)結(jié)構(gòu)體和采樣器
什么是采樣器?
專門來進(jìn)行紋理采樣的。
一般情況下一個采樣器代表了一套或者一副紋理。
這里寫圖片描述

注意:1、采樣器的變量不能在著色器中初始化。
一般情況下采樣器的變量都是用uniform這個限定符來修飾的,從宿主語言(java)接收傳遞進(jìn)來的著色器的值。
3、sampler3D并不是在所有的OpenGLES實現(xiàn)中都是支持的,如果非要用,在著色器代碼中打開相應(yīng)的拓展。
1、結(jié)構(gòu)體:
就是從邏輯上將不同類型的數(shù)據(jù)組合到一個數(shù)據(jù)集合中。
結(jié)構(gòu)體的作用
簡化運算。
定義一個結(jié)構(gòu)體
struct info{ vec3 color;//顏色 vec3 xyz; //位置 vec3 st; //紋理 }
4、怎么調(diào)用結(jié)構(gòu)體元素作為輸入?yún)?shù)
info cxs = info(vec3(1.0,2.0,3.0),vec3(4.0,5.0,6.0),vec3(7.0,8.0,9.0));
vec3 color = info.color;
(10)數(shù)組
1、數(shù)組:有限個類型相同的變量集合;
2、GLSL數(shù)組特性以及注意事項
GLSL支持任意類型的數(shù)組,包括結(jié)構(gòu)體數(shù)組。
索引從零開始
沒有負(fù)數(shù)索引
數(shù)組可以定義為有大小或者沒有大小
數(shù)組數(shù)GLSL第一等類型
GLSL里面數(shù)組有構(gòu)造函數(shù),并且用函數(shù)的參數(shù)作為返回類型。
可以靜態(tài)初始化一個數(shù)組
float c[3] = float3;
GLSL有一個隱式的方法,可以返回元素個數(shù)(length)。
int t = c.length;
多維數(shù)組:float c[3][5];

(11)類型修飾符
1、類型修飾符作用


這里寫圖片描述

這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容