2014-12-26 31 views
1

我正在嘗試讀取.raw圖片格式,並在OpenGL中對其進行一些修改。我可以讀取圖像是這樣的:如何在opengl中使用.raw文件

int width, height; 
BYTE * data; 
FILE * file; 

file = fopen(filename, "rb"); 
if (file == NULL) return 0; 

width = 256; 
height = 256; 
data = malloc(width * height * 3); 

fread(data, width * height * 3, 1, file); 
fclose(file); 

但我不知道如何使用glDrawPixels繪製圖片。

我的第二個問題是我不知道如何訪問每個像素。我的意思是在.raw圖像格式中,每個像素應該有3個整數用於存儲RGB值(對嗎?)。我怎樣才能直接訪問這些RGB值?

回答

2

在硬而快的意義上,沒有像.raw這樣的東西。該名稱暗示圖像數據沒有標題,但沒有指定數據的格式。 RGB很可能,但RGBA也是如此,考慮幾乎無盡的其他可能性是微不足道的。

假設RGB排序,每個通道一個字節,則:每個像素爲三個字節寬。因此,第n個像素是:

r = data[n*3 + 0] 
g = data[n*3 + 1] 
b = data[n*3 + 2] 

假設數據被設定了,使得像素存儲在左到右的順序,一行行,然後在第一行中的像素在x = 3是在n = 3時,在第二它是在n =(第一線寬度)3,在它的在n =(的前兩行組合寬度)3的第三等

所以:

r = data[(x + y*width)*3 + 0] 
g = data[(x + y*width)*3 + 1] 
b = data[(x + y*width)*3 + 2] 

要使用glDrawPixels只需按照the manual告訴您指定的參數。它說:

void glDrawPixels( GLsizei  width, 
        GLsizei  height, 
        GLenum  format, 
        GLenum  type, 
        const GLvoid *  data); 

你說,寬度和高度是256.你說格式是RGB。掃描文檔,你會看到相應的GLenumGL_RGB。你說每個通道的大小都是單個字節。這就是GL_UNSIGNED_BYTE。您已將數據加載到data。所以:

glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data); 

進一步意見:顯然得到這個第一次工作因此你的東西的基礎上,但glDrawPixels是在實踐中幾乎未被使用。因此它甚至不是OpenGL ES的一部分,或者相應地,也不是WebGL的一部分。看看事物的語義。每次打電話時都提供緩衝區。 OpenGL無法知道它自上次調用以來是否被修改過。所以每個呼叫都會將您的數據從CPU傳輸到GPU。查看一次將數據作爲紋理使用幾何圖形提交。這將節省每次通話的傳輸成本,因此效率更高。

+1

OP在哪裏說寬度和高度是** 257 **?這實際上是非常令人不安的,因爲除了是一個醜陋的非二次方的權力之外,** 257 ** x ** 3 ** mod ** 4 **!= ** 0 **。這意味着默認像素解包對齊(每行4個字節)將是不正確的,圖像將出現傾斜的災難,圖像的每一行開始在錯誤的地方;) –

+0

@ AndonM.Coleman錯字修復。但是,是的,需要提及一些'GL_UNPACK_ALIGNMENT'。或僅僅是對例如http://stackoverflow.com/questions/11042027/glpixelstoreigl-unpack-alignment-1-disadvantages – Tommy