[✔️]cocos2x label ttf合批

简介: [✔️]cocos2x label ttf合批

sprite fragment shader


  • ccShader_PositionTextureColor_noMVP.frag


void main()
{
    gl_FragColor = v_fragmentColor * texture2D(CC_Texture0, v_texCoord);
}


lable outline shader


  • ccShader_Label_outline.frag


void main()
{
    vec4 sample = texture2D(CC_Texture0, v_texCoord);
    // fontAlpha == 1 means the area of solid text (without edge)
    // fontAlpha == 0 means the area outside text, including outline area
    // fontAlpha == (0, 1) means the edge of text
    float fontAlpha = sample.a;
    // outlineAlpha == 1 means the area of 'solid text' and 'solid outline'
    // outlineAlpha == 0 means the transparent area outside text and outline
    // outlineAlpha == (0, 1) means the edge of outline
    float outlineAlpha = sample.r;
    if (u_effectType == 0) // draw text
    {
        gl_FragColor = v_fragmentColor * vec4(u_textColor.rgb, u_textColor.a * fontAlpha);
    }
    else if (u_effectType == 1) // draw outline
    {
        // multipy (1.0 - fontAlpha) to make the inner edge of outline smoother and make the text itself transparent.
        gl_FragColor = v_fragmentColor * vec4(u_effectColor.rgb, u_effectColor.a * outlineAlpha * (1.0 - fontAlpha));
    }
    else // draw shadow
    {
        gl_FragColor = v_fragmentColor * vec4(u_effectColor.rgb, u_effectColor.a * outlineAlpha);
    }
}


字符纹理基准


base font atlas = 字号+描边宽度


大家都要放到同一张RT里面


不使用shader着色(creator也采用的这种方案)


image.png


优点:


  • 能够和sprite无缝合批,完美实现图文合批


缺点:


  • font atls = 字号+描边宽度+描边颜色+字体颜色,产生大量冗余字符纹理


  • 需要使用CPU生成不同样式的字符纹理,并且需要保证新的算法和之前的文字描边效果一致


使用shader着色


image.png


优点:


  • 可以复用之前的文字效果shader,保证效果不会发生大的变化


  • 相对于CPU生成带效果的字符纹理,性能更好


  • 没有冗余的字符纹理


缺点:


  • 如果和图片合批(ttf label / ttf label / bmfont / sprite),受sprite shader的限制,需要改造sprite shader,因为大家的ashader必须一致才有机会合批,多重纹理也有改造sprite shader


这种方案改动大,但是彻底能解决图文合批问题,并且兼顾性能,能够和原有的文字效果保持一致


  • 如果仅仅lable合批(ttf label / ttf label/ bmfont / sprite),因为只有triangles command才能合批,可以开发一个继承triangle commandrender command, 这样仅仅是ttf label能够合批,无法和bmfont合批,因为使用的shader不一样


这种方案改动较小,同时能够保证和原有的文字效果一致,但是无法彻底解决图文合批,仅仅是ttf合批


bmfont使用的QuadCommand也是这个思路实现和sprite合批


if (_currentLabelType == LabelType::BMFONT || _currentLabelType == LabelType::CHARMAP){
    setGLProgramState(GLProgramState::getOrCreateWithGLProgramName(
            _shadowEnabled ? 
            GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR : 
            GLProgram::SHADER_NAME_POSITION_TEXTURE_COLOR_NO_MVP // sprite use this
    , _getTexture(this)));
}
目录
相关文章
|
JavaScript 前端开发
CocosCreator 面试题(二)JavaScript中的prototype的理解
CocosCreator 面试题(二)JavaScript中的prototype的理解
543 0
|
JavaScript 安全 编译器
CocosCreator 面试题(六)什么是泛型,有什么作用?
CocosCreator 面试题(六)什么是泛型,有什么作用?
455 0
|
编译器 Linux C语言
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
【CMake install目录解析】CMake 深度解析:实现精准、高效的项目构建与安装
1776 0
|
安全 网络安全 数据安全/隐私保护
CocosCreator 面试题(十四)Cocos Creator WebSocket 、Socket.IO分别是什么?
CocosCreator 面试题(十四)Cocos Creator WebSocket 、Socket.IO分别是什么?
1125 0
|
图形学 开发者
【实战优化】U3D物理引擎碰撞检测精调秘籍:告别穿透与粘滞,重塑真实游戏体验
【7月更文第12天】在Unity3D游戏开发中,精准的碰撞检测是营造沉浸式游戏体验的关键。然而,开发者常面临游戏角色或物体间的碰撞反应不自然,如穿透、粘滞现象,这些问题不仅破坏了游戏的真实感,还严重影响了玩家的体验。本文将深入探讨U3D物理引擎中碰撞检测不准确的根源,并提出一系列行之有效的调优策略,辅以代码实例,帮助开发者打造流畅自然的物理互动。
1309 1
|
搜索推荐 开发工具 Android开发
安卓即时应用(Instant Apps)开发指南
【4月更文挑战第14天】Android Instant Apps让用户体验部分应用功能而无需完整下载。开发者需将应用拆分成模块,基于已上线的基础应用构建。使用Android Studio的Instant Apps Feature Library定义模块特性,优化代码与资源以减小模块大小,同步管理即时应用和基础应用的版本。经过测试,可发布至Google Play Console,提升用户便利性,创造新获客机会。
773 1
|
安全 算法 编译器
【C++ 基础 ()和{}括号】深入探索 C++ 的变量初始化:括号和大括号的奥秘
【C++ 基础 ()和{}括号】深入探索 C++ 的变量初始化:括号和大括号的奥秘
1180 0
CocosCreator 面试题(二十) Cocos creator 如何实现一个置灰Shader?
CocosCreator 面试题(二十) Cocos creator 如何实现一个置灰Shader?
680 0
|
计算机视觉
CocosCreator 面试题(十九) Cocos Creator 材质 shader 分别是什么?
CocosCreator 面试题(十九) Cocos Creator 材质 shader 分别是什么?
743 0
|
数据管理
CocosCreator 面试题(十三)说说Cocos Creator常驻节点
CocosCreator 面试题(十三)说说Cocos Creator常驻节点
854 0

热门文章

最新文章