1. 程式人生 > >【複習筆記】 cocos2d-x 2.x 渲染特效實現 八 流光效果

【複習筆記】 cocos2d-x 2.x 渲染特效實現 八 流光效果

簡單來說,流光效果就是在貼圖上利用glowmap在原貼圖上的移動做動態的發亮效果,來讓貼圖看起來有光亮在移動。為了讓貼圖上的亮斑的排布看起來更加貼近自然,我們利用柏林噪聲來生成glowmap。事實上,二維或者三維的柏林噪聲在圖形學上有很多的應用,它可以用來描述很多自然的數學規律,使程式模擬出來的效果看起來更加像是自然生成的。比如牆上的斑點,起伏的海面的高度,熔岩中火焰的亮暗等等。柏林噪聲需要振幅和頻率兩個引數,利用噪聲函式生成需要的資料。這裡不展開論述,網上有很多相關資料。

為了可以直接利用資料,提高程式效率,我們不使用噪聲函式來計算,而是利用預先生成好的一組噪聲資料:

unsigned char perm[256] = {151,160,137,91,90,15,
	131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
	190,6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
	88,237,149,56,87,174,20,125,136,171,168,68,175,74,165,71,134,139,48,27,166,
	77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
	102,143,54,65,25,63,161,1,216,80,73,209,76,132,187,208,89,18,169,200,196,
	135,130,116,188,159,86,164,100,109,198,173,186,3,64,52,217,226,250,124,123,
	5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
	223,183,170,213,119,248,152,2,44,154,163,70,221,153,101,155,167,43,172,9,
	129,22,39,253,19,98,108,110,79,113,224,232,178,185,112,104,218,246,97,228,
	251,34,242,193,238,210,144,12,191,179,162,241,81,51,145,235,249,14,239,107,
	49,192,214,31,181,199,106,157,184,84,204,176,115,121,50,45,127,4,150,254,
	138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180};

這個陣列就是一個二維的柏林噪聲資料,可以直接拿這個資料來生成一張glowmap的灰度圖~可以先渲染出這個噪聲灰度圖:

CCTexture2D *noise = new CCTexture2D();
	noise->initWithData(perm, kCCTexture2DPixelFormat_A8, 16, 16, CCSizeMake(16, 16));
	test->setTexture(noise);
	rect.setRect(0, 0, noise->getContentSize().width, noise->getContentSize().height);
    test->setTextureRect(rect);

圖中的深色部分就是原貼圖中發亮的區域了~同理,如果是用來模擬海面的話,深色的地方凸起,淺色的地方凹陷,就可以模擬出高低不平的海面了,其他用途亦同理~按照我們之前使圖片發亮的混合方式,把灰度圖和原圖相加,額外處理原圖透明畫素依然透明,這時原圖就按照灰度圖上的斑點分佈發亮了~

我們既然做的是動態的流光效果,那麼靜止的發亮顯然是不夠的~為了能讓這些亮斑動起來,我們使用UV動畫。shader中在讀取texture資料的時候,使用的是texture的UV座標,即圖片左上角為(0, 0),右下角為(1, 1)。所以只需要在讀取texture資料的時候,把對應的座標做變化即可~為了控制貼圖按時間移動,用cocos新增的一個uniform變數CC_Time進行控制,簡單修改fragment shader程式碼即可實現:

uniform sampler2D CC_Texture0;
uniform sampler2D u_Texture1;
uniform vec2 u_BlurDis;

varying vec4 v_Color;
varying vec2 v_TexCoord;

void main()
{
    vec4 originColor = texture2D(CC_Texture0, v_TexCoord);
	float per = fract(CC_Time.y * 0.3);
	float x = v_TexCoord.x + per;
	if (x > 1 ) { x = x - 1; }
	float y = v_TexCoord.y + per;
	if (y > 1 ) { y = y - 1; }
	vec4 glowColor = texture2D(u_Texture1, vec2(x, y));
	
	originColor.r = (originColor.r + glowColor.a) * originColor.a;
	originColor.g = (originColor.g + glowColor.a) * originColor.a;
	originColor.b = (originColor.b + glowColor.a) * originColor.a;
	gl_FragColor = originColor;
}

為了可以在shader中讀取噪聲貼圖,在C++程式碼中傳入該貼圖資料:

