2017-07-18 51 views
1

我想在四邊形上繪製紋理。我想我的紋理從組織如下像素的1D無符號字符緩衝區綁定:Open GL - 如何從像素緩衝區加載紋理

enter image description here

每個像素由2個字節,這2個字節是一個16位灰度值。

其實我嘗試了很多東西,但我看不到任何東西在我四:

void RawImageDrawer::initializeGL() { 
    glShadeModel(GL_SMOOTH); 
    glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
    glClearDepth(1.0f); 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_TEXTURE_2D); 
    glDepthFunc((GL_LEQUAL)); 
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 
} 

void RawImageDrawer::resizeGL(int width, int height) { 
    if (height == 0) 
    height = 1; 
    glViewport(0, 0, width, height); 
    glMatrixMode(GL_MODELVIEW);*/ 
    glLoadIdentity(); 
} 

void RawImageDrawer::loadTexture() { 
    glGenTextures(1, &texture); 
    glBindTexture(GL_TEXTURE_2D, texture); 
    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_RED, 
    1024, 
    1024, 
    0, 
    GL_LUMINANCE, 
    GL_UNSIGNED_BYTE, 
    buffer //unsigned char* described up there 
); 
} 

void RawImageDrawer::paintGL() { 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glTranslatef(0.0f, 0.0f, 0.0f); 

    glBindTexture(GL_TEXTURE_2D, texture); 

    glBegin(GL_QUADS); 
    glTexCoord2i(0,0); glVertex3f(-0.5f, -0.5f, 0); 
    glTexCoord2i(0,1); glVertex3f(0.5f, -0.5f, 0); 
    glTexCoord2i(1,1); glVertex3f(0.5f, 0.5f, 0); 
    glTexCoord2i(1,0); glVertex3f(-0.5f, 0.5f, 0); 
    glEnd(); 
} 

我也試圖TEXTURE_2D改變TEXTURE_1D,並沒有改變什麼..

回答

0

由於你的緩衝區是16位灰度,你應該指定GL_UNSIGNED_SHORT而不是GL_UNSIGNED_BYTE。確保您的值分佈在整個[0,65535]範圍內,因爲對於16位數據,65535是完整的光度值。

另外GL_RED從來不是glTexImage2D的參數internalFormat的有效值。對於format參數,您應該使用GL_R16作爲internalFormatGL_RED

+0

感謝您的答案,做了這些更改,但我仍然有問題。使用TEXTURE_2D使我的程序崩潰在glTexImage2D函數調用。使用TEXTURE_1D不會使我的程序崩潰,而是在四方面不做任何事情。我的uchar *數組需要在實際數據前後填充嗎? –

+0

@LaurentJerber:默認情況下,行之間的偏移量必須是四個字節的倍數,但在您發佈的代碼中已經是這種情況。如果它仍然崩潰,則問題必須在您未發佈的代碼中的其他地方。特別看看你如何分配緩衝區,也許你有一個bug。 – ybungalobill