2011-11-03 40 views
3

我正在嘗試使用一些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)繪圖代碼。但是我已經在設置代碼中做了這個。爲什麼我必須再做一次?

+0

代碼對我來說看起來很好。嘗試在調試器中單步執行以檢查glTexImage2D函數是否實際被調用,並且位圖(寬度,高度等)是您所期望的。 –

+0

glTexImage2D是否返回GL_NO_ERROR? –

+0

沒有任何錯誤發生。 'glTexImage2D'肯定是被調用的,輸出看起來是正確的。我還檢查了數據數組實際上包含正確的像素數據。 – bastibe

回答

1

如果我用glEnable(GL_TEXTURE_2D)和glDisable(GL_TEXTURE_2D)環繞繪圖代碼,紋理繪製得很好。但是我已經在設置代碼中做了這個。

我會建議,但你已經發現了。

爲什麼我必須重做一次?

由於OpenGL是一個狀態機,事實上在OpenGL中沒有像「一次初始化」那樣的事情。功能可隨時啓用和禁用。所以建議的做法是在顯示程序中保持全部爲 OpenGL操作。這包括設置投影,啓用所需的功能。

相關問題