Creator 最新3D shader UV動(dòng)畫(huà)的實(shí)現(xiàn)

Cocos 的3D捕魚(yú)達(dá)人里面有魚(yú)背上的波光(圖一)座韵,今天就給大家講解一下,這種技術(shù)細(xì)節(jié)的實(shí)現(xiàn)---》UV動(dòng)畫(huà)。

1: 什么是uv動(dòng)畫(huà)?

??就是將兩個(gè)紋理合成以后,不斷改變一個(gè)紋理的uv坐標(biāo)憔涉,讓這個(gè)紋理的貼圖位置不斷改變而形成UV動(dòng)畫(huà)。比如火焰析苫,河流,都可以采用這樣的技術(shù)來(lái)實(shí)現(xiàn)穿扳。

2: cocos creator shader 為什么要重點(diǎn)學(xué)習(xí)?

??未來(lái)毫無(wú)疑問(wèn)衩侥,微信小游戲會(huì)越來(lái)越大,越來(lái)越精美矛物,shader開(kāi)發(fā)也是未來(lái)的一個(gè)核心茫死,因?yàn)樗芏ㄖ凭赖漠?huà)面,和完成精美的特效履羞。

3: cocos creator Shader要使用那個(gè)版本?

??cocos creator Shader要使用2.1.x這個(gè)版本峦萎,目前使用最新的2.1.2這個(gè)版本會(huì)比較好一些。Cocos creator 2.0以下的版本都不支持材質(zhì)+?shader

4: cocos creator 材質(zhì)和shader

??Shader 是一種給GPU執(zhí)行的代碼忆首,GPU的渲染流水線爱榔,為了方便開(kāi)發(fā)人員定制效果,開(kāi)放出接口給程序員編寫(xiě)代碼來(lái)控制,這種程序叫作shader, shader開(kāi)發(fā)語(yǔ)言糙及,cocos采用的是GLSL編程語(yǔ)言详幽。開(kāi)發(fā)人員可以在下圖頂點(diǎn)Shader和著色Shader來(lái)入代碼。

材質(zhì)是一種配置文件浸锨,選擇好一個(gè)Shader(算法), 并給這個(gè)Shader提供必要的參數(shù),?材質(zhì)被關(guān)聯(lián)到Sprite, MeshRenderer等組件里面唇聘,當(dāng)游戲引擎繪制物體的時(shí)候,先讀取材質(zhì)柱搜,根據(jù)材質(zhì),?給GPU配置shader和shader要的參數(shù),?這樣管道流水線就可以完成的繪制出來(lái)這個(gè)物體迟郎。

5: creator 3D Shader的模板結(jié)構(gòu)詳解:

??%{

??techniques: [

????{

??????passes: [

????????{

??????????vert: vs ?// 頂點(diǎn)shader代碼模塊

??????????frag: fs ?// 著色shader代碼模塊

??????????cullMode: none

??????????depthTest: true

??????????depthWrite: true

??????????blend: true

????????}

??????]

??????layer: 0

????}

??]


??properties: { // 材質(zhì)上的屬性變量,可以在材質(zhì)屬性編輯器上看到變量作可視化編輯

????diffuseTexture: {

??????type: sampler2D

??????value: null

????}

??}

%}


%% vs { // 頂點(diǎn)shader

precision highp float;

attribute vec3 a_position; // 從渲染管道獲取的頂點(diǎn)坐標(biāo)

attribute mediump vec2 a_uv0; // 從渲染管道獲取的紋理坐標(biāo);

attribute lowp vec4 a_color; // 從渲染管道獲取的頂點(diǎn)顏色



uniform mat4 cc_matWorld; ?//引擎繪制物體時(shí)設(shè)置當(dāng)前物體模型到世界的變換矩陣

uniform mat4 cc_matViewProj; // 引擎繪制物體時(shí)設(shè)置世界坐標(biāo)到投影坐標(biāo)系的變換


varying lowp vec4 v_color; // 頂點(diǎn)shader傳遞給著色shader的頂點(diǎn)顏色

varying mediump vec2 v_uv0; // 頂點(diǎn)shader傳遞給著色shader的頂點(diǎn)紋理坐標(biāo)



void main () {

??vec4 position = vec4(a_position, 1);

??v_uv0 = a_uv0;

??v_color = a_color;

??// 將模型坐標(biāo)變換到透視投影坐標(biāo)聪蘸,返回給渲染管道;

??gl_Position = cc_matViewProj * cc_matWorld * position;

}

}


%% fs { // 著色shader

precision highp float;

uniform sampler2D diffuseTexture; // 用戶(hù)指定的模型貼圖

varying lowp vec4 v_color; // 頂點(diǎn)shader傳遞過(guò)來(lái)的顏色

varying mediump vec2 v_uv0; // 頂點(diǎn)shader傳遞過(guò)來(lái)的紋理坐標(biāo)


void main () {

??// 根據(jù)紋理坐標(biāo)獲取顏色

??vec4 col = texture2D(diffuseTexture, v_uv0);

??gl_FragColor = col; // 將著色返回給渲染管道

}

}


