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; 
}

現在、このコードでロードできるのは画像全体のみであるため、元の画像のみを使用でき、アニメーションの1つのステップを表示するためにその一部を使用することはできません。

4

2 に答える 2

1

markturnipは正しいですが、テクスチャ座標を同じに保ち、シェーダーでtextureOffsetを使用して、正しい列と行を読み取ることもできます。

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

于 2012-09-27T11:28:49.880 に答える
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);
于 2012-09-27T11:11:49.067 に答える