cocos2d-x 精灵添加描边效果

学习cocos2d-x 以来一直对里面的shader部分感兴趣,今天正好花了点时间来研究一下精灵的描边效果。

主要参考了子龙山人大神的TestCpp里面例子并结合自己的理解,实现相对比较简单。主要是根据引擎内部自带的shader相关代码来实现的。

好了废话不多说看代码:

1。首先需要打开CCShaderCache.cpp文件修改里面部分代码,添加我们描边的效果。

此枚举值里面加入:kShaderType_LabelOutline

2。然后在 voidShaderCache::loadDefaultShaders() 函数里面加入:

p =newGLProgram();

loadDefaultShader(p,kShaderType_SpriteTextureOutline);

_programs.insert(std::make_pair(GLProgram::SHADER_NAME_SPRITE_TEXTURE_OUTLINE,
p ) );

3。至于GLProgram::SHADER_NAME_SPRITE_TEXTURE_OUTLINE值的由来,

需要在CCGLProgram.h和CCGLProgram.cpp文件里面分别加入

static const char* SHADER_NAME_SPRITE_TEXTURE_OUTLINE;和

constchar*GLProgram::SHADER_NAME_SPRITE_TEXTURE_OUTLINE ="ShaderSpriteTextureOutline";
代码

4。接着继续修改voidShaderCache::loadDefaultShader(GLProgram *p,int
type) 里面的代码加入:

case: kShaderType_SpriteTextureOutline:

p->initWithByteArrays(ccPositionTextureColor_noMVP_vert,ccSpriteTextureOutline_frag);

p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_POSITION,GLProgram::VERTEX_ATTRIB_POSITION);

p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_COLOR,GLProgram::VERTEX_ATTRIB_COLOR);

p->bindAttribLocation(GLProgram::ATTRIBUTE_NAME_TEX_COORD,GLProgram::VERTEX_ATTRIB_TEX_COORDS);

break;

5。修改完CCShaderCache.cpp文件里面的代码,还要修改ccShaders.h和ccShaders.cpp里面代码,分别加入:

extern CC_DLLconstGLchar * ccSpriteTextureOutline_frag; 和

const
GLchar * ccSpriteTextureOutline_frag = #include "ccShader_SpriteTexture_outline_frag.h"

6。最后在cocos2d-x-3.0 的 cocos/2d 目录下加入ccShader_SpriteTexture_outline_frag.h文件

(注意把此文件和系统自己提供的相关shader片段着色器文件放在一起)。

最关键的一步来了,就是片段着色器的代码:(这部分参考了子龙山人的shader代码)

我做了部分修改,代码如下:

" \n\

#ifdef GL_ES                                \n\

precision lowp float;                       \n\

#endif                                      \n\

\n\

varying vec4 v_fragmentColor;               \n\

varying vec2 v_texCoord;                    \n\

uniform sampler2D CC_Texture0;              \n\

\n\

void main()                                 \n\

{                                           \n\

float radius = 0.002;                   \n\ //这个是描边线的大小(注释需要删除)

float threshold = 1.75;                 \n\

vec4 accum = vec4(0.0);                 \n\

vec4 normal = vec4(0.0);                \n\

\n\

normal = texture2D(CC_Texture0, vec2(v_texCoord.x, v_texCoord.y));                      \n\

\n\

accum += texture2D(CC_Texture0, vec2(v_texCoord.x - radius, v_texCoord.y - radius));    \n\

accum += texture2D(CC_Texture0, vec2(v_texCoord.x + radius, v_texCoord.y - radius));    \n\

accum += texture2D(CC_Texture0, vec2(v_texCoord.x + radius, v_texCoord.y + radius));    \n\

accum += texture2D(CC_Texture0, vec2(v_texCoord.x - radius, v_texCoord.y + radius));    \n\

\n\

accum *= threshold;             \n\

\n\

accum.r = 1.0;                  \n\//这里的r,g,b为描边的颜色(注释需要删除)

accum.g = 0.2;                  \n\

accum.b = 0.3;                  \n\

\n\

normal = (accum * (1.0 - normal.a)) + (normal * normal.a);  \n\

\n\

gl_FragColor = v_fragmentColor * normal;                                                \n\

}                                                                                           \n\

\n\

";

注意格式参照引擎自带相关着色器代码。

好了说到这,基本也就说完了,自己赶快去试试看吧。我用的引擎版本是3.0,至于其他版本实现都是一样的。

测试图片

