2012-10-19 36 views
3

我正在學習OpenGL環境中的紋理。我發現在將圖像數據傳遞到視頻內存之前沒有獲取實際圖像數據的常規方法。是否可以'手動'爲OpenGL紋理使用創建圖像數據?

出於好奇,是否有可能創建自己的像素數據矩陣,並用任意信息填充它,而不是實際讀取位圖或圖像文件?

+0

是。讀取圖像文件和手動創建圖像文件是沒有區別的,因爲兩者都表示爲r/g/b/a(或使用任何格式)值的數組。 – Hyndrix

+3

咦?當然,爲什麼不?最後,它是一組原始像素數據,無論是從文件讀取還是由程序填充。 –

回答

8

的OpenGL不知道文件是什麼。它不知道文件圖像格式等等。它沒有功能將文件加載到紋理中。

各種pixel transfer functions將指針指向內存(或buffer objects containing memory)。您如何生成這些數據完全取決於您。您可以從文件加載它,從算法創建它,無論您想要做什麼。

0

至少在WebGL中有。 這是一個使用32位浮點/像素亮度紋理的例子。 (編輯:不是8 BPP)

http://jsfiddle.net/greggman/upZ7V/

gl.texImage2D( gl.TEXTURE_2D,0,gl.LUMINANCE, 寬度,高度,0,gl.LUMINANCE,gl.FLOAT, 像素); 其中像素是一個數組。

我敢打賭,這個工程完全按照在OpenGL規格相同的API:

void TexImage2D (enum target, int level, int internalformat, sizei width, sizei height, int border, enum format, enum type, void *data)

8

我看到有沒有傳統的方式獲取實際的圖像數據,然後將其傳遞到視頻內存。

「傳統」是什麼意思?

出於好奇,是否有可能創建自己的像素數據矩陣,並用任意信息填充它,而不是實際讀取位圖或圖像文件?

好看看的,嗯簽名,讓我們說glTexImage2D:

void glTexImage2D(GLenum target, 
         GLint level, 
         GLint internalformat, 
         GLsizei width, 
         GLsizei height, 
         GLint border, 
         GLenum format, 
         GLenum type, 
         const GLvoid *pixels) 

最後一個參數需要一個指針到一些內存。該內存必須在您傳遞給OpenGL之前由您填充。通過讀取和解碼圖像文件或通過程序化生成圖像來填充此內存。事實上,官方OpenGL編程指南(紅皮書)中的大多數示例都會以程序方式生成圖像數據。例如,這是從第1版的第9章(被警告,這是不是一個很好的編程風格,不應該被遵循):

#define checkImageWidth 64 
#define checkImageHeight 64 
static GLubyte checkImage[checkImageHeight][checkImageWidth][4]; 

static GLuint texName; 

void makeCheckImage(void) 
{ 
    int i, j, c; 

    for (i = 0; i < checkImageHeight; i++) { 
     for (j = 0; j < checkImageWidth; j++) { 
     c = ((((i&0x8)==0)^((j&0x8))==0))*255; 
     checkImage[i][j][0] = (GLubyte) c; 
     checkImage[i][j][1] = (GLubyte) c; 
     checkImage[i][j][2] = (GLubyte) c; 
     checkImage[i][j][3] = (GLubyte) 255; 
     } 
    } 
} 

void init(void) 
{  

    /* ... */ 

    makeCheckImage(); 
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

    glGenTextures(1, &texName); 
    glBindTexture(GL_TEXTURE_2D, texName); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
        GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
        GL_NEAREST); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, checkImageWidth, 
       checkImageHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, 
       checkImage); 
} 
相關問題