[程式] 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