2012-03-09 109 views
6

離屏渲染到紋理綁定的離屏幀緩衝區對象應該是如此微不足道,但我有一個問題,我無法環繞我的頭。OpenGL渲染到紋理通過FBO - 不正常的顯示與普通紋理

我的全樣本程序(!2D現在只)是在這裏:

http://pastebin.com/hSvXzhJT

的一些描述,請參閱下文。

我創建了一個rgba紋理對象512x512,將它綁定到一個FBO。在這一點上,不需要深度或其他渲染緩衝區,嚴格來說是2D。

以下非常簡單的着色器渲染到這個紋理:

頂點着色器:

varying vec2 vPos; attribute vec2 aPos; 
void main (void) { 
    vPos = (aPos + 1)/2; 
    gl_Position = vec4(aPos, 0.0, 1.0); 
} 

在此者剛剛獲得含4個XY COORDS爲四(一VBO -1,-1 :: -1,-1 :: 1,-1 :: 1)

因此,儘管幀緩衝區分辨率理論上應該是512x512,但着色器顯然會將其「紋理」渲染到「全屏幕(四屏)四邊形」 GLs -1..1協調範式。

片段着色器:

varying vec2 vPos; 
void main (void) { 
    gl_FragColor = vec4(0.25, vPos, 1); 
} 

因此它設置完全不透明的顏色有紅色取決於X/Y軸固定在0.25和綠色/藍色的任何地方在這一點上我的假設0和1之間

是渲染的512x512紋理僅顯示-1..1全 - (關)屏幕四邊形,從0..1開始爲綠色/藍色片段着色。

所以這是我的離屏設置。在屏幕上,我還有另一個真正可見的全屏四元組,包含4個xyz座標{-1,-1,1 ::: 1,-1,1 ::: 1,1,1 ...... -1,1, 1}。再次,現在這是2D,所以沒有矩陣,所以z總是1.

這個四邊形是由不同的着色器繪製的,只是渲染給定的紋理,文本書GL-101樣式。在我上面鏈接的示例程序中,我有一個簡單的布爾切換doRtt,當這是false(默認)時,render-to-texture完全不會執行,並且此着色器僅顯示當前目錄中的使用texture.jpg。

這個doRtt = false模式表明第二個屏幕四格渲染器對於我當前的要求是「正確的」,並執行紋理處理,如我所願:垂直重複兩次,水平重複兩次(稍後將被鉗制,重複僅用於測試),否則使用NO紋理過濾或mipmapping進行縮放。

因此,無論窗口(以及視口)如何調整大小,我們總是會看到一個全屏四邊形,其中單個紋理水平重複兩次,垂直兩次。

現在,在doRtt = true的情況下,第二個着色器仍然可以完成它的工作,但紋理從來沒有完全正確縮放 - 或者繪製過,我不確定,因爲不幸我們不能只說「嘿gl保存這個FBO到磁盤進行調試「。

RTT着色器執行一些局部渲染(或者可能是完整渲染,再次無法確定屏幕外發生了什麼......)特別是當您調整視口的尺寸比默認尺寸小很多時,您會看到紋理重複之間的中斷,並且並非從我們非常簡單的RTT片段着色器中預期的所有顏色都會顯示出來。 (A):512x512紋理創建正確,但沒有被我的代碼正確映射(但爲什麼與doRtt = false任何給定的texture.jpg文件使用完全相同的簡單紋理四色着色器顯示就好?)

(B)或:512x512紋理渲染不正確,rtt碎片着色器根據窗口分辨率改變其輸出 - 但爲什麼?對於x和y,屏幕四邊形總是在-1..1處,頂點着色器總是將這個映射到片段座標0..1,對於這個簡單的測試,RTT紋理始終保持在512x512!

請注意,屏幕四方和屏幕四方都不會更改它們的座標,並且始終爲「全屏」(兩個維度均爲-1..1)。

再次,這應該是如此簡單。我究竟在想什麼?

規格:OpenGL 4.2(但代碼顯然不需要任何4.2特性!),Nvidia Quadro 5010M,openSuse 12.1 64bit,Golang Weekly 22-Feb-2012。

+0

如果是引擎收錄下來,完全相同的源文件也正在於此:http://dl.dropbox.com/u/2166329/testrtt.go - 與路徑texture.jpg了。 – metaleap 2012-03-09 06:19:25

回答

10

首先 - 嘗試檢查OpenGL錯誤。在每個OpenGL函數之後調用glGetError()。你也必須爲繪圖設置正確的視口。在繪製到FBO之前調用glViewport(0,0,512,512)。在繪製屏幕前調用glViewport(0,0,display_width,display_height)。

也沒有必要綁定rttFrameTex當您使用FBO渲染它。只有在讀取着色器中的紋理時才需要綁定紋理。

+0

這就是所需要的!令人驚訝的是,thx需要一些時間來幫助我解決這個問題 - 我之前做過「觀察端口實驗」,但沒有成功,但現在它立即奏效,再次感謝! 能夠有人> = 15的聲望upvoteMārtiņš? – metaleap 2012-03-09 08:02:37

+0

@PhilS。 ...我反而提出了你的問題。 – 2012-03-09 08:21:28