我正在嘗試使用一些OpenGL。在玩了一段時間之後,我可以畫出彩色的幾何形狀。現在,我想在這些形狀上添加紋理。我嘗試繪製一個帶有紋理的矩形,但我得到的只是一個白色的矩形。爲什麼?
所以,我創建了一個紋理。它似乎被創建好。然後我試圖畫出它,但我得到的只是一個白色的矩形。
代碼實際上分佈在NSOpenGLView
的三種方法中,但我將其全部放在一個代碼塊中以節省空間。
// ----- Set up OpenGL (this code is adapted from the NeHe OpenGL tutorial) -----
GLuint textureName = 0;
glEnable(GL_TEXTURE_2D);
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.5f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
// ----- I load the image: (This code is adapted from some sample code from Apple) -----
NSImage *image = dataSource.image; // get the original image
NSBitmapImageRep* bitmap = [NSBitmapImageRep alloc];
[image lockFocus];
[bitmap initWithFocusedViewRect:
NSMakeRect(0.0, 0.0, image.size.width, image.size.height)];
[image unlockFocus];
// Set proper unpacking row length for bitmap.
glPixelStorei(GL_UNPACK_ROW_LENGTH, bitmap.pixelsWide);
// Set byte aligned unpacking (needed for 3 byte per pixel bitmaps).
if (bitmap.samplesPerPixel == 3) {
glPixelStorei (GL_UNPACK_ALIGNMENT, 1);
}
// Generate a new texture name if one was not provided.
if (textureName == 0)
glGenTextures (1, &textureName);
glBindTexture (GL_TEXTURE_2D, textureName);
// Non-mipmap filtering (redundant for texture_rectangle).
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
// RGB 24 bit bitmap, or RGBA 32 bit bitmap
if(bitmap.samplesPerPixel == 3 || bitmap.samplesPerPixel == 4) {
glTexImage2D(GL_TEXTURE_2D, 0,
bitmap.samplesPerPixel == 4 ? GL_RGBA8 : GL_RGB8,
bitmap.pixelsWide,
bitmap.pixelsHigh,
0,
bitmap.samplesPerPixel == 4 ? GL_RGBA : GL_RGB,
GL_UNSIGNED_BYTE,
bitmap.bitmapData);
}
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
[bitmap release];
// ----- Drawing code (This code is adapted from the NeHe OpenGL tutorial) -----
glClearColor(0, 0, 0, 0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
if (textureName) {
glBindTexture(GL_TEXTURE_2D, textureName);
glBegin(GL_QUADS);
{
glTexCoord2f(1.0, 0.0); glVertex3f(0.5, -0.5, 0.0);
glTexCoord2f(1.0, 1.0); glVertex3f(0.5, 0.5, 0.0);
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, 0.5, 0.0);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, -0.5, 0.0);
}
glEnd();
}
glFlush();
唉,我所得到的只是一個白色的矩形,其大小是在黑暗中看到的。
我也嘗試插入幾個glGetError()
s在這裏和那裏,但似乎沒有錯誤發生。
爲什麼我的紋理不顯示?任何提示將不勝感激。
編輯:
紋理繪製的罰款,如果我周圍有glEnable(GL_TEXTURE_2D)
和glDisable(GL_TEXTURE_2D)
繪圖代碼。但是我已經在設置代碼中做了這個。爲什麼我必須再做一次?
代碼對我來說看起來很好。嘗試在調試器中單步執行以檢查glTexImage2D函數是否實際被調用,並且位圖(寬度,高度等)是您所期望的。 –
glTexImage2D是否返回GL_NO_ERROR? –
沒有任何錯誤發生。 'glTexImage2D'肯定是被調用的,輸出看起來是正確的。我還檢查了數據數組實際上包含正確的像素數據。 – bastibe