CocosStudio的节点如何使用自定义shader
问题:
我想对CocosStudio 的 某个UI 里的 某个图片(如下图所示的Image类型)使用自定义shader。
但是,我把 对传统的cc.Sprite应用自定义shader的方式 应用于它时,并不生效!因此我展开探索。
结论:
其实CocosStudio里面的Image类型就是cocos的ImageView类,ImageView的draw方法还是来自于祖先类Node的draw方法,因此对ImageView处理肯定无法正常应用自定义shader。[具体不再赘述,读者可自行看Node.cpp和Sprite.cpp的源码,它俩的draw方法不同]
看ImageView类, getVirtualRenderer()可以获得 Scale9Sprite类型的 _imageRenderer
再看 Scale9Sprite类,getSprite()可以获得 Sprite类型的 _scale9Image (这不就是要找的传统的cc.Sprite嘛!)
所以我们只需要对 ImageView类型的 image_node实例,应用自定义shader到 image_node:getVirtualRenderer():getSprite() 即可!
环境:
Cocos2d-x Lua架构
代码:
shader_util.lua
---@param shader_node 你要应用shader的节点
---@param vs_path 顶点着色器文件路径
---@param vs_fs_path 片元着色器文件路径
function shader_util.use_shader(shader_node, vs_path, fs_path)local vs_source = cc.FileUtils:getInstance():getStringFromFile(vs_path)local fs_source = cc.FileUtils:getInstance():getStringFromFile(fs_path)local program = cc.GLProgram:createWithByteArrays(vs_source, fs_source)local gl_program_state = cc.GLProgramState:getOrCreateWithGLProgram(program)shader_node:setGLProgramState(gl_program_state)
end
test.lua
--下文的image_node就是 CocosStudio解析出来的Image类型的UI节点
shader_util.use_shader(image_node:getVirtualRenderer():getSprite(), "test/aaa.vsh", "test/aaa.fsh")