cocos shader 3 例項上手

2021-08-22 18:16:44 字數 3185 閱讀 6340

使用內建 shader 非常簡單,直接通過乙個 key 值從 glprogramcache 緩衝區取到乙個 glprogram,然後設定給 node 即可;

預設 shader 的 key 值在 glprogram 中定義

sprite->setshaderprogram(program);這裡使用的shader_name_position_grayscale 是設定影象變灰的功能,其使用的頂點著色器和片段著色器分別是ccpositiontexturecolor_nomvp_vertccpositiontexture_grayscale_frag

ccpositiontexturecolor_nomvp_vert頂點著色器不乘以 cc_mvpmatrix 矩陣,預設都會乘上這個矩陣,這是 2.x 留下的習慣,用於將區域性座標轉換為世界座標;而 3.x 頂點在傳入 shader 之前就已經做轉換了,所以可以不用乘上這個矩陣,只有帶上 _nomvp 的著色器才不會乘上cc_mvpmatrix矩陣

//ccpositiontexturecolor_nomvp_vert

const char* ccpositiontexturecolor_nomvp_vert = stringify(

attribute vec4 a_position;

attribute vec2 a_texcoord;

attribute vec4 a_color;

\n#ifdef gl_es\n

varying lowp vec4 v_fragmentcolor;

varying mediump vec2 v_texcoord;

\n#else\n

varying vec4 v_fragmentcolor;

varying vec2 v_texcoord;

\n#endif\n

void main()

);

ccpositiontexture_grayscale_frag為每乙個顏色乘上乙個數值,達到變灰的效果

//ccpositiontexture_grayscale_frag

const char* ccpositiontexture_grayscale_frag = stringify(

#ifdef gl_es

precision mediump float;

#endif

varying vec4 v_fragmentcolor;

varying vec2 v_texcoord;

void main(void)

);

首先,先上完整**

//第一步,讀取著色器源**

auto fragsource = (glchar*)(string::createwithcontentsoffile(fileutils::getinstance()->fullpathforfilename("water.fs"))->getcstring());

//第二步,建立 glprogram

//從緩衝區取

auto glprogram = glprogramcache::getinstance()->getprogram("water_frag_shader");

if (!glprogram)

//第三步,建立並設定 glprogramstate

//方式1,通過緩衝區管理

//sprite->setshaderprogram(glprogram);

//方式2,與方式1一樣

//auto glprogramstate = glprogramstate::getorcreatewithglprogram(glprogram);

//sprite->setglprogramstate(glprogramstate);

//方式3,不經過緩衝區

auto glprogramstate = glprogramstate::create(glprogram);

sprite->setglprogramstate(glprogramstate);

//第四步,設定 uniform 變數的值

glprogramstate->setuniformtexture("u_normalmap", normalmaptexture);這段程式實現乙個水波效果,需要用到乙個片段著色器,而頂點著色器即使用預設的就行,也就是ccpositiontexturecolor_nomvp_vert這個著色器。建立乙個著色器程式分為四步:

第一步,讀取著色器源**;

第二步,建立 glprogram,這裡列了兩種方式,其實第二種方式就是第一種方式的內部實現,這兩種方式是一樣的,建立完 glprogram 之後可以將其新增到 glprogramcache 緩衝區,這樣下次再使用同樣的 glprogram 時直接從緩衝區取即可;

第三步,建立 glprogramstate 並設定給結點,這裡列出了三種方式,同樣前兩種方式是一樣的,第三種方式不使用 getorcreatewithglprogram 方法來獲取 glprogramstate,這樣就跳過了 glprogramstatecache 緩衝區;

第四步,不是必須的,如果著色器程式中有用到 uniform 變數,則通過 glprogramstate->setuniform*() 來設定它的值。

CSS基礎和例項(上)

例1 css的標籤選擇器 例2 載入css檔案建立乙個css檔案,把style內容寫進去 在html檔案裡面匯入這個css檔案,效果和直接寫是一樣的 例3 float的使用 如果不用float,那麼因為是塊級標籤,他會自動變成兩行,使用float之後,漂浮起來變成一行,具體的理解是,css是分層級的...

Vue 例項上的屬性

vue 例項上的屬性 元件樹 parent 用來訪問元件例項的父例項 root 用來訪問當前元件樹的根例項 children 用來訪問當前元件例項的直接子元件例項 refs 用來訪問ref指令的子元件 dom訪問 el 用來掛載當前元件例項的dom元素 e ls 用來訪 問els 用來訪問 els ...

S3fs在EC2 Linux例項上掛載S3

在aws為使用者建立訪問金鑰並記錄金鑰id和私密 安裝s3fs 安裝必要的依賴包 yum install automake fuse fuse devel gcc c git libcurl devel libxml2 devel make openssl devel git clone cd s3...