6: uv動(dòng)畫(huà)shader的實(shí)現(xiàn):

?%{

??techniques: [

????{

??????passes: [

????????{

??????????vert: vs ?

??????????frag: fs

??????????cullMode: none

??????????depthTest: true

??????????depthWrite: true

??????????blend: true

????????}

??????]

??????layer: 0

????}

??]


??properties: {

????diffuseTexture: {

??????type: sampler2D

??????value: null

????}

//?sub_tex, 存放第二個(gè)紋理

sub_tex: {

??type: sampler2D

??????value: null

}

// 程序設(shè)置給shader當(dāng)前運(yùn)行時(shí)間;

run_time: {

??type: number

??value: 0

}

??}

%}


%% vs {

precision highp float;

attribute vec3 a_position;

attribute mediump vec2 a_uv0;

attribute lowp vec4 a_color;



uniform mat4 cc_matWorld;

uniform mat4 cc_matViewProj;


varying lowp vec4 v_color;

varying mediump vec2 v_uv0;



void main () {

??vec4 position = vec4(a_position, 1);

??v_uv0 = a_uv0;

??v_color = a_color;

??gl_Position = cc_matViewProj * cc_matWorld * position;

}

}


%% fs {

precision highp float;

uniform sampler2D diffuseTexture;

uniform sampler2D sub_tex;

uniform float run_time;


varying lowp vec4 v_color;

varying mediump vec2 v_uv0;


void main () {

??// 根據(jù)時(shí)間來(lái)生成坐標(biāo)偏移宪肖,時(shí)間不斷變化表制,坐標(biāo)也就變化,形成了uv動(dòng)畫(huà)

??vec2 offset = vec2(run_time, run_time);

??// 第二章貼圖的顏色采樣

??vec4 light = texture2D(sub_tex, v_uv0 + offset);

??vec4 col = texture2D(diffuseTexture, v_uv0);

??gl_FragColor = col + light;

}

}

6: 程序如何控制Shader代碼

cc.Class({

????extends: cc.Component,


????properties: {


????},


????// LIFE-CYCLE CALLBACKS:


????// onLoad () {},


????start () {

????????this.now_time = 0;

????????// 獲取MeshRenderer組件匈庭,去找到材質(zhì)對(duì)象;

????????this.mr = this.getComponent(cc.MeshRenderer);

????},


????update (dt) {

????????this.now_time += dt;


????????// 獲取材質(zhì)對(duì)象;

????????let material = this.mr.sharedMaterials[0];

????????// 通過(guò)材質(zhì)來(lái)修改shader里面的變量值run_time,

????????// shader里面的run_time跟著改變了;

????????material.setProperty('run_time', this.now_time);

????????// 將材質(zhì)更新到MeshRenderer的材質(zhì)對(duì)象上

????????this.mr.setMaterial(0, material);

????},

});



UV shader動(dòng)畫(huà)夫凸,的視頻詳細(xì)講解,和項(xiàng)目工程阱持,可以加學(xué)習(xí)討論群夭拌,今天的分享都到這里結(jié)束了,謝謝大家衷咽。點(diǎn)擊鏈接加入群聊【Unity/Cocos交流群】

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸽扁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子镶骗,更是在濱河造成了極大的恐慌桶现,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鼎姊,死亡現(xiàn)場(chǎng)離奇詭異骡和,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)相寇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)慰于,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人唤衫,你說(shuō)我怎么就攤上這事婆赠。” “怎么了佳励?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵休里,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我赃承,道長(zhǎng)妙黍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任楣导,我火速辦了婚禮废境,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘筒繁。我一直安慰自己噩凹,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布毡咏。 她就那樣靜靜地躺著驮宴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呕缭。 梳的紋絲不亂的頭發(fā)上堵泽,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天修己,我揣著相機(jī)與錄音,去河邊找鬼迎罗。 笑死睬愤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的纹安。 我是一名探鬼主播尤辱,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼厢岂!你這毒婦竟也來(lái)了光督?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤塔粒,失蹤者是張志新(化名)和其女友劉穎结借,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體卒茬,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡船老,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了圃酵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片努隙。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辜昵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咽斧,我是刑警寧澤堪置,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站张惹,受9級(jí)特大地震影響舀锨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宛逗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一坎匿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雷激,春花似錦替蔬、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至根悼,卻和暖如春凶异,著一層夾襖步出監(jiān)牢的瞬間蜀撑,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工剩彬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酷麦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓喉恋,卻偏偏與公主長(zhǎng)得像沃饶,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瀑晒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容