[英]2D graphics on iPhone
我想要实现的目标:
实际上,我不想使用任何第三方库(例如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.