1. 程式人生 > >cocos2d-x 精靈新增描邊效果

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 精靈新增效果

學習cocos2d-x 以來一直對裡面的shader部分感興趣,今天正好花了點時間來研究一下精靈的描邊效果。 主要參考了子龍山人大神的TestCpp裡面例子並結合自己的理解,實現相對比較簡單。主要是根據引擎內部自帶的shader相關程式碼來實現的。 好了廢話不多說看程式碼:

Cocos2d-x】圖片的一種比較好的shader實現方法

轉載: http://blog.csdn.net/u011281572/article/details/44999609 圖片描邊需求如下: 1. 可指定描邊寬度2. 可指定描邊顏色3. 可用於字型 圖片描邊我所知道的方式有以下幾種: 1. Cocos2d-x 3.x中,

cocos2d-x 2.x版本文字研究01_使用shader

由於Cocos2d-x 2.x版本對描邊支援的不好,3.X的基於Freetype的字型檔的描邊效果還是不錯的,但專案用的是舊版本引擎,又需要用到描邊字,最近也研究了幾種描邊的方法,想分享一下。 在網上找了很多種描邊的方式,各有優劣,有的描邊效果很不錯,而有的效果稍差但繪製效

cocos2d實現CCLabelTTF真正字型效果

在開發遊戲中,我們需要在需要在遊戲中顯示一個字型輪廓比較清晰的效果,我們就需要給字型的周圍進行描邊,讓字型顯示比較更加突出,我重寫了cclabelttf類,使它具有描邊的特效,和描邊的大小以及顏色。。。 開發人員:Jason's.Alex   QQ:531401335 cs

Unity3D 2D Sprite效果Shader,可手動調整效果適配

light position step oat fde text 等等 blog tin   最近兩個月學了很多Shader的知識,現在也算入點門了。現在網上有很多2D描邊的Shader,說實話大多數很差勁。有些多余的條件判斷影響效率,提供的參數也不夠適配所有圖片。因為美術

Cocos2d-x可以實現的動畫效果

動畫效果 ace 所在 nsh ans self 翻頁 led face 動作(Actions)move移動:moveto/moveby 從一個位置移動到另外一個位

Android TextView 字型效果程式碼

 類繼承TextView,重寫ondraw函式。無需額外的textview做背景。以下為修改的diff檔案。 Index: ***Activity.java ============================================================

[OpenGL] 簡單的物體效果

開發環境:Qt, OpenGL         主要是為了練習glsl寫的一個小例子,本身沒有什麼難度。         思路一:進行兩次繪製。在頂點著色器中,第一次只繪製背面,將頂點沿著法線方向進行移動,可以使物體"膨脹"起來,使用描邊的純色填充,第一次渲出

iOS UILabel文字新增實現

可以達到文字描一圈黑邊的效果: 繼承UILabel以後過載drawTextInRect: - (void)drawTextInRect:(CGRect)rect { CGSize shad

unity shader 透明的效果 鏤空 空心

效果: 程式碼: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,

Unity Shader-Command Buffer的使用(景深與效果重置版)

簡介 Command Buffer是Unity5新增的一個灰常灰常強大的功能。先祭出官方介紹和文件。我們在渲染的時候,給OpenGL或者DX的就是一系列的指令,比如glDrawElement,glClear等等,這些東西目前是引擎去呼叫的,而Unity也為我們封裝了更高一

android textView 效果

        最近在android上搞一個帶描邊效果的TextView,網上搜索了下都是採用兩個TextView在一個layout中進行實現,但細想了下,如果我在一個TextView中讓其以不同的方式進行兩次描繪不就能夠達到效果了嗎?由於網上沒有看到和我類似的方法,故發出

Shader之旅4:outline edge 效果

書寫本文的初衷是為了自我反省記錄。如有表達不當,請批評指正 在shadertoy上看到了物體的描邊效果,感覺效果不錯,拿來學習一下,先貼出程式碼,然後分析 float d; float lookup(vec2 p, float dx, float dy) { vec2 uv = (

NGUI之UILabel效果

專案中遇到了一些問題發現NGUI不一定能全部解決所有的問題,那麼我就提供一些我們的解決方案。 正常的NGUI中的UILabel的描邊實現方法是自己又生成了4個相同的字型分別放在原本字型的左上右上左下右下四個方向上來實現描邊效果,這點我們可以通過調節Effect中的Outline的XY來看到他的實現方式。那麼

Cocos2d-x能夠實現的動畫效果

動作(Actions)move移動:moveto/moveby 從一個位置移動到另外一個位置 從一個位置移動多少數量級rotate旋轉:rotateto/rotateby 從一個角度旋轉到另外一個角度 旋轉多少個數量級scale縮放:scaleto/scaleby 放大縮小

cocos2d-x裡的場景過渡效果

2014.9.1號了。明天又要去面試了。偶然看到齊天大聖四個字,不得不想起小時候的乳名。。好了。正題。 其實網上也有別人整理的場景過渡,但我覺得有的時候光看文字效果記得不強烈。於是開啟TEST-CPP一個一個的記下來。才發覺別人那些是有些坑的。 以下是我獨自整理的: coc

Cocos2d-x 精靈碰撞檢測(方法一)

宣告函式碰撞檢測函式,兩個精靈和重寫update bool isCollision( CCPoint p1,CCPoint p2,int w1,int h1,int w2,int h2 ); CCSprite *sp2; CCSprite *sp1; virtua

用AttributedString,來製作簡單地效果

AttributedString 的定義不多說網上很多資料,關鍵是我說了,也沒有人家說的好哈哈。 AttributedString 依然分為兩種 可變與不可變 NSAttributedString

cocos2dx-3.x:骨骼動畫(spine)

在網上查了很久,一直都沒有找到骨骼動畫描邊的方法,cocos自身帶的shader中有個給Sprite描邊的方法,看了很久,都沒有用上,內心甚是糾結,最後查了好久原始碼,發現spine中有個方法“setShaderProgram”,我開開心心的帶入,發現,是每一塊骨骼都給我描

用css來實現文字效果

效果如圖: #text { float:left; color:#C60A12; filter:Dropshadow(offx=1,offy=0,color=#ffffff) Dropshadow(offx=0,offy=1,color=#ffffff) Dropshadow