[程式] frament shader問題

作者: Q2N2222 (Q2N2222)   2016-07-12 00:59:31
請問
假設以一個三角形來說
vertex shader 是三角形的三個vertex座標做些變換後再輸出
frament shader 是計算三角形中所有farment的color
是這樣的解讀有錯?
我看書上frament shader 會從vertex shader中
傳入經過模型矩陣變換過的vertex去計算光照
但這樣不就只有用那個頂點的座標去計算?
三角形上其他像素的座標不就沒用到?
那frament shader又是怎麼取得每個frament的座標的?
作者: holymars   2016-07-12 01:14:00
rasterization
作者: Bencrie   2016-07-12 01:29:00
fragment你在 fragment shader 裡面會拿到已經內插好的座標早期的 GLSL 是用 varying 宣告要內插的變數
作者: Q2N2222 (Q2N2222)   2016-07-12 23:50:00
了解了 感恩
作者: kuma660224 (kuma660224)   2016-07-14 20:07:00
frag取得的不是頂點座標,而是插值uv座標頂點是給triangle setup單位處理。frag得到資料已是每個pixel所屬的uv,法線
作者: Q2N2222 (Q2N2222)   2016-07-15 00:07:00
uv是指二維? 可是傳入的是三維 vec3
作者: cjcat2266 (CJ Cat)   2016-07-15 00:17:00
輸入資料是幾維都不重要,每個分量都會依照座標內差
作者: Bencrie   2016-07-16 17:35:00
而且還會幫你弄 perspective division
作者: kuma660224 (kuma660224)   2016-07-18 17:29:00
貼圖UV通常只需要2維。除非反射貼圖。vs輸出資料不等於frag輸入資料。3維頂點不是給frag,是給TriangleSetupSetup完畢傳給Frag已非3D頂點座標而是2D螢幕像素,及其著色所需插值資訊
作者: Q2N2222 (Q2N2222)   2016-07-18 20:20:00
那frag中要怎麼用2d座標就算光照?
作者: riveranb (River)   2016-07-18 21:10:00
1.all vertices: calculate pos,n,color,uv,...(lit)2a. all fragments on 3 edges to calculate info.2b.rasterize: fragments on scanlines inside 3 edges.3c.each fragment get interpolated pos,n,color,uv,...3.in fragment shader, get your final result(color).
作者: Bencrie   2016-07-19 01:48:00
不用 2D 座標算 shading 啊,你複製一份 pos 送內插就好
作者: kuma660224 (kuma660224)   2016-07-26 20:33:00
float2 uv : TEXCOORD0; 用它與tex2d()抓貼圖顏色。float3 color: COLOR傳送算完Diffuse光照的顏色頂點光照就兩個乘起來就搞定。而pixel光照也不需要頂點3D位置。是傳法向量與光向量它只要知道兩個向量就能算夾角,用角度判斷光的強度Frag不需要知道自己處理得pixel位置在哪裡。Vert(頂點)->TriangleSetup(頂點轉pixel,插值)->Frag(算顏色)
作者: Bencrie   2016-07-28 13:31:00
我竟然沒發現 shading 不需要 pos 這個盲點 XDD
作者: kuma660224 (kuma660224)   2016-08-10 01:40:00
frag連自己的螢幕2D座標都不必知道啊XD只要知道怎摸算顏色就好。

Links booklink

Contact Us: admin [ a t ] ucptt.com