Cocos2d lua 初識shader之四 描邊

2021-09-10 04:40:32 字數 2580 閱讀 2788

原理:對於所有透明的畫素點,遍歷該畫素點周圍的所有畫素點,當有任意乙個畫素點非透明時,就將該畫素點置為描邊顏色。

ps.在網上讀到一位前輩寫的方法是「遍歷所有不透明的畫素點四周,當有透明畫素點時,將該畫素點設定為描邊顏色」(思路相反),這樣的做法會有些缺憾,結尾會放出比較圖。

local vert = [[

attribute vec4 a_position; 

attribute vec2 a_texcoord; 

attribute vec4 a_color; 

#ifdef gl_es  

varying lowp vec4 v_fragmentcolor;

varying mediump vec2 v_texcoord;

#else                      

varying vec4 v_fragmentcolor; 

varying vec2 v_texcoord;  

#endif    

void main() 

]]local frag = [[

#ifdef gl_es 

precision mediump float; 

#endif 

varying vec4 v_fragmentcolor; 

varying vec2 v_texcoord; 

uniform vec2 my_size;                   // 紋理大小,紋理座標範圍為0-1

void main(void) 

// 遍歷四周所有畫素點

for(float i = 0.0; i < 360.0; i += step)}}

]]-- 1.建立glprogram

local glprogram = cc.glprogram:createwithbytearrays(vert, frag)

-- 2.獲取glprogramstate

local glprogramstate = cc.glprogramstate:getorcreatewithglprogram(glprogram)

-- 3.設定屬性值

local size = self.blur:gettexture():getcontentsizeinpixels()

glprogramstate:setuniformvec2("my_size", cc.p(size.width, size.height))

self.blur:setglprogram(glprogram)

self.blur:setglprogramstate(glprogramstate)

當前效果:

相反效果:

新增漸變效果

原理很簡單,對於當前畫素點,一層一層進行遍歷即可

void main(void) 

// 一層一層遍歷四周所有畫素點

for(float w = 0.0; w < width; w += width_step)}}

}一層一層的遍歷畫素點明顯效率極低,時間複雜度為(12*n)^m = n^m(n為透明畫素點,m為遍歷層數),一種解決方法:是將兩個迴圈的顛倒過來,先找到非透明畫素,然後在逐步判斷兩個畫素點間的下乙個非透明畫素的位置。時間複雜度為12*n*m = n*m,提高了一些效率。

void main(void) 

vec2 unit = 1.0 / my_size.xy;       // 單位座標

float step = 30.0;                  // 30度

float width = 5.0;                  // 描邊寬度

float width_step = 0.5;             // 描邊寬度_步長

vec4 border = vec4(1.0,1.0,1.0,1.0);// 邊框顏色

// 遍歷四周所有畫素點

for(float i = 0.0; i < 360.0; i += step)

}}}}

效果稍有些差異

由於這種方式並沒有選擇最優點來計算描邊寬度,因此描邊效果並不好,我們應該找到透明畫素點周圍距離最近的非透明畫素點。

void main(void) 

vec2 unit = 1.0 / my_size.xy;       // 單位座標

float step = 30.0;                  // 30度

float width = 5.0;                  // 描邊寬度

float width_step = 0.5;             // 描邊寬度_步長

vec4 border = vec4(1.0,1.0,1.0,1.0);// 邊框顏色

// 遍歷四周所有畫素點

float min_dis = 5.0;                // 最小距離

float sum = 0.0;                    // 周圍滿足條件的非透明畫素點個數

for(float i = 0.0; i < 360.0; i += step)

}}}if(sum > 0.0)

}效果好了一些

Cocos2d lua 初識shader之一 置灰

shader譯名為著色器,通俗來說,shader告訴電腦如何使用一種特殊的方式繪製物體。shader分為三種 頂點著色器 片段著色器 幾何著色器。頂點shader 3d圖形都是由乙個乙個三角形組 成的,頂點shader就是計算頂點位置,並為後期畫素渲染做準備的 片段shader 是以畫素為單位,計算...

Cocos2d lua 初識shader之三 模糊

原理 遍歷當前畫素點周圍的部分畫素點,累加它們的rgba,根據距離設定權重並相乘,最後再根據總權重獲取該總和的平均值,將該平均值設定為當前畫素點的顏色。local vert attribute vec4 a position attribute vec2 a texcoord attribute v...

Cocos2d lua 滑動選關效果

昨天看到前面的大佬在做這種效果,特意去請教了一下,剛開始以為是用pageview或者listview做的,原來是用最普通的觸控來實現的。感覺自己應該多思考多學習,不會的地方還是太多了,有些東西其實沒有自己想的那麼複雜,能用一些基本元素實現來實現的東西,自己有時候卻總是覺得是不是 不會 不懂,也可能是...