2014-11-06 37 views
0

我有強度值的一個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 (總是有趣的),並添加正確的常量數*

回答

1

您可以使用法線貼圖整數/無符號整數格式:

gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_R32UI, width, height, 0, OpenGL.GL_RED_INTEGER, OpenGL.GL_UNSIGNED_INT, pixels); 

在可以使用usampler2D着色器,因爲紋理函數具有過載這一點,你直接將整數值:

uniform usampler myUTexture; 
uint value = texture(myUTexture, texCoord).r; 

編輯: 只是爲了completness:texelFetch也有各類2D採樣器的過載。紋理和texelFetch之間的區別是使用的座標系(紋理的[0,1]和texelFetch的像素座標),並且texelFetch不考慮任何插值/ mipmap。

+0

你知道fbo是否可以寫入這樣的紋理嗎? – chrispepper1989 2014-11-06 22:24:26

+1

是的,使用fbo渲染爲整數紋理是可能的。與浮點輸出類似。 – BDL 2014-11-06 23:20:25

相關問題