。。。
_uniforms[kUniformSampler1] = glGetUniformLocation(program->getProgram(), UniformSampler1);
。。。
glUniform1i(_uniforms[kUniformSampler1], 1);
。。。
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, _texture1->getName());
程式碼中,fract函式是shader內建的函式,用於取小數點後面的部分。因為UV座標區間為0~1,所以恰好利用時間的小數點後來做UV移動的動畫效果~因為UV座標的從水平和豎直方向上都有等量的增加,所以流光的移動也以45度方向進行。最終效如下:


相關推薦

複習筆記 cocos2d-x 2.x 渲染特效實現 效果

簡單來說,流光效果就是在貼圖上利用glowmap在原貼圖上的移動做動態的發亮效果,來讓貼圖看起來有光亮在移動。為了讓貼圖上的亮斑的排布看起來更加貼近自然,我們利用柏林噪聲來生成glowmap。事實上,二維或者三維的柏林噪聲在圖形學上有很多的應用,它可以用來描述很多自然的數學

複習筆記 cocos2d-x 2.x 渲染特效實現 七 輝效果

輝光效果經常用來做一些物體的自發光,這種發光效果不需要光照計算,只是在貼圖上進行發光的模擬效果,所以有著很好的效率。輝光效果意味著貼圖會變亮。為了對發光的部分做計算,需要一張glowmap貼圖,當我們使用src和dst都為GL_ONE的方式,混合glowmap和原圖時,原圖

複習筆記 cocos2d-x 2.x 渲染特效實現 四 高斯模糊效果

在上文末,我們已經完成了高斯模糊橫向上的模糊效果,而且提到,縱向模糊要在橫向模糊的結果上進行,所以為了得到橫向模糊的貼圖,我們使用離屏渲染。顧名思義,現在渲染的目的地不是螢幕了~一般狀況下,gl是直接把渲染好的紋理繪製到螢幕緩衝區的,進而直接顯示在螢幕上。但是現在,我們要把

複習筆記 cocos2d-x 2.x 渲染特效實現 五 節點樹的模糊效果

到目前為止,我們實現的模糊都是在單張貼圖上的,只是針對當前這一張貼圖對其模糊,因而當圖片中的內容就在圖片邊緣的時候,其模糊在圖片邊緣是被“截斷”的,因此,我們需要一個比原貼圖大,但又包含原本顏色資訊的圖來做模糊。另外,有時候我們需要的模糊並不只是在一張貼圖上,可能當某個單位

讀書筆記設計心理學2-如何管理復雜

然而 困難 虛擬 前行 方式 間接 行為 這就是 找到 最近在看一些書籍,感覺不寫一些筆記,效果不是特別明顯。出於這個目的,於是有了下面的讀書筆記文章。 從《設計心理學2-如何管理復雜》開始寫吧。在看這本書之前,其實自己覺得各種事情只要肯學習,其實都是挺簡單的。但看了本書

複習筆記資料結構-檢索

效能用ASL(查詢成功時的平均查詢長度)來衡量 線性表檢索 順序檢索 逐個比較 優點:插入元素可以直接加在表尾 缺點:檢索時間太長 二分檢索法 條件:序列必須有序 實現: 1 template <class Type> int Bi

開發筆記茶餘飯後:2、Java問題排查(壓力測試效能監控)

       Java效能問題監控排查,主要就是對Java執行緒的堆疊進行分析,這就用到了Thread Dump工具,就是打印出Java應用執行時的堆疊資訊來定位執行步驟中出現的問題。 【記壓力測試關閉其他因素:1、修改java應用的日誌等級;2、必要

複習筆記C++複習筆記

     要想成為資深的高階測試工程師,白盒還是要會的,白盒要求懂程式碼,雖然在大學的時候,Java,C++,C,組合語言。。都學過,但是已經很久很久不怎麼用,淡忘了不少,所以,趁現在跳槽的空閒期,補習一下這些知識。由於淡忘的基礎較多。。所以從基本語句開始複習,不過因為有基礎

學習筆記老王Python-基礎篇 python 2.x 推薦指數2

Markdown 是一種簡單的、輕量級的標記語法。使用者可以使用諸如 * # 等簡單的標記符號以最小的輸入代價生成極富表現力的文件。   Markdown具有很多優點: 寫作中新增簡單符號即完成排版,所見即所得。讓你專注於文字而不是排版。格式轉換方便,

