2015-10-21 86 views
1

我對不同的圖像位深度着色器和查找表工作。 所以我有很好的作品,但對於查找我需要知道紋理的內部格式。其實這只是間接的事實,但它會完全服務於我。所以這是我:如何找出紋理的格式GLSL

 #version 150 
     precision highp float; 

     uniform samplerBuffer LutData; 
     uniform sampler2D Texture;  
     void main() 
     { 
      color = texture(Texture, fragTexCoord); 
      // R16 grayscale texture - handle 16bit wise mono 
      float primaryLvl = color.r; 
      int index = int(primaryLvl * 65535); 
      float gray = texelFetch(LutData, index).r; 
      finalColor = vec4(gray, gray, gray, 1); 
     } 

縮短版本(因此可能無法正常工作)

我需要的是這(僞代碼+僅主):

 void main() 
     { 
      // need follows here: 
      int lutspread = gettextureparam(Texture, MaxRange); 

      color = texture(Texture, fragTexCoord); 
      // R16 grayscale texture - handle 16bit wise mono 
      float primaryLvl = color.r; 
      int index = int(primaryLvl * lutspread); 
      float gray = texelFetch(LutData, index).r; 
      finalColor = vec4(gray, gray, gray, 1); 
     } 

難道這樣的事情存在?

因此,lutspread是255或65535.因爲「正常」採樣器所做的是:它們將紋理整數解釋爲標準化整數,導致浮點值在0.0-1.0之間。紋理格式是RED8還是RED16,它只是或多或少的粒度沒有區別!然而,如果一個LUT是遊戲的一部分,這個功能是非常有效的,因爲LUT需要原始數據。

順便說一句:我已經有我不太成功的嘗試,使用GL_REDuiGL_RED_INTEGER作爲紋理生成參數。我擔心它使用GL_RED8/GL_RED16 + GL_LUMINANCE

你可以告訴我去這條道路,但我會很害怕失去的東西我至今讓我比我目前的做法更多的問題。最終我會介紹一件制服,並將其作爲我的因素。

回答

1

爲什麼添加單個int統一的任何特別的原因是如此糟糕?

除了統一的,唯一可以工作(如果LutData是適當大小的)使用textureSize上LutData的解決方案,但我認爲,一個醜陋的黑客。

最好的解決辦法是你試圖用一個 - 如果你能告訴我們爲什麼會成爲問題,也許我們可以幫助?你使用GL_R32和GL_R32UI嗎?

+0

的問題是,整個圖像是相同的灰色。無法真正瞭解發生了什麼事。由此暗示代碼vec4顏色=紋理(usampler2D)將產生例如vec4(1234.0f ,,,)==例如不0.0-1.0的範圍內 – Robetto