我想要实现的目标:
实际上我不想使用像cocos2d这样的第三方库。我一直在阅读有关OpenGL ES的博客,还检查了Texture2D.m,因此我对在3D空间中绘制图元有了基本的想法。据我所知,如果我需要绘制和动画图像(精灵?)我可以制作矩形和地图纹理。但问题是我希望我的png文件看起来完全像原始文件,而不是缩放或旋转。
实现上述要点的最佳技巧是什么?在正交视口中绘制纹理矩形?如何保留图像的原始尺寸/颜色?
对不起,如果问题有点搞砸了,我可以澄清一下。
答案 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
}