android 用png图片有黑边像做opengl纹理时出现黑边怎么解决

OpenGL中使用jpg图片做纹理
在Opengl中,我们经常要用到纹理贴图,当然最方便的就是贴位图文件,bmp格式。但是很多时候我们拿到手的图片是jpg,png等其它格式的图片。也许你会说将jpg转换为bmp就行了,这种方法也的确可行,但是bmp图片没有压缩,占有很大的空间,而且每次都来个图片转换也实在麻烦。这里我们使用
GDI+中的 CImage类直接加在 纹理图片(各种格式的都可以)。然后在通过图片的色彩信息做纹理。
代码如下:
void CPanoramaView::LoadGLTextures(CString path){
&glGenTextures(1, &g_texPanoramic);
&&img.Load(path);
//& 通过图片文件名字来加在
&&int width =
img.GetWidth();
&&int height =
img.GetHeight();
&unsigned char *pData = NULL;
&&if(img.GetPitch()&0)
//GetBits的作用就是获得纹理的位信息缓冲区指针,如果位图是从下到上,&则指向缓冲区末端,否则指向缓冲区首端。而img.GetPitch
就是起这个判断作用,小于 0 指向末端
pData = (unsigned char
*)img.GetBits()+(img.GetPitch()*(img.GetHeight()-1));&
&&pData = (unsigned char
*)img.GetBits();
&glBindTexture(GL_TEXTURE_2D,g_texPanoramic);
&glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
&glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
&glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,width,
height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pData);
另外一个值得注意的问题是glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,width, height,
0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pData);
直接以OPengl的方式读取位图文件的时候,他的第七个参数 为GL_RGB。但是我们用GDI+,也就是CImage类读取的时候
这个参数必须设置为GL_BGR_EXT。 这是因为在 我们的
24色图片中,用GDI+读取的色彩后的存储顺序为BGR,和RGB相比,R和B换位置了,那这样的结果就是图片色彩严重失真。所以解决方案有两个,第一就是调换R和B的顺序,代码实现就是循环遍历每个像素点,但是存在一个很大的问题,图片大的时候,比如像素的图片,其循环次数就几百万次了,这个调换的消耗时间是比较大的。
第二种就是这种参数的设置,简单方便。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。一个兴趣使然的独立游戏开发者
【C# / OpenGL】CSGL中2D纹理加载PNG等透明图片显示的黑边问题
CSGL加载PNG格式图片作为纹理映射显示后是有黑边的,使用的是CSGL封装的OpenGLTexture2D类。
后来查了很多OpenGL透明纹理的资料,网上找了各种其他语言的透明纹理实现,在CSGL库上均不起效,最后怀疑是CSGL底层封装时对像素的处理有问题。
反正是开源库,那就打开源码看看,最后自己实现了一个加载纹理的函数,和一个绘制纹理到二维坐标系的函数。
有效解决了黑边的问题,但是还有如下小问题没有解决:
1.只能区分透明和不透明(0或255 Alpha),中间的其他半透明效果均无法正确融合显示
2.图片缩放后会有空白像素点,可能是线性过滤导致的,但不开启过滤也无法正常显示纹理。
/// &summary&
/// 从文件创建2D纹理
/// &/summary&
/// &param name="fileName"&文件名(路径)&/param&
/// &returns&纹理ID&/returns&
public static uint[] CreateTexture2D(string fileName)
// 用GDI将原始图像转换为32位png格式图像
Bitmap bmp_orign = new Bitmap(fileName);
Bitmap bmp_new = new Bitmap(bmp_orign.Width, bmp_orign.Height, PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bmp_new);
g.DrawImage(bmp_orign, new Rectangle(0, 0, bmp_orign.Width, bmp_orign.Height));
// 锁定内存
BitmapData tex = bmp_new.LockBits(new Rectangle(0, 0, bmp_new.Width, bmp_new.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
// 像素处理
IntPtr ptr = tex.Scan0;
int bytesLength = tex.Stride * tex.H
byte[] rgbValues = new byte[bytesLength];
Marshal.Copy(ptr, rgbValues, 0, bytesLength);
for (int i = 0; i & rgbValues.L i += 4)
//rgbValues[i] = 255;
//rgbValues[i + 1] = 255;
//rgbValues[i + 2] = 255;
//rgbValues[i + 3] = 255;
if (rgbValues[i + 3] == 0) rgbValues[i + 3] = 150;
Marshal.Copy(rgbValues, 0, ptr, bytesLength);
// 创建纹理
uint[] texture = new uint[1];
GL.glGenTextures(texture.Length, texture);
GL.glBindTexture(GL.GL_TEXTURE_2D, texture[0]);
// 设置像素对齐
GL.glPixelStoref(GL.GL_PACK_ALIGNMENT, 1);
// 设置环境融合方式和线性过滤参数
GL.glTexEnvi(GL.GL_TEXTURE_ENV, GL.GL_TEXTURE_ENV_MODE, (int)GL.GL_MODULATE);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP);
GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP);
// 创建纹理
bool IsBorder =
bool IsMipmaped =
if (IsMipmaped)
GL.gluBuild2DMipmaps(GL.GL_TEXTURE_2D, (int)GL.GL_BGRA, bmp_new.Width, bmp_new.Height, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, tex.Scan0);
GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_BGRA, bmp_new.Width, bmp_new.Height, IsBorder ? 1 : 0, GL.GL_BGRA, GL.GL_UNSIGNED_BYTE, tex.Scan0);
// 解锁内存
bmp_new.UnlockBits(tex);
// 返回纹理ID
/// &summary&
/// 绘制纹理
/// &/summary&
/// &param name="texture"&纹理ID&/param&
/// &param name="x"&起点x&/param&
/// &param name="y"&起点y&/param&
/// &param name="width"&宽度&/param&
/// &param name="height"&高度&/param&
public static void DrawImage(uint[] texture, int x, int y, int width, int height)
// 允许使用纹理
GL.glEnable(GL.GL_TEXTURE_2D);
// 启用颜色混合
GL.glEnable(GL.GL_BLEND);
GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_DST_ALPHA);
// 绑定纹理
GL.glBindTexture(GL.GL_TEXTURE_2D, texture[0]);
// 坐标转换
y = General.Win_Rect.Height - y -
GL.glBegin(GL.GL_QUADS);
// 纹理坐标映射
GL.glTexCoord2f(0.0f, 1.0f); GL.glVertex2f(x, y);
GL.glTexCoord2f(1.0f, 1.0f); GL.glVertex2f(x + width, y);
GL.glTexCoord2f(1.0f, 0.0f); GL.glVertex2f(x + width, y + height);
GL.glTexCoord2f(0.0f, 0.0f); GL.glVertex2f(x, y + height);
GL.glEnd();
// 禁用混合
GL.glDisable(GL.GL_BLEND);
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!OpenGL ES png贴图边缘黑边问题
[问题点数:40分,结帖人wqb55]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:58310
2012年6月 移动平台大版内专家分月排行榜第一2012年5月 移动平台大版内专家分月排行榜第一2012年4月 移动平台大版内专家分月排行榜第一2012年3月 移动平台大版内专家分月排行榜第一2012年2月 移动平台大版内专家分月排行榜第一2012年1月 移动平台大版内专家分月排行榜第一2011年12月 移动平台大版内专家分月排行榜第一2011年11月 移动平台大版内专家分月排行榜第一2011年10月 移动平台大版内专家分月排行榜第一2011年9月 移动平台大版内专家分月排行榜第一2011年6月 移动平台大版内专家分月排行榜第一2011年5月 移动平台大版内专家分月排行榜第一2011年4月 移动平台大版内专家分月排行榜第一
2011年8月 移动平台大版内专家分月排行榜第二2011年7月 移动平台大版内专家分月排行榜第二2011年3月 移动平台大版内专家分月排行榜第二
2012年8月 移动平台大版内专家分月排行榜第三2012年7月 移动平台大版内专家分月排行榜第三
本版专家分:0
结帖率 100%
本版专家分:0
结帖率 100%
匿名用户不能发表回复!|
CSDN今日推荐OpenGL png图片 纹理贴图,去除png图片黑边
将png图片作为纹理贴图,在图片周围会产生黑边,在网上查了一下,都没有明确指出解决方法!废话不说了,看代码。
protected void init(GL10 gl) {
// Setup background color
gl.glClearColor(1, 1, 1, 1);
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_DEPTH_TEST);
glEnable(GL10.GL_ALPHA_TEST);
// Enable Alpha Testing (To Make BlackTansparent)
glAlphaFunc(GL10.GL_GREATER,0.1f);
// Set Alpha Testing (To Make Black Transparent)
// Setup project matrix
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluOrtho2D(gl, 0.0f,1.3f,0.0f,1.0f);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texBuff);
gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
tex = loadTexture(gl, bmp);
// Smooth shading
gl.glShadeModel(GL10.GL_SMOOTH);
2.加载纹理贴图
protected static int loadTexture(GL10 gl, Bitmap bmp, boolean reverseRGB) {
int[] textures = new int[1];
glGenTextures(1, textures, 0);
int mTextureID = textures[0];
glBindTexture(GL_TEXTURE_2D, mTextureID);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D,
GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
GL_CLAMP_TO_EDGE);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,
GL_REPLACE);
GLUtils.texImage2D(GL_TEXTURE_2D, 0, bmp, 0);
bmp.recycle();
return mTextureID;
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!texture packer OpenGL
滚动地图精灵 黑边 缝隙 解决方法
texture packer OpenGL &滚动地图精灵 黑边 缝隙 解决方法&
1.TexturePacker里有一个选项:Extrude,会自动添加1PX的边框 进行设置;简单方便。
2.人工计算位置,在更新位置的方法里减去多余的1像素坐标值。
现在让我们来看一下texturepacker软件左边的一些选项。通过这些选项,你能够配置spritesheet的大小、布局和输出格式。首先,让我们来快速浏览一遍控制大小和布局的选项:
Autosize(默认) – 这个选项会为你的spritesheet挑选最小的2的指数倍的大小。这是一个非常方便的特性,因为它可以省去你自己去计算spritesheet大小的时间。
Min/max size&让你为你的spritesheet指定一个最大值。如果你想设置特定大小的spritesheet的时候,这也是一个非常方便的特性。(因为对于特定的设备来说,你可不想超过设备能够支持的最大限制,比如2代touch最大支持texture大小为)
Scale&让你可以保存一个比原始图片尺寸要大一点、或者小一点的spritesheet。比如,如果你想在spritesheet中加载“@2x”的图片(也即为Retina-display设备或者ipad创建的)。但是你同时也想为不支持高清显示的iphone和touch制作spritesheet,这时候只需要设置scale为
1.0,同时勾选autoSD就可以了。也就是说,只需要美工提供高清显示的图片,用这个软件可以自己为你生成高清和普清的图片。
Algorithm&里面目前唯一支持的算法就是MaxRects,即按精灵尺寸大小排列,但是这个算法效果非常好,因此你不用管它。
Border/shape padding&即在spritesheet里面,设置精灵与精灵之间的间隔。如果你在你的游戏当中看到精灵的旁边有一些“杂图”的时候,你就可以增加这个精灵之间的间隔。
Extrude 精灵边界的重复像素个数. 这个与间隔是相对应的–如果你在你的精灵的边边上看到一些透明的小点点,你就可以通过把这个值设设置大一点。
Extrude&This repeats the pixels around the borders of sprites. This is the opposite of adding padding – if you
see transparent “gaps” around the edges of your sprites, you may wish to set this to a higher value.
Trim&通过移除精灵四周的透明区域使之更好地放在spritesheet中去。不要担心,这些透明的区域仅仅是为了使spritesheet里面的精灵紧凑一点。–当你从cocos2d里面去读取这些精灵的时候,这些透明区域仍然在寻里。(因为,有些情况下,你可能需要这些信息来确定精灵的位置)
Shape outlines&把这个选项打开,那么就能看到精灵的边边。这在调试的时候非常有用。
对于spritesheet来说,上面提到的各个选项的默认值,你一个也不需要改变–因为它们本来就已经很好了。然后,在输出部分,你需要改变一些设置。但是在讲到那个之前,让我们先谈一谈cocos2d中的像素格式。
cocos2d和像素格式
在cocos2d里面,理解像素格式非常重要。因为,像素格式会影响在你的游戏中加载一张图片到底需要多少内存。因为游戏通常要加载大量的图片资源,所以你要尽可能充分利用移动设备上面非常少的可用物理内存。
默认情况下面,当你在cocos2d里面加载一张图片的时候,对于每一个像素点使用4个byte来表示–1个byte(8位)代表red,另外3个byte分别代表green、blue和alpha透明通道。这个就简称RGBA8888。
因此,如果你使用默认的像素格式来加载图片的话,你可以通过下面的公式来计算出将要消耗多少内存来加载:
图像宽度(width)×图像高度(height)×每一个像素的位数(bytes per pixel) = 内存大小
此时,如果你有一张512×512的图片,那么当你使用默认的像素格式去加载它的话,那么将耗费
512×512×4=1MB
这里,我们以&为例。它总共只有128兆内存,但是系统就要占掉一大半,还有其它一些程序也要使用一些内存,实际可用的内存更少。对于单独一张spritesheet来说那确实足够了。可是想像一下你有许许多多的spritesheet,而且游戏里面经常需要大量的spritesheet!
这里就需要让像素格式来帮忙了。你可以为图片的每个像素点指定更小的字节来保存图片。(比如每个像素点2个字节,即每个像素点16位),这种方式就能够在图片质量和内存消耗之间取得一个很好的平衡点。
通常,你是在你的游戏看起来还ok的提前下,尽可能少地使用内存。背景图片就非常适用用8位或者16位来存储,而精灵则一般要用16位或者32位。对于更多可选的像素格式和适用的场合,你可以参考Riq(cocos2d的作者)的一篇文章:.(理解像素格式向导)
顺便说一下,如果你注意看窗口的右下角,你会看到Texture Packer会基于你当前选择的像素格式计算出这张spritesheet所消耗的内存大小,因此你不必手动计算了。:]
像素格式和抖动
很多时候,当你使用较小的像素格式来加载图片的时候,你会发现图片的质量也在相应的降低。这时你会看到图像存在许多颜色的梯度变化。这里有一个例子,展示了当你使用像素格式RBGA4444去显示一张图片的时候会是什么样子:
看到没有,图像上面有许许多多的“条条”和颜色梯度变化,特别是熊和绿色的框框那里。
这时,你可能想重新设计你的图片来确保使用更少的梯度,或者使用大一点的像素格式。但是,在这里,TexturePacker实现了另外一个杀手锏功能–图像抖动。
当你使用TexturePacker来保存spritesheet的时候,你可以指定目标像素格式为RGBA4444,然后选择“dithering method”。这个默认选项会修改一些你的图像的颜色,但是当有梯度变化或者其它一些会带来问题的颜色以后,图像看起来就会非常糟糕。
继续,我们为spritesheet选择RBGA;式,然后改变抖动选项为“FloydSteinberg+Alpha”。Texture Packer将会在动态修改你的图片,而且马上显示出效果来。和上面的图片相比,是不是好看多了?
现在让我们保存这个spritesheet。点击Texture file旁边的“…”,在弹出的对话框中选择TextureFun\Resouces目录,然后命名为“sprites-hd.pvr.ccz”。然后,TexturePack会自动为我们在Data file那里生成相应的plist文件路径。并且会命名为“sprites-hd.plist”,这个名字是根据前面你提要的名字来命名的。
“但是,等一下!”,你可能会说,“为什么是pvr.ccz?!”。好吧,我很高兴你会这样问。。。
PVRs和压缩
PVR图像是专门为ios设备上面的PowerVR图形芯片指定的图像容器。它们在ios设备上非常好用,因为可以直接加载到显卡上面,而不需要经过中间的转化。
PVR图像也可以包含许多种不同像素格式的图像数据。之前,cocos2d仅仅支持一些用sdk指定的来创建的,不过后来cocos2d已经了。
而且,最近cocos2d更新到了可以支持压缩了的pvr图像格式。使用这种图片格式的好处有两点:一、可以使你的应用程序更小,因为图片是压缩过了的。二、你的游戏能够启动地更快。
总而言之,对于spritesheet来说,你可能通过指定16位的像素格式来减少内存消耗,同时保存为pvr.ccz格式来使程序加载速度更快。
最后,点击“Publish”按钮,你的spritesheet和属性列表文件就生成好了。Teture Packer会提示你,一些精灵将会创建成红色(因为你使用的是免费版本)。
优化背景图片
现在,让我们也来加载并优化一下我们的背景图片。点击new创建一个新的Texture Packer窗口,然后点击“Add Folder”,并且选择“TextureFun\Art\flower”文件夹。
把图片格式改成RBG565(对于大的图片来说,你可能需要更好的质量),然后改变抖动方法为“FloydSteinberg”(为什么不是FloydSteinberg+Alpha呢?因为像素格式是RBG565,没有了Alpha通道)。然后指定保存texture file的路径为“TextureFun\Resouces\flower-hd.pvr.ccz”。
最后,点击“Publish”,关闭警告信息,这时你的屏幕看起来会是下面这样:
在cocos2d里面使用spritesheet
现在回到我们的项目,右键点击Resources,然后选择“Add\Existing Files…”。选择flower-hd.plist, lower-hd.pvr.ccz, sprites-hd.plist, and sprites-hd.pvr.ccz。同时,确保没有选中“ Copy items into destination group’s folder (if needed)”,然后单击完成。
下一步,打开HelloWorldScene.m,并且用下面的代码替换掉你的init方法里的内容:
-(id) init{
if( (self=[super init] )) {
CGSize winSize = [CCDirector sharedDirector].winSize;&
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGB565];
CCSprite * background = [CCSprite spriteWithFile:@&flower-hd.pvr.ccz&];
background.anchorPoint = ccp(0,0);
[self addChild:background];&
// More coming here soon...
return self;}
你需要做的第一件事情就是加载背景图片。首先,你告诉cocos2d使用RBG565的像素格式(你正在为你的背景图片的每个像素使用8位),然后调用spriteWithFile从磁盘上加载pvr.ccz格式的图片。注意,这里你并不需要把它当作一个spritesheet(比如,加载plist文件),因为这里“spritesheet”就只有一张图片。
注意,其实你在加载pvr.ccz格式的文件的时候并不需要指定像素格式,因为这个文件格式本身就包含了这样一些信息。但是,我们还是显示地在这里指 定了像素格式,因为如果你加载png格式的图片的话,(png格式图片总是保存为每个像素32位,尽管你可能会使用不同的像素格式把它加载到内存里)。
下面,让我们在“more coming here soon”注释的地方添加下面的代码:
[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_RGBA4444];CCSpriteBatchNode *spritesBgNode;spritesBgNode = [CCSpriteBatchNode batchNodeWithFile:@&sprites-hd.pvr.ccz&];[self addChild:spritesBgNode];
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@&sprites-hd.plist&];
这里把像素格式设置为RBGA4444(你为主精灵所使用的每个像素点16位的像素格式),然后为这个spritesheet创建一个batch node。你也需要加载plist文件,把每一个精灵对应的帧(frame)加载到精灵帧缓冲区(sprite frame cache)中。
最后,紧接着上面加入下面的代码:
NSArray *images = [NSArray arrayWithObjects:@&bear_2x2.jpg&, @&bird.jpg&, @&cat.jpg&, @&dog.jpg&, @&turtle.jpg&, @&ooze_2x2.jpg&, nil];
for(int i = 0; i & images.count; ++i) {
NSString *image = [images objectAtIndex:i];
float offsetFraction = ((float)(i+1))/(images.count+1);
CGPoint spriteOffset = ccp(winSize.width*offsetFraction, winSize.height/2);
CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:image];
sprite.position = spriteOffset;
[spritesBgNode addChild:sprite];}&[CCTexture2D setDefaultAlphaPixelFormat:kCCTexture2DPixelFormat_Default];
这个循环遍历spritesheet中的所有的图片,并把他们合理地旋转在屏幕上面。
如果你使用iPad来编译并运行你的代码的话,你会得到下面的运行结果:
这个不就是你想实现的效果吗–记住,这里的红色仅仅因为你使用的是免费版本。
但是真正让人着迷的是那些你看不到的东西。
在背后,你的应用程序加载速度会明显比以前快很多。而且使用更少的内存,更让人心动的是,它看起来还是那么棒!而这些功能使用Texture Packer都可以很容易的完成。
不相信我?
当我写这篇文章的时候,我做了一系列的简单的测试,从最好的情形到最坏的情形,来测试到底我的程序是如何运转的。下面是我得出的一些结论:
做最原始的事情: 使用默认像素格式单个单个精灵地加载,不使用任何spritesheet。大约花费了0.73秒钟加载,消耗大约26兆内存。而且当你添加更多的精灵进去的时候,游戏就开始卡了。
使用默认的像素格式,并且使用spritesheet: 前进了一大步。这样会使游戏性能更好,同时也会减少内存消耗(因为你会把所有的精灵加载到一张大小的spritesheet的,而opengl使用纹理的大小都是2的指数幂,如果你一张精灵的大小是320×200的话,那么opengl会创建512×512的纹理来加载精灵,这样就有很多空白的地方。实际上就是浪费了内存。)
使用不含抖动的Zwoptex并保存为png格式,同时减少像素格式: 这样可以大幅地减少内存消耗,大约只需要15兆左右)。但是却增加了程序的启动时间,上升到大约1秒钟。我认为可能是由于不得不改变颜色缓冲的缘故吧。另外,图像显示的效果并没有在“像素格式和抖动”一节中的截屏效果那么好。
使用通过Texture Packer创建的抖动过的spritesheet并且保存为pvr.ccz格式: 这在启动时间和显示效果上都前进了一大步!(启动时间大约只有0.31秒左右,内存也只需要大约17兆左右,我认为这可能是由于,这个问题在现在的版本中已经解决了。
好了,如果你按照上面所讲的最佳实践来做的话,我想你在大部分情况下都会做得非常好。:)如果你想看看我写的测试程序,也想拿来跑一跑的话,!
Texture Packer 和XCode集成
当使用Texture Packer的时候,你可以像这里介绍的一样使用GUI工具,但是你还可以把它集成到Xcode构建过程中去。这样你每一次编译的时候,它都会自动地(如果没有更改,就不会更新)为了更新spritesheet。
如果你过去用cocos2d写过游戏的话,你肯定明白一遍又一遍地重新生成你的spritesheet是那么的烦人!虽然每次可能都只需要几秒钟的时间,但是老是这样重复地做这样的事,确实很烦。
因此,让我们更方便地构建我们的工程吧–这里只需要花几秒钟时间,但是却可以为你以后节省大量的时间。右键点击“Resources”,选择“Add\New File…“,然后选择 Mac OS X\Other\Shell Script,然后选择下一点。并命名为PackTextures.sh,单击完成。
然后使用下面的代码替换掉PackTextures.sh里面的内容:
#!/bin/sh&TP=&/usr/local/bin/TexturePacker&&if [ &${ACTION}& = &clean& ]then
echo &cleaning...&
rm resources/sprites-hd.pvr.ccz
rm resources/sprites-hd.plist&
rm resources/flower-hd.pvr.ccz
rm resources/flower-hd.plist
# add all files to be removed in clean phase
# ....else
echo &building...&
# create hd assets
${TP} --smart-update \
--format cocos2d \
--data resources/sprites-hd.plist \
--sheet resources/sprites-hd.pvr.ccz \
--dither-fs-alpha \
--opt RGBA4444 \
Art/sprites/*.jpg&
${TP} --smart-update \
--format cocos2d \
--data resources/flower-hd.plist \
--sheet resources/flower-hd.pvr.ccz \
--dither-fs-alpha \
--opt RGB565 \
Art/flower/*.jpg
# add other sheets to create here
# ....fiexit 0
所有Texture Packer GUI界面能够做的事情,命令行工具也能做。如果你在命令行里面输入“TexturePacker”,你将会看到一系列它能够接收的参数说明。
这个脚本仅仅通过运行TexturePacker来从你的Art目录下读取精灵文件并创建spritesheet–就像你之前用GUI工具所做的一样。你可以通过查看TexturePacker命令行工具帮助来获得更多有关每个参数具体的用法。
接下来,你需要让你的工程在编译的时间能够运行这个脚本。右键点击Targets,选择“Add\New Target…”,然后选择“External Target”(不是Shell Script Target),然后点击下一步,重命名这个Target为TexturePacker,最后点击Finish。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!}

我要回帖

更多关于 opengl纹理贴图png 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信