我有強度值的一個int緩衝器,我想顯示此如在OpenGL中的灰度/彩色映射圖像。32位(int)緩衝區到灰度/彩色映射圖像的OpenGL,單通道32位紋理或TBO?
達到此目的的最佳方法是什麼?
標準紋理?
我可以通過一個標準的glTexture做到這一點,所以像:
gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_R32f, width, height, 0, OpenGL.GL_RED_INTEGER, OpenGL.GL_UNSIGNED_INT, pixels);
在着色器,我印象中我會使用它像任何其他的質感,除了我會用,而不是usampler2D sampler2D,在這一點我會得到真正的整數值(即不是0-1範圍)。
TBO?
或者它會更好地實現與TBO以及做類似:
gl.TexBuffer(OpenGL.GL_TEXTURE_BUFFER, OpenGL.GL_R32F, bufferID);
在着色方面我其實很困惑。我看過像g = texelFetch(u_tbo_tex, offset + 1).r.這樣的東西。所以,我猜我會翻譯的紋理座標爲偏移,這樣的:
int offset = tex_coord.s + (tex_coord.t * imageWidth);
但隨後texelFetch實際上返回一個vec4,所以大概我會用:
int intensity = texelFetch(buffer, offset).r
但隨後由於tex_coord.s & t爲0-1,這將意味着需要:
int offset = tex_coord.s*imageHeight + ((tex_coord.t * imageWidth) * imageWidth);
其他緩衝
我有緩衝對象我覺得真的我的全部是使用GL緩衝做得非常缺乏經驗....所以我不覺得我是在複雜,而且我錯過了「一分錢都不降」。
重要事項
- 爲什麼詮釋?:在某些情況下,我做了一些數據操作變成一種顏色之前,寧願要做到這一點,在32位精度,以避免潛在的精度誤差。可以說,它可能不會有所作爲,因爲它最終會變成一個屏幕色彩...
- 數據更新頻率:強度數據由用戶事件偶爾更新,但每幀肯定不是多次(所以我假設STATIC在這種情況下更合適DYNAMIC?)
- 用途:的數據主要是GL所以_DRAW 有應用程序可以利用GL的來計算它的一些值的可能性,但我可能會在這種情況下創建一個單獨讀緩存
- 迄今爲止我看到的最高整數值是「90,000」,所以我知道它超出了16位整數範圍。
注:我通過SharpGL這樣做的,我一直無法在此刻進行測試,因爲它對GL_R32f沒有定義,所以我就只好找我的windows平臺的gl.h (總是有趣的),並添加正確的常量數*
你知道fbo是否可以寫入這樣的紋理嗎? – chrispepper1989 2014-11-06 22:24:26
是的,使用fbo渲染爲整數紋理是可能的。與浮點輸出類似。 – BDL 2014-11-06 23:20:25