[英]Load only part of a texture image
我想通过使用纹理精灵/地图集为游戏中的某些角色设置动画。
基本思想是始终只加载大地图集图像的一部分,该部分现在应用作字符纹理。 这可能吗? 还是我的思考过程错了?
以下是我的代码,用于加载整个纹理。 使用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;
}
现在,我只能使用此代码加载整个图像,因此我只能使用原始图像,而不能使用其中的一小部分来显示动画的一步。
markturnip是正确的,但您也可以尝试使纹理坐标保持相同,并在着色器中使用textureOffset读取正确的列和行。
http://www.khronos.org/opengles/sdk/docs/manglsl/xhtml/textureOffset.xml
在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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.