Shader語言的一些簡單解釋和備註

2021-07-22 21:37:57 字數 3644 閱讀 9792

先以一對shader的**為例子開始:

private final string mvertexshader =

"uniform mat4 umvpmatrix;\n" +

"uniform mat4 ustmatrix;\n" +

"attribute vec4 aposition;\n" +

"attribute vec4 atexturecoord;\n" +

"varying vec2 vtexturecoord;\n" +

"void main() \n";

private final string mfragmentshader =

"#extension gl_oes_egl_image_external : require\n" +

"precision mediump float;\n" +

"varying vec2 vtexturecoord;\n" +

"uniform samplerexternaloes stexture;\n" +

"void main() \n";

一點一點摘出來其中的意思。

1. shader的幾種變數:

// fragment shader

private final string mfragmentshader =

"precision mediump float;\n" +

"varying vec2 vtexturecoord;\n" +

"uniform sampler2d stexture2;\n" +

"uniform sampler2d stexture1;\n" +

"void main() \n";

// using shader

// get postion

gluint tex1 = glgetuniformlocation(pp->po, "stexture1");

gluint tex2 = glgetuniformlocation(pp->po, "stexture2");

// activate multi texture unit and bind textures

glactivetexture(gl_texture0);

glbindtexture(t0);

glactivetexture(gl_texture1);

glbindtexture(t1);

// set stexture1 to gl_texture0

gluniform1i(texl, 0);

// set stexture2 to gl_texture0

gluniform1i(tex2, 1);

精度precision:精度限定。 在vertex shader中,如果沒有預設的精度,則float和int精度都為highp;在fragment shader中,float沒有預設的精度,所以必須在fragment shader中為float指定乙個預設精度或為每個float變數指定精度。

有三個選項,highp, mediump, lowp

vec2 = codea 中的 vec2,如 vec2(3,4),還有 vec3 和 vec4

bool = boolean(true 或 false)布林型,真值或假值

int = integer 整型

float = 帶小數的數 浮點型

sampler2d = 乙個 2d 影象

mat2 = 2*2 的表(mat3 和 mat4 分別是 3*3 和 4*4 的表)

2. vertexshader,

"   gl_position = position;\n" \

"   otexcoord = texcoord;\n" \

position是頂點位置座標, texcoord是紋理對映座標,賦值號左側的部分就是準備由這個處理階段傳遞給下一道工序的輸出變數

gl_position: 用於vertex shader, 寫頂點位置;被圖元收集、裁剪等固定操作功能所使用;它是內部變數,表示變換後點的對應位置,其內部宣告是:highp vec4 gl_position;  

vertex裡的x,y,z是相對值,只要保證比例就可以。而u,v只能是0~1的範圍       

vertex shader工作是頂點座標座標變換、光照、材質等頂點的相關操作,每頂點執行一次,處理的是外面傳給shader的頂點陣列。傳入相應的attribute變數、uniforms變數、取樣器以及臨時變數,經過頂點著色器後生成作為輸出的varying變數。在vertex shader和fragment shader之間會完成光柵化。所以如果希望對所有畫素進行操作,需要在fragment shader裡做處理。

3. fragmentshader,

lowp vec4 col =texture2d(texture, vtexcoord) * vcolor ;

gl_fragcolor = col;

texture2d, 取得紋理貼圖上面乙個畫素點的顏色,這個畫素點位於x,y,由 vtexcoord 指定,最後把這個畫素點的顏色放到乙個名為 col 的變數中。

這裡的vtexcoord座標是光柵化之後的點對應輸入影象上點的座標,相當於從輸出影象逐個畫素取出來的點,對應輸入位置的座標。

fragment shader處理的是rasterize之後的片元資料,輸入varying vec2 vtexturecoord是片元畫素對應輸入紋理上的位置,輸入uniform samplerexternaloesstexture是輸入紋理。通過gl_fragcolor = texture2d(stexture, vtexturecoord)對紋理對應位置進行取樣

光柵化(rasterize/rasteriztion)。

adobe官方翻譯成柵格化或者畫素化,就是把向量圖形轉化成畫素點的過程。在vertex shader和fragment shader之間完成。螢幕上顯示的畫面都是由畫素組成,而三維物體都是點線面構成的。要讓點線面,變成能在螢幕上顯示的畫素,就需要rasterize這個過程。就是從向量的點線面的描述,變成畫素的描述。

其他例子:

attribute vec2 texcoord; 變數 texcoord 是乙個 vec2 以及乙個 attribute(因此它對於每個頂點都不同),我們可以根據它的名字來猜測:它保留了應用於這個點的紋理貼圖的座標位置。

varying highp vec2 vtexcoord; 變數 vtexcoord 是乙個高精度的 vec2,它還是乙個 varying,這意味著它是乙個輸出,因此它將會被插值到每個畫素點,並且傳送給 片段著色器-fragment shader。你可以從 main 函式中的**看到,vtexcoord =texcoord,因此所有這些**所做的就是傳遞貼圖的位置座標給 片段著色器-fragmentshader。因此我們回到所有這個著色器所做的事實,它取得位置座標,紋理和顏色資訊(來自attribute 輸入變數),然後把它們未做改動地賦值給輸出(varying)變數.

gl_position

gl_position

gl_position

stexture

stexture

stexture

一些專業的解釋

1.pid 比例 proportion 積分 integral 微分 derivative 控制 pid控制是乙個在工業控制應用中常見的反饋迴路部件,由比例單元p 積分單元i和微分單元d組成。pid控制的基礎是比例控制 積分控制可消除穩態誤差,但可能增加超調 微分控制可加快大慣性系統響應速度以及減弱...

TTF 的一些解釋

簡言之,聯邦核心 fc 是乙個開發環境,它使得能夠緊湊地表示將tensorflow 與分布式通訊運算子 例如聯邦平均中使用的運算子 組合在一起的程式邏輯 計算一組客戶端上的分布式和 平均數和其他型別的分布式聚合系統中的裝置,這些裝置的廣播模型和引數等。您可能知道tf.contrib.distribu...

BOM DOM的一些解釋

dom 是為了操作文件出現的 api,document 是其的乙個物件 bom 是為了操作瀏覽器出現的 api,window 是其的乙個物件。bom是瀏覽器物件模型,是對瀏覽器本身進行操作 dom是文件物件模型,是對瀏覽器 可看成容器 內的內容進行操作 歸dom管的 e區 就是你說的document...