仅加载纹理图像的一部分

时间:2012-09-27 11:00:56

标签: iphone opengl-es opengl-es-2.0

我希望使用纹理精灵/地图集为我的游戏中的某些角色设置动画。

基本思想是始终只加载大图集图像的一部分,即现在应该用作角色纹理的部分。 这可能吗?或者我的思维过程是错误的?

以下是我加载整个纹理的代码。使用row和col参数,我想指定我现在想要用作纹理的图集的哪一部分。

- (GLuint) loadTexture:(NSString*)fileName row:(int)row col:(int)col
{
    NSLog(@"Loading image %@", fileName);
    NSLog(@"Texture Part: %d, %d", row, col);
    CGImageRef spriteImage = [UIImage imageNamed:fileName].CGImage;
    if (!spriteImage) {
        NSLog(@"Failed to load image %@", fileName);
        exit(1);
    }

    size_t img_width = CGImageGetWidth(spriteImage);
    size_t img_height = CGImageGetHeight(spriteImage);

    GLubyte * spriteData = (GLubyte *) calloc(img_width * img_height * 4, sizeof(GLubyte));

    CGContextRef spriteContext = CGBitmapContextCreate(spriteData, img_width, img_height, 8, img_width*4, 
                                                   CGImageGetColorSpace(spriteImage), kCGImageAlphaPremultipliedLast);        

    CGContextDrawImage(spriteContext, CGRectMake(0, 0, img_width, img_height), spriteImage);

    CGContextRelease(spriteContext);

    GLuint texName;
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, texName);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img_width, img_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, spriteData);

    free(spriteData);        
    NSLog(@"Texture successfully loaded!");

    return texName; 
}

现在我只能使用此代码加载整个图像,因此我只能使用原始图像而不是其中的一小部分来显示动画的一个步骤。

2 个答案:

答案 0 :(得分:1)

markturnip是正确的,但你也可以尝试保持纹理坐标相同,并在着色器中使用textureOffset来读取正确的列和行。

http://www.khronos.org/opengles/sdk/docs/manglsl/xhtml/textureOffset.xml

答案 1 :(得分:0)

观看&看一下71Squared的一些例子: http://www.71squared.com/2009/04/iphone-game-programming-tutorial-5-animation-class/

加载整个纹理是正确的,但在绘制时,您将纹理顶点设置为所需列的纹理顶点。行。

作为一个简单的例子:

GLfloat textureVertices[] = {
    1.0f, 0.0f, //br
    0.0f, 0.0f, //bl
    1.0f, 1.0f, //tr
    0.0f, 1.0f, //tl
};
glVertexAttribPointer(attributeTextureCoord, 2, GL_FLOAT, 0, 0, textureVertices);