cocos2d-x 精灵添加描边效果,布布扣,bubuko.com

时间: 2024-08-05 02:25:43

cocos2d-x 精灵添加描边效果的相关文章

PPT小技巧:PPT中怎么给文字添加描边效果

很多时候在色彩丰富的PPT中由于背景颜色的关系,文字往往并不能清晰呈现,这个时候我们需要给PPT中的文字添加描边效果,这样突出需要显示的文字了.想必大家一般给文字添加描边效果都是在PS中进行操作的吧,今天给大家安利一个PPT小技巧,在PPT中给文字添加描边效果.第一步:打开PPT文件新建一个空白页面.第二步:插入文本框,并在上方输入"1,2,3".第三步:点击绘图工具.第四步:找到导航栏上的"文本轮廓"并点击.第五步:调整文字的描边颜色.第六步:调整文字的描边粗细.

【Cocos2D-X 学习笔记】为精灵添加单点触控

由于Cocos2d-x处于新学的阶段,因此最近也无法进行系统地更新,只会选择一些典型的Demo贴上来,一来是与大家分享,而来也可以作为以后回顾时的参考. 今天介绍一下Cocos2d-x的触摸事件处理,了解Android开发的朋友们知道,Android里会用一个OnClickListener()进行事件监听,而在J2SE中也会有Event类实现专门的监听处理.在Cocos2d-x中,因为是游戏引擎,用户在玩游戏时总是要通过屏幕与游戏进行交互,可想而知触摸事件是主要处理的事件.这里主要讲一下如何为精

U3D 2D中给精灵添加刚体后 发现精灵会倒 ..

U3D 2D中给精灵添加刚体后 发现精灵会倒 .. 这是因为 没有禁用z轴上面的刚体力造成..只有把刚体上面的 z轴刚体力 冻结掉就可以了 方法一: 红框中Z 复选框勾起来就可以了 方法二 : void Awake() { GetComponent<Rigidbody2D>().freezeRotation = true; }

布局添加动画效果

1. 布局添加动画效果 ① 视图 五个按钮 <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent&q

街机扫描线之为图片添加扫描效果

为图片添加一些额外效果,会使图片更耐看一些,下面来看看如何为一张普通图片添加扫描效果. 首先是下载软件,可到软件主页下载:街机扫描线_v10(正式版) 看一下制作先后的对比图: 原图效果: 制作后加入了扫描效果的效果图: 用街机扫描线制作这种效果图只需简单的几步操作即可完成,貌似用PS做这种效果图也可以做出来,但是会很复杂.下面说一下制作方法. 1.用任意看图软件或浏览器打开一张需要制作扫描效果的图片,也可直接在网页上制作. 2.下载 街机扫描线 之后解压到任意目录,运行 街机扫描线_v10(正

精灵的移动效果,旋转效果

移动: -(void) touchBegan:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchLoc = [touch locationInNode:self]; // Log touch location CCLOG(@"Moved sprite to @ %@",NSStringFromCGPoint(touchLoc)); // Move our sprite to touch location CCActio

WinForm实现类似QQ停靠,显示隐藏过程添加特效效果

原文:WinForm实现类似QQ停靠,显示隐藏过程添加特效效果 这可能是个老题长谈的问题了,只是在项目中会用到这个效果,所以今天做个记录.大家见了别喷我.在项目中的需求是这样的. 打开程序,在屏幕的右下角会显示一个窗体,一般情况下该窗体会隐藏停靠在右边,只露出很小部分,当鼠标移动到这个很小部分时,窗体全部显示,显示过程是从右边滑动到左边,当鼠标离开窗体时,窗体需要隐藏在右边,只露出很小部分,隐藏过程是从左边滑动到右边. 实现此类效果我碰到的连个难点是:1.如何判断鼠标离开了窗体?2.窗体显示隐藏

给日志添加&ldquo;复制&rdquo;效果

给日志添加如上效果的实现方法: 在日志编辑页面,源代码中,添加如下代码,包裹住 目标内容style1: <div class="cnblogs_code"><div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"></span></div>                     要复制的内容here-</d

为UIView视图切换添加动画效果

我们定义了一个动画类来实现视图切换的动画效果,这个类只包含一个类方法,可直接调用,具体代码如下: 头文件: + ? 1 2 3 4 5 6 7 8 9 10 11 12 13 #import <Foundation/Foundation.h> @interface ViewAnimation : NSObject /*============================页面切换的方法==============================     View1 表示当前页面     Vi