掃描線算法和重心坐標計算方法


2017-01-0420:17:10

scan-line algorithm

sweep algorithm

 

 

  1. 求三角形的重心坐標

重心坐標的意義

   三角形所在平面的任意點都能表示為頂點的加權平均值,這個權就叫做重心坐標

表示為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. 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)

 

  1. 2.   線段插值

 

 

P是窗口坐標,t是 點d在線段ab上的重心坐標 (  ? 這樣說對嗎)

 

 

得到像素的值f,w 為clip coordinate的w分量,如果w為1. 公式就是

                    f = fa * I + fb * J   (I=1-t, J=t)

  1. 三角形插值

計算像素值的公式:

 

 

fabc為 頂點的值,w齊次坐標的w分量。

 

計算像素z值的公式:

 

 

 

如果w=1, 或者忽略掉w值 (noperspective),公式就變成了和計算z值一樣的。

 

 

 

以上都是opengl 的概念,搞明白了,就可以在fragment shader 里面訂制插值算法了。

  1. 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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM