cocos2d-lua 自定义shader使用etc1遇到的那些坑

项目需求,安卓机型图片资源要使用etc1格式的pkm,和@alpha压缩文件,由于项目内使用了自定义的shader,etc1格式图片使用自定义shader,透明度会全部变成1,效果就是透明区域全部变成黑色,所以需要对自定义的shader修改,支持etc1,先在网上找了一些资料,基本上对片元着色器的处理都是这样的

#ifdef GL_ES
    precision mediump float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

void main() {
    vec4 texColor = vec4(texture2D(CC_Texture0, v_texCoord).rgb, 1.0);

    texColor.rgb *= texColor.a; // Premultiply with Alpha channel
    
    gl_FragColor = v_fragmentColor * texColor;
}

和cocos2d对etc1默认的片元着色器一样,使用以后,实际效果仍然不对,透明区域不是黑框了,但是非透明区域透明度明显不对,接着去查源码,去打日志最后发现cocos2dx其实对etc1使用的默认shader是ccETC1ASPositionTextureColorColorMatrix_frag,打开这个片元着色器,代码是这样的

#ifdef GL_ES
precision mediump float;
#endif

varying vec4 v_fragmentColor;
varying vec2 v_texCoord;

void main() {
    vec4 color = v_fragmentColor * vec4(texture2D(CC_Texture0, v_texCoord).rgb, texture2D(CC_Texture1, v_texCoord).r);
    color.rgb = color.rgb / max(0.001, color.a);
    color = clamp(CC_ColorMultiplier*color + CC_ColorOffset, 0.0, 1.0);
    gl_FragColor = vec4(color.rgb*color.a, color.a);
}

ok,拷贝之,运行,进去一看,实际效果还是不对,透明度依旧有问题,接着看cocos2d 是对CC_ColorMultiplier和CC_ColorOffset赋值了,自定义shader是不是没赋值?发现默认shader 是在updateUniforms确定变量状态,在   setUniformsForBuiltins里通过状态进行赋值,看了下lua这里的写的代码

local prog = cc.GLProgram:createWithFilenames("shader/"..shaderType.vsh ..".vsh","shader/"..shaderType.fsh ..".fsh")
prog:link()
prog:updateUniforms()

lua这里调用了updateUniforms,那直接加上setUniformsForBuiltins()看一下,运行一看,还是不对透明度依旧有问题(已经快疯~)

接着去cocos源码里去找,发现cc.GLProgram在创建的时候已经运行过link和updateUniforms(),c++层运行过,lua为什么还要运行一遍,删了试试?删掉运行之,结果显示正确(真不容易)!至于为什么显示正确,不用再去传值,为什么lua加上link() 和updateUniforms()(网上lua使用自定义shader都有这两句,这真是个天坑,我到底是怎么想到删掉的!)运行效果就不对,懒得去翻源码里,etc1的压缩方案应该有两种,网上大部分的解决方案应该是第一种压缩方案,项目里是生成两张图片,一张rpg另一张带alpha,格式是pkm和pkm@alpha。

如果你看到这篇文章,并帮你解决了问题,麻烦点个赞,谢谢!

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值