2013-04-23 70 views
0

這是一個非常奇怪的問題。我使用從蘋果示例複製的方法創建紋理。它在蘋果樣本中工作正常,但不在礦山項目中。紋理不顯示,只有glcolor4f定義的顏色。我用glistexture和glgeterror來檢查,他們說沒有錯。這隻發生在我第一次加載紋理。如果我釋放紋理並重新加載,它可以使用相同的代碼。有沒有其他的方法來檢查OpenGL的錯誤?OpenGL紋理沒有顯示(用可可)

這裏是我使用加載紋理的代碼:

- (FETexture *)loadTextureWithPath:(NSString*)name{ 
NSURL *url = nil; 
CGImageSourceRef src; 
CGImageRef image; 
CGContextRef context = nil; 
CGColorSpaceRef colorSpace; 

GLuint textureId; 
GLuint pboId; 
GLubyte *data; 

url = [NSURL fileURLWithPath: name]; 
src = CGImageSourceCreateWithURL((__bridge CFURLRef)url, NULL); 

if (!src) { 
    NSLog(@"No image"); 
    return nil; 
} 

image = CGImageSourceCreateImageAtIndex(src, 0, NULL); 
CFRelease(src); 

GLuint width = (GLint)CGImageGetWidth(image); 
GLuint height = (GLint)CGImageGetHeight(image); 

data = (GLubyte*) calloc(width * height * 4, sizeof(GLubyte)); 

colorSpace = CGColorSpaceCreateDeviceRGB(); 
context = CGBitmapContextCreate(data, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); 
CGColorSpaceRelease(colorSpace); 

// Core Graphics referential is upside-down compared to OpenGL referential 
// Flip the Core Graphics context here 
// An alternative is to use flipped OpenGL texture coordinates when drawing textures 
CGContextTranslateCTM(context, 0.0, height); 
CGContextScaleCTM(context, 1.0, -1.0); 

// Set the blend mode to copy before drawing since the previous contents of memory aren't used. This avoids unnecessary blending. 
CGContextSetBlendMode(context, kCGBlendModeCopy); 

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image); 

CGContextRelease(context); 
CGImageRelease(image); 

glGenTextures(1, &textureId); 
glGenBuffers(1, &pboId); 

// Bind the texture 
glBindTexture(GL_TEXTURE_2D, textureId); 

// Bind the PBO 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pboId); 

// Upload the texture data to the PBO 
glBufferData(GL_PIXEL_UNPACK_BUFFER, width * height * 4 * sizeof(GLubyte), data, GL_STATIC_DRAW); 

// Setup texture parameters 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); 

// OpenGL likes the GL_BGRA + GL_UNSIGNED_INT_8_8_8_8_REV combination 
// Use offset instead of pointer to indictate that we want to use data copied from a PBO 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, 
      GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, 0); 

// We can delete the application copy of the texture data now 
free(data); 

glBindTexture(GL_TEXTURE_2D, 0); 
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0); 

FETexture *texture = [FETexture new]; 

texture.textureID = textureId; 
texture.bufferID = pboId; 
texture.width = width; 
texture.height = height; 

return texture; 

回答

0

你沒有表現出任何的抽獎網站的相關代碼。也許你在抽籤時沒有約束這個紋理。

您可以在https://developer.apple.com/downloads/index.action的「Graphics tools for Xcode」中使用OpenGL Profiler來調試GL錯誤和狀態。

+0

真的非常感謝您的回答。我不顯示繪製代碼是因爲數據架構非常複雜。但是當我加載和繪製時,我會打印紋理名稱,它也是一樣的。我已經刪除了一堆代碼,根本沒有任何改變。今天,我把這個項目帶到另一個mac,它的工作正常......爲什麼......好吧,我將使用調試工具來檢查它是否是xcode或我的hacintosh問題。真的非常感謝您的幫助。 – user1904689 2013-04-24 02:02:43