Cocoa OpenGL纹理创建

时间:2010-01-16 01:02:41

标签: cocoa opengl

我正在使用Cocoa开发我的第一个OpenGL应用程序(我在iPhone上使用过OpenGL ES),我在从图像文件加载纹理时遇到问题。这是我的纹理加载代码:

@interface MyOpenGLView : NSOpenGLView 
{
GLenum texFormat[ 1 ];   // Format of texture (GL_RGB, GL_RGBA)
NSSize texSize[ 1 ];     // Width and height

GLuint textures[1];     // Storage for one texture
}

- (BOOL) loadBitmap:(NSString *)filename intoIndex:(int)texIndex
{
BOOL success = FALSE;
NSBitmapImageRep *theImage;
int bitsPPixel, bytesPRow;
unsigned char *theImageData;

NSData* imgData = [NSData dataWithContentsOfFile:filename options:NSUncachedRead error:nil];

theImage = [NSBitmapImageRep imageRepWithData:imgData]; 

if( theImage != nil )
{
    bitsPPixel = [theImage bitsPerPixel];
    bytesPRow = [theImage bytesPerRow];
    if( bitsPPixel == 24 )        // No alpha channel
        texFormat[texIndex] = GL_RGB;
    else if( bitsPPixel == 32 )   // There is an alpha channel
        texFormat[texIndex] = GL_RGBA;
    texSize[texIndex].width = [theImage pixelsWide];
    texSize[texIndex].height = [theImage pixelsHigh];

    if( theImageData != NULL )
    {
        NSLog(@"Good so far...");
        success = TRUE;

        // Create the texture

        glGenTextures(1, &textures[texIndex]);

        NSLog(@"tex: %i", textures[texIndex]);

        NSLog(@"%i", glIsTexture(textures[texIndex]));

        glPixelStorei(GL_UNPACK_ROW_LENGTH, [theImage pixelsWide]);

        glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

        // Typical texture generation using data from the bitmap
        glBindTexture(GL_TEXTURE_2D, textures[texIndex]);

        NSLog(@"%i", glIsTexture(textures[texIndex]));

        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, texSize[texIndex].width, texSize[texIndex].height, 0, texFormat[texIndex], GL_UNSIGNED_BYTE, [theImage bitmapData]);

        NSLog(@"%i", glIsTexture(textures[texIndex]));
    }
}


return success;
}

似乎glGenTextures()函数实际上并没有创建纹理,因为textures[0]保持为0.此外,记录glIsTexture(textures[texIndex])总是返回false。

有什么建议吗?

谢谢,

凯尔

2 个答案:

答案 0 :(得分:1)

glGenTextures(1, &textures[texIndex] );

您的textures定义是什么?

如果纹理已准备就绪,

glIsTexture仅返回true。 glGenTextures返回的名称,但通过调用glBindTexture尚未与纹理关联,不是纹理的名称。

检查glBegin和glEnd之间是否偶然执行了glGenTextures - 这是唯一的官方失败原因。

此外:

检查纹理是否为方形且尺寸为2的幂。

虽然iPhone的OpenGL ES实现不需要强调,但要求它们就是这样。

答案 1 :(得分:0)

好的,我明白了。事实证明我在设置上下文之前尝试加载纹理。一旦我在初始化方法结束时加载纹理,它就可以正常工作。

感谢您的回答。

凯尔