2017-01-0420:17:10
scan-line algorithm
sweep algorithm
- 求三角形的重心坐標
重心坐標的意義
三角形所在平面的任意點都能表示為頂點的加權平均值,這個權就叫做重心坐標。
表示為I,J,K, I+J+K=1
求重心坐標的快速算法,將圖元用掃描線分割成垂直和水平的等分,然后生成一張“掃描邊表”,通過這張表可以快速計算出同行的重心坐標。
例如:把v4, v5 存下來,計算v6的時候用上。
(Interpolcation qualifier ) 修飾fragment shader input, 指定插值算法。
smooth (default) perspective interpolation
noperspective linear interpolcation
flat no interpolcation
- 1. 點插值
點插值不需要計算重心坐標,但是可以通過訪問glPointCoord [0,1.0] 獲得紋理坐標。點紋理坐標的起點可以編程設置為UPPER_LEFT或者LOWER_LEFT.
點光柵化時(做掃描線算法)的時候,插值修飾符(iterpolation qualifier) 對點渲染沒有作用,它也不會做混合操作。
啟用MULTISAMPLE的時候,可以指定glPointParameteriv(GL_POINT_FADE_THRESHOLD_SIZE ), 單獨對alpha通道做fade操作,最終的alpha值為 alpha = alpha * fade_factor.
(derived_size = gl_PointSize)
- 2. 線段插值
P是窗口坐標,t是 點d在線段ab上的重心坐標 ( ? 這樣說對嗎)
得到像素的值f,w 為clip coordinate的w分量,如果w為1. 公式就是
f = fa * I + fb * J (I=1-t, J=t)
- 三角形插值
計算像素值的公式:
fabc為 頂點的值,w齊次坐標的w分量。
計算像素z值的公式:
如果w=1, 或者忽略掉w值 (noperspective),公式就變成了和計算z值一樣的。
以上都是opengl 的概念,搞明白了,就可以在fragment shader 里面訂制插值算法了。
- 4. AMD GCN GPU 插值
GCNGPU 光柵化的時候只生成重心坐標I,J,存在v0, v1 兩個寄存器(真節省,別浪費v2,它就是1-I-J)
這樣對於三角形的smooth 插值:
D = P0 + P10*I + P20*J
( P0, P10, P20 是頂點的值)
分兩步走
v_interp_f1_f32 v2, v0, attr0.x //D=P0 + P10*v0
v_interp_f2_f32 v2, v1, attr0.x //D=D+P20*v1
flat 插值一步完成:
v_interp_mov_f32 v3, v0, attrib0.xyz
attribute值需要存放在LDS中, 排列格式
(? K 哪去了,P0 已經被處理過了嗎
Refer:
AMD_GCN3_Instruction_Set_Architecture.pdf
Opengl specification 4.5