日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cocos中如何让背景模糊_Cocos2d-x shader学习2: 模糊(Blur)

發布時間:2023/12/19 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cocos中如何让背景模糊_Cocos2d-x shader学习2: 模糊(Blur) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模糊效果在游戲中經常會用到,有的為了突出前景會把背景給模糊化,有的是因為一些技能需要模糊效果。模糊是shader中較為簡單的一種應用。cocos2dx 3.x給的demo中,就有sprite的模糊的效果。

先說下這個模糊算法的大致思路,我們在片段著色器中可以得到當前像素點的顏色值,要想讓這個顏色變得模糊,就要讓它與它周圍的像素點的顏色稍微接近一點,那么我們就需要拿到這個像素點周圍的像素點的顏色值,我們把這些個像素點的值加起來取平均值,就得到了一個區域內的平均顏色。

如果直接使用這個顏色的話,最終的效果會變得很模糊,如果我們只是想稍微模糊一點的話,就要讓這個平均值更接近于當前像素點原本的顏色,為此,我們取均值的時候對每個像素點增加了一個權重的定義,當前像素點的權重最高,依次向周圍減弱,使得最后得到的均值的顏色更接近于當前像素點原始的顏色。

看代碼:

#ifdef GL_ES

precision mediump float;

#endif

varying vec4 v_fragmentColor;

varying vec2 v_texCoord;

uniform vec2 resolution;//模糊對象的實際分辨率

uniform float blurRadius;//半徑

uniform float sampleNum;//間隔的段數

vec4 blur(vec2);

void main(void)

{

vec4 col = blur(v_texCoord); //* v_fragmentColor.rgb;

gl_FragColor = vec4(col) * v_fragmentColor;

}

vec4 blur(vec2 p)

{

if (blurRadius > 0.0 && sampleNum > 1.0)

{

vec4 col = vec4(0);

vec2 unit = 1.0 / resolution.xy;//單位坐標

float r = blurRadius;

float sampleStep = r / sampleNum;

float count = 0.0;

//遍歷一個矩形,當前的坐標為中心點,遍歷矩形中每個像素點的顏色

for(float x = -r; x < r; x += sampleStep)

{

for(float y = -r; y < r; y += sampleStep)

{

float weight = (r - abs(x)) * (r - abs(y));//權重,p點的權重最高,向四周依次減少

col += texture2D(CC_Texture0, p + vec2(x * unit.x, y * unit.y)) * weight;

count += weight;

}

}

//得到實際模糊顏色的值

return col / count;

}

return texture2D(CC_Texture0, p);

}

精度限定符和varying變量等的一些基礎的知識在前面的博客中遇到的已經說過。

uniform變量是頂點著色器和片段著色器共享使用的變量,uniform的值不能被改變。

uniform變量是由宿主程序設置的,代碼如下:

void EffectBlur::setTarget(EffectSprite *sprite)

{

Size size = sprite->getTexture()->getContentSizeInPixels();

_glprogramstate->setUniformVec2("resolution", size);

#if (CC_TARGET_PLATFORM != CC_PLATFORM_WINRT)

_glprogramstate->setUniformFloat("blurRadius", _blurRadius);

_glprogramstate->setUniformFloat("sampleNum", _blurSampleNum);

#endif

}

這里宿主程序設置了resolution,blurRadius和sampleNum三個uniform變量。渲染的時候,頂點著色器和片段著色器都可以用到這三個變量的值。

resolution是當前渲染node的實際分辨率。

blurRadius是像素點模糊處理的參考矩形的半徑

sampleNum選擇像素點的間隔的數量,相鄰像素點的間距等于blurRadius / sampleNum

blur函數就是計算該像素點的最終顏色,參數p是當前像素點的坐標,我們以p點為中點以2r為邊長得到一個矩形,這個矩形中每隔sampleStep長度的像素點是當前像素點的顏色參考像素。每個像素點會乘以一個weight權重,這個weight越靠近p點值越高,目的是為了讓最終的值更接近于p點的像素顏色,然后各個像素點乘以權重后的顏色加起來,得到col,把各個權重也加起來得到count。最終的顏色值就是col/count。

效果圖如下:

模糊前:

模糊后:

總結

以上是生活随笔為你收集整理的cocos中如何让背景模糊_Cocos2d-x shader学习2: 模糊(Blur)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美成人午夜免费视在线看片 | 亚洲成人一区在线观看 | 日本视频免费在线播放 | 悠悠色影院| 男人午夜剧场 | 亚洲国产日韩欧美一区二区三区 | 亚洲图片激情小说 | 天天舔天天干天天操 | 青青草视频观看 | 哺乳喂奶一二三区乳 | 国产一区二区电影 | 播放男人添女人下边视频 | 高清无码一区二区在线观看吞精 | 日韩极品少妇 | 国产资源在线视频 | 日韩在线视频一区 | 激情一区二区三区 | 久久夜色精品国产欧美乱 | 成人精品综合 | 一区二区在线免费 | youjizz少妇 | 中文字幕一区二区人妻痴汉电车 | 亚洲成人av免费 | 夜夜爱视频 | 青春草免费视频 | 久久综合五月 | 人人澡人人爱 | 亚洲国产精品狼友在线观看 | 最新国产网站 | 免费看日韩毛片 | 日本不卡一区在线观看 | 亚洲精品乱码久久久久久写真 | 一本到av | 国产一区二区三区日韩 | 国产精品久热 | 毛片网站免费在线观看 | 日韩爽爽视频 | 亚洲影视一区二区 | 777久久久| 久久理伦 | 日韩黄色a级片 | 天天搞天天搞 | 91猎奇在线观看 | 天天摸天天看 | 337p粉嫩日本欧洲亚洲大胆 | 极品女神无套呻吟啪啪 | 91成人在线播放 | 久久久福利 | 欧美 在线 | 丁香花激情网 | 国产手机看片 | 国产原创在线播放 | 波多野结衣一本 | 少妇又紧又爽视频 | 丁香综合激情 | 欧美变态口味重另类在线视频 | www.av网| 印度午夜性春猛xxx交 | 伊人激情综合网 | 凹凸视频一区二区 | 老头糟蹋新婚少妇系列小说 | 日本三级视频 | 牛牛av| 成人免费视频国产免费麻豆 | 夜夜躁日日躁狠狠久久av | 亚瑟av | 成人污污视频在线观看 | 日韩在线第一区 | 特级毛片在线观看 | 蜜臀av色欲a片无码精品一区 | 亚洲av无码一区二区三区网址 | 欧美日韩在线视频一区二区三区 | 国产精品一卡 | 中文字幕日本在线 | 日本在线视频二区 | 婷婷色在线播放 | 五月婷婷天堂 | 夜夜精品一区二区无码 | 中文字幕在线色 | 日批视频在线 | 男女网站在线观看 | 欧美一区二区二区 | 美女撒尿无遮挡网站 | 91中文字幕在线观看 | 久久国产精品偷 | 亚洲精品一区二三区 | www三级免费 | a级片在线看| 国产又粗又硬又长又爽的演员 | 日本a级免费 | 午夜一区二区三区免费 | 正在播放一区 | 欧美色图俺去了 | 一区二区内射 | 95在线视频| 日韩视频在线一区二区 | 精品乱子伦一区二区三区 | 五月天中文字幕在线 | 国产精品成人av性教育 |