❶ 裁剪演算法
OpenGL中經常用到裁剪,這里記錄下裁剪的一些基本演算法和概念。
裁剪就是去掉窗口外不可見的部分,保留在窗口中的內同。是OpenGL的管線中必不可少的一步,裁剪演算法的執行效率會直接影響整個程序的效率。
裁剪可以按照線或面進行,一般使用規則裁剪框進行裁剪,也有用不規則圖形進行裁剪,常見的是使用矩形框進行裁剪。
裁剪過程的難度隨裁剪區域的復雜度和被裁剪物體的形狀復雜程度增加。
這里用矩形裁剪框解釋常用的裁剪演算法。
點的裁剪相對簡單,已知矩形裁剪框的兩個對角線頂點坐標A(x1,y1)、B(x2,y2),判斷點P(x,y)是不是在A、B坐標范圍內即可。
若:
min(x1,x2) <= x <= max(x1,x2);
min(y1,y2) <= y <= max(y1,y2);
則P點在裁剪框中,否則在裁剪框外。
這里說的直線,都是線段。線的裁剪演算法有很多,常見的有:cohen-sutherland演算法,中點分割裁剪演算法,Liang-Barsky演算法,beck演算法等。
這個演算法的主要思想是,用四位掩碼做運算判斷線是否在裁剪框內,如果在或全部在裁剪框外,結束。如果部分在窗口中,用線和裁剪框的交點對線段進行分割,然後分割後的繼續重復判斷。步驟如下:
設要裁剪的線段是P0P1。從P0端點出發,找出離P0點最近的可見點。從P1端點出發,找出離P1點最近的可見點。這兩個可見點的連線就是裁剪框中的要保留的部分。
找可見點的方法用二分法,先取線段的中點M點,判斷P1M是否可見,如果不能定為不可見,用P1M線段再2分,重復判斷。