2013-03-14 80 views
-1

我將OpenGL紋理2D中的像素讀入字節數組(無符號字符),因爲它通常是完成的。但是現在我需要將其轉換爲圖像數組(我認爲是整數)從CPU加載的用於反向處理的圖像的佈局和像素範圍。 我的問題是 - 它是濫竽充數的事:的OpenGL將RGBA字節像素轉換爲圖像整數陣列

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_INT,bytes); 

代替:

glGetTexImage(GL_TEXTURE_2D,0,GL_RGBA,GL_UNSIGNED_BYTE,bytes); 

,然後遍歷每個整數,它從0-1範圍內轉換爲0-255? 我還沒有真正發現沒有使用3方圖像庫進行這樣的轉換的任何示例。

如果我這樣做:

  size_t lenght=_viewWidth * _viewHeight ; 
    GLubyte *bytes=(GLubyte*)malloc(lenght); 
    /////////////// read pixels from tex ///////////////////// 
    glBindTexture(GL_TEXTURE_2D,tex); 
    glGetTexImage(GL_TEXTURE_2D,0,GL_BGR,GL_UNSIGNED_BYTE,bytes); 
      uint8_t Rc, Gc, Bc; 
     for(x = 0; x < lenght; x+=3) 
    { 
     Bc = *bytes + x; 
     Gc = *bytes + x + 1; 
     Rc = *bytes + x + 2; 

      } 

爲RC,GC和BC要在0-255範圍?

回答

1

當OpenGL的加載紋理,它將輸入的像素轉換成作爲如在glTexImage*()調用中指定的內部格式提供的格式。該操作可以包括從像素格式glTexImage*()的第三參數)到內部格式的映射步驟,並且通常包括映射到範圍[0,1]或[-1,1]中的一個,然後到每個組件的內部格式的範圍。例如,像素格式爲GL_FLOAT,內部格式爲GL_RGBA8,將導致輸入值從範圍[0,1]映射到範圍[0,255]。

當檢索使用glGetTexImage()紋理像素,該方法是在反向完成,所以輸出像素值(每成分)將在指定的輸出類型的範圍(例如,GL_UNSIGNED_INT你的情況)。無符號整數的範圍是[0,2 -1],所以這將是整數圖像數組中返回值的範圍。如果您需要不同範圍的值(例如GL_UNSIGNED_BYTES),則需要手動將值轉換爲您需要的範圍。個人而言,如果其中一種數據類型OpenGL可以返回匹配所需值的範圍,請嘗試使用該類型。

+0

如果我的紋理具有RGBA和RGBA8作爲內部格式,並且我將它讀作無符號字節,那麼tee數據的範圍是0-255嗎? – 2013-03-14 19:14:30

+0

是的。在這種情況下,甚至不應該進行任何轉換,因爲RGBA8很可能使用無符號字節來存儲組件。 – radical7 2013-03-14 19:41:44