iPhone上的2D图形

时间:2010-10-01 12:00:51

标签: iphone opengl-es

我想要实现的目标:

  • 使用与原始显示完全相同的alpha绘制png文件,而不转换任何像素。这是因为图像非常详细,我不想丢失任何信息。
  • 通过旋转和移动来动画这些图像。没有缩放。

实际上我不想使用像cocos2d这样的第三方库。我一直在阅读有关OpenGL ES的博客,还检查了Texture2D.m,因此我对在3D空间中绘制图元有了基本的想法。据我所知,如果我需要绘制和动画图像(精灵?)我可以制作矩形和地图纹理。但问题是我希望我的png文件看起来完全像原始文件,而不是缩放或旋转。

实现上述要点的最佳技巧是什么?在正交视口中绘制纹理矩形?如何保留图像的原始尺寸/颜色?

对不起,如果问题有点搞砸了,我可以澄清一下。

2 个答案:

答案 0 :(得分:1)

根据您的描述,我不明白您为何使用OpenGL ES。使用Quartz和图层可以实现1)绘制PNG 2)旋转和移动它们(如果你愿意,甚至缩放)。它比在OpenGL +处理图像加载时设置正交投影更容易。

现在,如果你真的想去OpenGL,是的,你应该设置一个正交投影,视图大小严格等于屏幕尺寸,并绘制一个确切大小的矩形,纹理映射精确的0/1坐标。对于颜色方面,您可以使用8888格式,这是精确的,无压缩,无色彩还原和完整的alpha。

答案 1 :(得分:1)

我知道您说您不想使用第三方库,但Cocos2D使用OpenGL实现2D图形,因此您可以参考CCSprite.m来了解它们是如何做到的。也就是说,您可能需要考虑此库是否适合您的应用程序。为了进行自己的3D渲染,您只需要扩展CCSprite并输入您自己的代码,正如您在下面的注释中所看到的,已经为您和所有内容设置了状态。

CCSprite.m:

-(void) draw
{   
    NSAssert(!usesBatchNode_, @"If CCSprite is being rendered by CCSpriteBatchNode, CCSprite#draw SHOULD NOT be called");

    // Default GL states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
    // Needed states: GL_TEXTURE_2D, GL_VERTEX_ARRAY, GL_COLOR_ARRAY, GL_TEXTURE_COORD_ARRAY
    // Unneeded states: -

    BOOL newBlend = NO;
    if( blendFunc_.src != CC_BLEND_SRC || blendFunc_.dst != CC_BLEND_DST ) {
        newBlend = YES;
        glBlendFunc( blendFunc_.src, blendFunc_.dst );
    }

#define kQuadSize sizeof(quad_.bl)
    glBindTexture(GL_TEXTURE_2D, [texture_ name]);

    long offset = (long)&quad_;

    // vertex
    NSInteger diff = offsetof( ccV3F_C4B_T2F, vertices);
    glVertexPointer(3, GL_FLOAT, kQuadSize, (void*) (offset + diff) );

    // color
    diff = offsetof( ccV3F_C4B_T2F, colors);
    glColorPointer(4, GL_UNSIGNED_BYTE, kQuadSize, (void*)(offset + diff));

    // tex coords
    diff = offsetof( ccV3F_C4B_T2F, texCoords);
    glTexCoordPointer(2, GL_FLOAT, kQuadSize, (void*)(offset + diff));

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

    if( newBlend )
        glBlendFunc(CC_BLEND_SRC, CC_BLEND_DST);

#if CC_SPRITE_DEBUG_DRAW
    CGSize s = [self contentSize];
    CGPoint vertices[4]={
        ccp(0,0),ccp(s.width,0),
        ccp(s.width,s.height),ccp(0,s.height),
    };
    ccDrawPoly(vertices, 4, YES);
#endif // CC_TEXTURENODE_DEBUG_DRAW

}