Genius-x / genius-x

An Entity Component System framework based on Cocos2d-x
http://genius-x.org
165 stars 69 forks source link

Node use .pvr or .etc format automatic #11

Closed ElvisQin closed 10 years ago

ElvisQin commented 10 years ago

1, 当发布iOS程序时,可能会将所有图片转换为.pvr的压缩纹理格式,这需要程序当中硬编码的"xxx.png"改为"xxx.pve" 2, 当发布Android程序时,除了需要该资源后缀(ETC),还需要修改Shader以及添加多重纹理(ETC不支持alpha通道,需要另外的纹理保存alpha通道)

所以,怎样不要修改程序,自动根据纹理格式进行修改?

dafong commented 10 years ago

又来抛砖引玉~~~ 对于问题1: 代码里用不带扩展名的路径 运行时根据标志位查找 或者干脆先拼出来pvr的看看存不存在 然后再拼png的

对于问题2: 可以无脑的把shader全都弄上两个纹理采样器, 然后有透明通道的图就绑一下第二个采样器的纹理id, 如果没有 第二个就还会用第一个纹理采样器的纹理id,然后shader里直接就把 第二个的采样结果的alpha通道 赋给第一个采样结果的alpha通道,这样的结果就是每个片源会多进行一次采样。如果采样的代价不高的话 我觉得是可行的。

ElvisQin commented 10 years ago

@dafong 这个思路不错,反正Cocos2d-x的Shader应该不会怎么改动,我开始还想把它的shader都实现一个的,但是如果它程序中有一些特殊设置就很麻烦。

这样来程序当中只需要绑定ETC的alpha纹理就行啦

ElvisQin commented 10 years ago

1,在addResource("xxx.etc")的时候,同时加载xxx.etc和xxx_alpha.etc 在removeResource的时候同时移除alpha纹理,如果它是ETC压缩纹理的话 总之就是alpha纹理被自动管理 2,给Texture添加一个字段用来保存xxx_alpha.etc的纹理Id或者TextureCache中的key值 3,在BatchCommand和QuadCommand中如果发现纹理对应的alpha字段不为空,则表示其为ETC纹理,则绑定多重纹理 4,修改Cocos2d-x内置shader,如果包含多重纹理,则对alpha进行混合计算

softwarecheng commented 10 years ago

Android例子工程在ECLIPSE下好像不能编译

Qincl commented 10 years ago

@ldr123 看看是不是改动导致不能编译?