天天看點

《OpenGL ES 3.x遊戲開發(下卷)》一1.7 多重渲染目标

本節書摘來異步社群《opengl es 3.x遊戲開發(下卷)》一書中的第1章,第1.1節,作者: 吳亞峰 責編: 張濤,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

上一節已經介紹了幀緩沖與渲染緩沖的相關知識與案例,相信讀者對于自定義幀緩沖與渲染緩沖的使用已有所了解。本節将介紹多重渲染目标(multiple render targets),主要分為基本原理和簡單案例兩部分進行介紹。

多重渲染目标允許程式同時渲染到多個顔色緩沖,向不同的顔色緩沖中送入渲染結果的不同方面(如不同rgba色彩通道的值、深度值等)。不少進階特效渲染時需要使用多重渲染目标技術,例如延遲着色、螢幕空間環境光遮蔽等。下面介紹使用多重渲染目标技術的基本步驟。

(1)首先需要建立一個自定義的幀緩沖,并綁定到此幀緩沖。

(2)接着可以建立并初始化一批紋理,總數量等于要輸出的不同渲染結果方面的數量,并且不能超過系統的最大限制數。

(3)然後将這一批紋理一一連接配接到自定義幀緩沖中的不同顔色附件中。

(4)接着在繪制時正常繪制前調用gldrawbuffers方法設定要輸出的顔色附件。

(5)最後在片元着色器中定義多個輸出變量一一對應到要輸出的顔色附件。

提示 看完上述步驟之後,讀者可能不是很明白。沒有關系,後面會給出專門的案例供讀者學習,那時就很清楚了。

了解了上述步驟後還有兩個相關的方法需要介紹一下,具體内容如下。

(1)首先給出的是設定繪制時要輸出顔色附件的gldrawbuffers方法,其方法簽名如下。

1 public static void gldrawbuffers (int n, int[] bufs, int offset)

說明 參數n為要輸出的顔色附件的數量,參數bufs為存放了n個要輸出的顔色附件标志值的數組,參數offset為bufs數組的偏移量。

(2)接着介紹用于查詢系統所支援最大輸出顔色附件數的glgetintegerv方法,其使用時的代碼片段如下。

從上述代碼片段中可以看出,首先需要聲明一個數組用于存放查詢的結果值,然後以參數gl_max_color_attachments調用glgetintegerv方法進行查詢即可。另外,所有的opengl 3.0實作都支援的顔色附件最小值是4,若讀者需要使用的量小于等于4時可以放心直接使用。

上一小節介紹了關于多重渲染目标的基本知識,本小節将給出一個使用多重渲染目标的簡單案例sample1_6。首先給出的是該案例的運作效果圖,如圖1-7和圖1-8所示。

《OpenGL ES 3.x遊戲開發(下卷)》一1.7 多重渲染目标
圖1-7和圖1-8為本小節案例sample1_6的運作效果圖,其中圖1-7為案例開始運作時的效果圖,圖1-8為手指向下滑動螢幕時的效果圖。由于本書采用灰階印刷,對于此案例而言讀者很難看到效果,這裡建議讀者使用真機運作本案例進行觀察。

案例sample1_6同時也使用了二次渲染技術,其在第一輪渲染時使用了多重渲染目标。将rgba四個色彩通道的值送到自定義幀緩沖的0号顔色附件,将r、g、b三個色彩通道的值各自單獨送到了1、2、3号顔色附件。每個顔色附件本身是一幅紋理,然後在第二輪繪制時将4個顔色附件對應的紋理分别渲染到了一個紋理矩形上,此時就看到了如圖1-7和圖1-8所示的情況。

本小節案例是基于前面的案例sample1_5改變而來的,各個類的基本架構大緻相同,是以相同的部分不再重複贅述,在此隻介紹幾處有代表性的部分,具體内容如下。

(1)首先介紹scenerenderer類中用于初始化幀緩沖的initfbo方法,該方法的主要功能為聲明指定長度的顔色附件常量數組、初始化幀緩沖、初始化渲染緩沖、綁定顔色附件以及設定紋理的采樣方式和拉伸方式等,其具體代碼如下。

第2~第4行聲明了長度為4的顔色附件标志值常量數組,在将指定紋理連接配接到幀緩沖中的特定顔色附件時使用。

第5~第8行建立并綁定到了一個自定義的幀緩沖。

第9~第20行為初始化渲染緩沖的相關代碼,其中首先建立了一個渲染緩沖,然後綁定到了此渲染緩沖,并為其初始化了存儲,接着将其作為前面自定義幀緩沖的深度附件。

第21~第48行為對多重渲染目标所需的4個顔色附件進行初始化的相關代碼,其中首先建立了4個紋理,然後對每個紋理進行初始化,并把這4個紋理分别連接配接到了0~3号顔色附件。

第49~第52行首先調用gldrawbuffers方法設定要輸出的顔色附件,并檢查幀緩沖的完整性。若檢查成功則傳回true,否則傳回false。

(2)介紹完了初始化幀緩沖的initfbo方法後,接下來介紹用于繪制紋理矩形的drawshadowtexture方法,具體代碼如下。

第2~第6行的功能為設定螢幕背景顔色,設定視口大小與位置,綁定系統預設幀緩沖以及清除深度緩沖與顔色緩沖。

第7~第8行設定了正交投影,并調用setcamera方法産生錄影機9參數矩陣。

第9~第13行的功能為保護現場,平移坐标系并繪制左上角的小紋理矩形。

第14~第24行的功能也是通過平移分别繪制右上角小紋理矩形、左下角小紋理矩形以及右下角小紋理矩形。

(3)上面介紹了用于繪制4個小紋理矩形的drawshadowtexture方法,接下來介紹帶有4個輸出變量(對應于前面的4個顔色附件)的多重渲染目标片元着色器,其具體代碼如下。

上述片元着色器的代碼與前面案例sample1_5中片元着色器的代碼大緻相同,不同的是該片元着色器中含有對應前面4個顔色附件的輸出變量,進而實作了多重渲染目标的功能。