2015-04-06 38 views
0

我有圖像數據的std::container中的格式:OpenGL的上傳像素數據*浮點格式(C++)

struct C 
{ 
    float r; 
    float g; 
    float b; 
    float a; 
} 

所以它看起來像:

std::vector<C> colours(width*height); 

其中寬度和高度是我的形象的大小。

現在,我想把它推入OpenGL中的紋理。

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA8,width,height,0,GL_RGBA,GL_FLOAT,colours.data()); 

(存在總共是6,一個用於我的立方體貼圖的每一側上。寬度和高度也是相同的所要求的立方貼圖)。

但我得到一個黑色的紋理。 GLIntercept沒有給我提示任何問題。

因此,審查https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glTexImage2D.xml後,我認爲我應該稱它想:

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA8,width,height,0,GL_RGBA32F,GL_FLOAT,colours.data()); 

的變化在於我表明我的像素數據是32位的花車,以及每像素有4。

但是,這也給我一個黑色的紋理,以及GLIntercept告訴我這個電話正在產生一個GL_INVALID_ENUM

查看相同的文檔告訴我,glTexImage2D將導致GL_INVALID_ENUM在某些條件下,我沒有遇到過。

基本上,我只是想讓我的4個浮動容器變成紋理。

回答

1

我認爲你應該應該努力

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA32F, 
      width, height, 0, GL_RGBA, GL_FLOAT, colours.data()); 

好像你在一個錯誤的方式使用internalformatformat

+0

不,不是的,那不是。你說得對,我有'internalFormat'和'format'混淆。但是這並沒有解決它。據我瞭解,'internalformat'並不重要,因爲OpenGL會將我發送的任何*轉換成*格式。它是'GL_RGBA'的格式,表示將會有4個組件,而'type'表示每個組件將是'GL_FLOAT'。仍然不知道我在做什麼錯... – NeomerArcana 2015-04-06 10:13:45

+0

實際上'internalformat'定義了OGL如何在內部存儲texels,'format'定義了輸入紋素數據的格式。在OGL ES 2.0'internalformat'中的BTW必須與'format'相等,所以也許你應該爲'internalformat'和'format'使用'GL_RGBA32F'。 – tonso 2015-04-06 10:45:39

+0

該文檔明確指出了選項,這不是常規OpenGL的選項之一。我相信我找到了答案,但我現在正在調試。我認爲問題是在早期階段;與上述無關。 – NeomerArcana 2015-04-06 10:50:16