使用內建 shader 非常簡單,直接通過乙個 key 值從 glprogramcache 緩衝區取到乙個 glprogram,然後設定給 node 即可;
預設 shader 的 key 值在 glprogram 中定義
sprite->setshaderprogram(program);這裡使用的shader_name_position_grayscale 是設定影象變灰的功能,其使用的頂點著色器和片段著色器分別是ccpositiontexturecolor_nomvp_vert
和ccpositiontexture_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...