2017-10-19 170 views
2

好吧,我需要創建自己的紋理/圖像數據,然後將其顯示到OpenGL中的四邊形上。我有四工作,我可以用我自己的紋理加載器將TGA文件顯示在它上面,並且它完美地映射到四邊形。OpenGL紋理格式,爲OpenGL創建圖像/紋理數據

但是,如何爲每個像素創建自己的「自制圖像」,即1000x1000和3個通道(RGB值)?紋理數組的格式是什麼,例如我如何將像素(100,100)設置爲黑色?

這是我怎麼會想象它爲全白圖像/紋理:

#DEFINE SCREEN_WIDTH 1000 
#DEFINE SCREEN_HEIGHT 1000 

unsigned int* texdata = new unsigned int[SCREEN_HEIGHT * SCREEN_WIDTH * 3]; 
for(int i=0; i<SCREEN_HEIGHT * SCREEN_WIDTH * 3; i++) 
     texdata[i] = 255; 

GLuint t = 0; 
glEnable(GL_TEXTURE_2D); 
glGenTextures(1, &t); 
glBindTexture(GL_TEXTURE_2D, t); 

// Set parameters to determine how the texture is resized 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR_MIPMAP_LINEAR); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR); 
// Set parameters to determine how the texture wraps at edges 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_S , GL_REPEAT); 
glTexParameteri (GL_TEXTURE_2D , GL_TEXTURE_WRAP_T , GL_REPEAT); 
// Read the texture data from file and upload it to the GPU 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 
      GL_RGB, GL_UNSIGNED_BYTE, texdata); 
glGenerateMipmap(GL_TEXTURE_2D); 

編輯:下面的答案是正確的,但我也發現,OpenGL的不處理,我用正常的整數,但它的工作原理罰款與uint8_t。我認爲這是因爲GL_RGB與我上傳到GPU時使用的GL_UNSIGNED_BYTE(只有8位,正常的int不是8位)標誌一起使用。

+0

我不明白,你嘗試過這樣做?你只需要傳遞一大塊包含數據而不是圖像數據的字節。顯示如何將數據從您的圖像加載器傳遞到GL紋理的後代碼,然後嘗試將自制圖像數據傳遞到紋理,並告訴我們什麼不起作用。 – zero298

+0

我意識到你需要專門爲OpenGL創建無符號的8位整數來正確解釋它們作爲RGB值。我真的一直在嘗試這個好幾天,並設法解決它,就像我決定發佈這個之後的2分鐘一樣...... – Jackbob

+0

Eh,'GL_UNSIGNED_INT'也是一個有效的'glTexImage2D()'''type'',你會只需將色彩通道範圍從[0,2^8-1]擴展到[0,2^32-1]即可。 – genpfault

回答

3

但是,如何爲每個像素創建我自己的「自制圖像」,即1000x1000和3個通道(RGB值)?

std::vector< unsigned char > image(1000 * 1000 * 3 /* bytes per pixel */); 

什麼是紋理數組

紅字節,那麼綠色字節,然後藍色字節的格式。重複。

我如何將像素(100,100)設置爲黑色?

unsigned int width = 1000; 
unsigned int x = 100; 
unsigned int y = 100; 
unsigned int location = (x + (y * width)) * 3; 
image[ location + 0 ] = 0; // R 
image[ location + 1 ] = 0; // G 
image[ location + 2 ] = 0; // B 

上傳通過:

// the rows in the image array don't have any padding 
// so set GL_UNPACK_ALIGNMENT to 1 (instead of the default of 4) 
// https://www.khronos.org/opengl/wiki/Pixel_Transfer#Pixel_layout 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 
glTexImage2D 
    (
    GL_TEXTURE_2D, 0, 
    GL_RGB, 1000, 1000, 0, 
    GL_RGB, GL_UNSIGNED_BYTE, &image[0] 
    ); 
+0

@lisyarus:Doh!感謝您的修復:) – genpfault

+0

不客氣!我也覺得,解釋解包對齊的事情會很好。 – lisyarus

+0

謝謝!經過幾天的努力,我設法解決了這個問題。看來我不能使用普通的無符號整數,而是使用uint8_t來創建8位,因爲OpenGL似乎不熟悉變量太大以及如何處理它們。 – Jackbob

1

如果你想指定二維紋理圖像(glTexImage2D),這是緊湊,那麼你必須設置GL_UNPACK_ALIGNMENT爲1(見glPixelStore )。

glPixelStore(GL_UNPACK_ALIGNMENT, 1); 

由於使用索裏格式GL_RGBGL_UNSIGNED_BYTE,的3個顏色通道(紅色,綠色和藍色)和每個顏色通道被存儲在一個字節中範圍[0,255]每個像素consits。

如果你想在(xy)像素爲着色RGB,這將是這樣完成的:

texdata[(y*WIDTH+x)*3+0] = R; 
texdata[(y*WIDTH+x)*3+1] = G; 
texdata[(y*WIDTH+x)*3+2] = B;