繁体   English   中英

iPhone上的2D图形

[英]2D graphics on iPhone

我想要实现的目标:

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

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

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

对不起,如果问题有点混乱,我可以澄清一下。

根据您的描述,我不明白您为什么要使用OpenGL ES。 使用Quartz和图层可以启用1)绘制PNG 2)旋转和移动它们(甚至可以缩放)。 这比在OpenGL中设置正交投影+处理图像加载要容易得多。

现在,如果您真的要使用OpenGL,是的,您应该设置一个正交投影,其视图大小必须严格等于屏幕大小,并绘制一个确切大小的矩形,并使用精确的0/1坐标映射纹理。 对于色彩方面,可以使用8888格式,该格式准确,无压缩,无色彩减少并且具有完整的Alpha。

我知道您说过您不想使用第三方库,但是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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM