離屏渲染到紋理綁定的離屏幀緩衝區對象應該是如此微不足道,但我有一個問題,我無法環繞我的頭。OpenGL渲染到紋理通過FBO - 不正常的顯示與普通紋理
我的全樣本程序(!2D現在只)是在這裏:
的一些描述,請參閱下文。
我創建了一個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。
如果是引擎收錄下來,完全相同的源文件也正在於此:http://dl.dropbox.com/u/2166329/testrtt.go - 與路徑texture.jpg了。 – metaleap 2012-03-09 06:19:25