Quick-Cocos2d-x 3.2将对象(包括子对象)变灰的方法
先上效果图: 灰化效果 参考:Cocos2d-x让精灵图像变灰的方法 但这个方法在Quick-Cocos2d-x3.2(下面简称QC)下不能完美实现变灰效果-变灰了的对象的位置会跳到屏幕右上角。
百思不得其解,搜一下有没有人发现这个问题,果然有: 关于Sprite的setShaderProgram后坐标改变的问题,发现4楼的仁兄的回复有亮点:如何在Cocos2d-x 3.0中使用opengl shader? 点进去一看,内容是这样的: “坐标变化的解决了,将附件gray.vsh 中的CC_MVPMatrix 改为 CC_PMatrix 即可 ” 我估计应该是位置转换的矩阵问题吧,gray.vsh是什么下面会说到。 经过分析,发现原因在addGray方法(Cocos2d-x 让精灵图像变灰的方法)的27行:
ccPositionTextureColor_vert是什么呢?它存放在cocos/renderer下,名为ccShader_PositionTextureColor.vert。它的作用是……以在下的理解,是一个shader方法(ccShader),关于位置、材质与颜色的(PositionTextureColor)且是针对顶点的(.vert)。
它的内容是:
咦,发现有一个熟悉的面孔-“CC_MVPMatrix”。其实上面说到的gray.vsh的内容就是ccShader_PositionTextureColor.vert大括号括住的部分。那我将ccShader_PositionTextureColor.vert的CC_MVPMatrix改为CC_PMatrix是否就能解决灰化后对象的位置问题呢?答案是否定的,这样改会影响其他对象(例如文本)的定位。
那我再定义一个GLchar传到pProgram->initWithVertexShaderByteArray的第一个参数不就得咯?
经实践证实是可行的。其实有个更简单的方法,就是:
原来cocos/renderer下有个文件叫ccShader_PositionTextureColor_noMVP.vert,我是怎么发现的,各位脑补一下。
最后附上实现灰化功能的全部代码。 C++部分,将此方法导出给Lua用: CUtil.cpp
Lua部分:DisplayUtil.lua
怎么使用不用我多说了吧。
来源网址:http://evamango-blog.logdown.com/posts/243059-quick-cocos-32-methods-to-make-object-gray (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |