前面兩節分別說到了深度測試和正背面剔除,這兩種技能都是OpenGL中經常使用的提升渲染性能的方式;裁剪也是一種提升渲染性的方式. OpenGL容許只刷新屏幕上發⽣變化的部分,能夠在要進行渲染的窗⼝去指定⼀個裁剪框.在這個裁剪框裏去渲染你須要的畫面。bash
其基本原理是在渲染時限制繪製區域,經過此技術能夠再屏幕(幀緩衝)指定⼀個矩形區域。而後啓⽤剪裁測試,不在此矩形區域內的片元講被丟棄,只有在此矩形區域內的片元纔有可能進⼊幀緩衝。所以實際達到的效果就是在屏幕上開闢了⼀個⼩窗口,能夠再其中進⾏指定內容的繪製。
函數
裁剪測試發生在片元着色器,此時已經光柵化將3D圖形轉換成了2D圖形。裁剪測試肯定(Xw,Yw)是否位於當前OpenGL上下文所肯定的那一部分裁剪矩形範圍內.若是該⽚段位於裁剪區域以外,則被拋棄。 post
這裏須要瞭解和區別一下窗口、視口和裁剪區域這三個機率。性能
OpenGL中,混合(Blending)一般是實現物體透明度(Transparency)的一種技術。透明就是說一個物體(或者其中的一部分)不是純色(Solid Color)的,它的顏色是物體自己的顏色和它背後其它物體的顏色的不一樣強度結合。一個有色玻璃窗是一個透明的物體,玻璃有它本身的顏色,但它最終的顏色還包含了玻璃以後全部物體的顏色。這也是混合這一名字的出處,咱們混合(Blend)(不一樣物體的)多種顏色爲一種顏色。因此透明度能讓咱們看穿物體。
測試
要想渲染有多個透明度級別的圖像,咱們須要啓用混合(Blending) ;glEnable(GL_BLEND)。啓用了混合以後,咱們須要告訴OpenGL它該如何混合它。當混合功能被啓動時,源顏色和目標顏色的組合方式是經過混合方程式控制的:Cf = (Cs * S) + (Cd * D)。其中Cf表示最終計算獲得的顏⾊ ;Cs表示源顏色;Cd表示目標顏色;S表示源混合因子指定了alpha值對源顏色的影響;D表示目標混合因子指定了alpha值對目標顏色的影響。spa
片元着色器運行完成後,而且全部的測試都經過以後,這個混合方程(Blend Equation)纔會應用到片元顏色輸出與當前顏色緩衝中的值(當前片斷以前儲存的以前片斷的顏色)上。源顏色和目標顏色將會由OpenGL自動設定,但源因子和目標因子的值能夠由咱們來決定。先來看一個簡單的例子:
code
假設有兩個方形,如今但願將這個半透明的綠色方形繪製在紅色方形之上。紅色的方形將會是目標顏色(因此它應該先在顏色緩衝中),咱們將要在這個紅色方形之上繪製這個綠色方形。那麼問題來了。因子值設置怎麼設置?若是至少想讓綠色方形乘以它的alpha值,那麼將要將源混合因子S設置爲源顏色向量的alpha值,也就是0.6。接下來就應該清楚了,目標方形的貢獻應該爲剩下的alpha值。若是綠色方形對最終顏色貢獻了60%,那麼紅色方塊應該對最終顏色貢獻了40%,即1.0-0.6. 帶入方程式可得:Cf = [0 1 0 0.6] * 0.6 + [1 0 0 1] * 0.4。結果就是重疊方形的片斷包含了一個60%綠色,40%紅色的一種髒兮兮的顏色.cdn
最終的顏色將會被儲存到顏色緩衝中,替代以前的顏色。那麼在OpenGL中該若是設置混合因子呢。
blog
設置混合因⼦子,須要⽤用到glBlendFun函數。ci
glBlendFunc(GLenum sfactor, GLenum dfactor)
兩個參數分別表示源因子與目標因子。OpenGL爲咱們定義了不少個選項,下面列出大部分最經常使用的選項:
表中R、G、B、A 分別表明 紅、綠、藍、alpha;下標S、D,分別表明源、目標;C 表明常量顏色(默認⿊色) 。注意其中C常量顏色能夠經過glBlendColor函數來另外設置。
好比上面的例子咱們使用源顏色向量的alpha做爲源因子,使用1-alpha做爲目標因子。對應一下的glBlendFun。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);複製代碼
也可使用glBlendFuncSeparate爲RGB和alpha通道分別設置不一樣的選項。好比:
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ZERO);複製代碼
這個函數和咱們以前設置的那樣設置了RGB份量,但這樣只能讓最終的alpha份量被源顏色向量的alpha值所影響到。
OpenGL甚至給了咱們更多的靈活性,容許咱們改變方程中源和目標部分的運算符。當前源和目標是相加的,但若是願意的話,咱們也可讓它們相減。glBlendEquation(GLenum mode)容許咱們設置運算符,它提供了三個選項:
一般咱們均可以省略調用glBlendEquation,由於 GL_FUNC_ADD對大部分的操做來講都是咱們但願的混合方程,但若是你真的想打破主流,其它的方程也可能符合你的要求。