Какао OpenGL Создание текстур - PullRequest
3 голосов
/ 16 января 2010

Я работаю над своим первым приложением OpenGL, используя Какао (я использовал OpenGL ES на iPhone), и у меня возникают проблемы с загрузкой текстуры из файла изображения. Вот мой код загрузки текстуры:

@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 ]

1 голос
/ 16 января 2010
glGenTextures(1, &textures[texIndex] );

Какое у вас textures определение?

glIsTexture возвращает true, только если текстура уже готова. Имя, возвращаемое glGenTextures, но еще не связанное с текстурой путем вызова glBindTexture, не является именем текстуры.

Проверьте, случайно ли glGenTextures выполняется между glBegin и glEnd - это единственная официальная причина сбоя.

Также:

Проверьте, является ли текстура квадратной и имеет размеры, которые являются степенью 2.

Хотя это нигде не подчеркивается, достаточно того, что реализация iPhone OpenGL ES требует, чтобы они были такими.

0 голосов
/ 16 января 2010

ОК, я понял это. Оказывается, я пытался загрузить текстуры до того, как настроил свой контекст. Как только я поместил загрузочные текстуры в конце метода инициализации, он работал нормально.

Спасибо за ответы.

Кайл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...