學習筆記Cocos2d-x Lua指令碼開發如何使用Lua指令碼呼叫自定義類

步驟:自定義類——>使用tolua++編譯到LuaCoco2d.cpp——>Lua指令碼呼叫 具體的操作步驟如下: 步驟一:自定義類 建立自定義類 //DeepSeaHero.h #include "cocos2d.h" using namespace

閱讀筆記《C程序員 從校園到職場》第六章 配置文件,makefile 文件 (Part 2)

不同 tpc 閱讀 ret ftp 理解 源代碼 exe tst Contents: 1.配置文件(通常以 ini 結尾) 2.makefile文件 (Linux) PS: 這篇文章的內容,不太理解。 一、配置文件 本文以一個實際的小軟件為例,介紹了C語言中配

學習筆記:CG基礎2 Convex Hull

判斷 第一條 尋找 ref 時間復雜度 答案 之前 gin polygon Ahead 10.6.2018 開始第二個算法了 篇章1 前面就不多寫了第一篇裏面的有些代碼後面還用到不重寫了 Beginning 算法2 (EE) 概念 極邊(Extremity Edge): 也

學習筆記 唐大仕—Java程式設計 第4講 類、包和介面之4.2 類的繼承

【學習筆記】 唐大仕—Java程式設計 第4講 類、包和介面之4.2 類的繼承 super的使用 1.使用super訪問父類的域和方法 注意:正是由於繼承,使用this可以訪問父類的域和方法。但是有時為了明確指明父類的域和方法,就要用關鍵字super。this和super都是指當前同一個物件

讀書筆記數學之美2-搜尋引擎

8.簡單之美——布林代數和搜尋引擎 建立一個搜尋引擎大致需要做的幾件事情: 自動下載儘可能多的網頁; 建立快速有效的索引; 根據相關性對網頁進行公平準確的排序。 這就是搜尋的“道”。 關鍵詞=布林運算(詞1,詞2,詞3);接著判斷詞i是否在文獻中,以得到一串二進

讀書筆記數學之美2--從規則到統計

這本書重於“道”,所以不應該著眼於其中的“術”。悟“道”才可以在今後的研究生涯中篤定地前行。 目錄   1.文字和語言vs數字和資訊 1.1 資訊 1.2 文字和數字 1.3 小結 2.自然語言處理 3.統計語言模型 3.1 用數學的方法描述語言規律

學習筆記慕課網—Java設計模式精講 第3章 軟體設計七大原則-3-2 開閉原則

/** * 軟體設計七大原則-開閉原則 * @author cnRicky * @date 2018.11.7 */ 開閉原則 定義:一個軟體實體如類、模組和函式應該對擴充套件開放,對修改關閉 強調的是用抽象構建框架,用實現擴充套件細節 優點:提高軟體系統的可複用性及可維護性 開閉原則

學習筆記 唐大仕—Java程式設計 第5講 深入理解Java語言之5.2 多型及虛方法呼叫

/** * 多型及虛方法呼叫 * @author cnRicky * @date 2018.11.7 */ 多型 多型(Polymorphism)是指一個程式中相同的名字表示不同的含義的情況 多型有兩種情形 編譯時多型:  *過載(Overload)(多個同名的不同方法)  *如 p.sayH

學習筆記Pattern Recognition&Machine Learning [1.2] Probability Theory(2) 基於高斯分佈和貝葉斯理論的曲線擬合

    高斯分佈不必贅述,這裡記錄個有意思的東西,即從高斯分佈和貝葉斯理論出發看曲線擬合(即選擇引數w)。     首先假設我們使用多項式擬合曲線,根據泰勒展開的方法,我們可以用有限項多項式在一定精度內擬合任何曲線。  &nb

學習筆記Pattern Recognition&Machine Learning [1.2] Probability Theory(1)貝葉斯理論

    這節講了概率論中的一些基本概念,這裡記錄一下對貝葉斯理論的理解。     首先簡單描述一下貝葉斯理論。     對於一個隨機事件,我們首先給出先驗分佈,不妨設為p(w)

學習筆記Hands-on ML with sklearn&tensorflow [TF] [2]placeholder nodes實現mini-batch

為了實現mini-batch,需要一種節點,在每次迭代使用一個新的batch,可以用placeholder node實現這個功能。 >>>A = placeholder(tf.float32, shape=(None, 3)) >>>B = A + 5 #這裡