在硬而快的意義上,沒有像.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。掃描文檔,你會看到相應的GLenum
是GL_RGB
。你說每個通道的大小都是單個字節。這就是GL_UNSIGNED_BYTE
。您已將數據加載到data
。所以:
glDrawPixels(256, 256, GL_RGB, GL_UNSIGNED_BYTE, data);
進一步意見:顯然得到這個第一次工作因此你的東西的基礎上,但glDrawPixels
是在實踐中幾乎未被使用。因此它甚至不是OpenGL ES的一部分,或者相應地,也不是WebGL的一部分。看看事物的語義。每次打電話時都提供緩衝區。 OpenGL無法知道它自上次調用以來是否被修改過。所以每個呼叫都會將您的數據從CPU傳輸到GPU。查看一次將數據作爲紋理使用幾何圖形提交。這將節省每次通話的傳輸成本,因此效率更高。
OP在哪裏說寬度和高度是** 257 **?這實際上是非常令人不安的,因爲除了是一個醜陋的非二次方的權力之外,** 257 ** x ** 3 ** mod ** 4 **!= ** 0 **。這意味着默認像素解包對齊(每行4個字節)將是不正確的,圖像將出現傾斜的災難,圖像的每一行開始在錯誤的地方;) –
@ AndonM.Coleman錯字修復。但是,是的,需要提及一些'GL_UNPACK_ALIGNMENT'。或僅僅是對例如http://stackoverflow.com/questions/11042027/glpixelstoreigl-unpack-alignment-1-disadvantages – Tommy