自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

《捕魚達(dá)人3》講解Cocos引擎3D:魚身波光處理

移動(dòng)開發(fā) Android 游戲開發(fā)
在上一節(jié)的學(xué)習(xí)中,我們已經(jīng)掌握了如何使用Cocos2d-x加載魚的模型和播放魚的動(dòng)畫,這一節(jié)我們來(lái)學(xué)習(xí)一下如何為魚的模型增加波光處理,以使它看起來(lái)像在海水中游動(dòng)。

在上一節(jié)的學(xué)習(xí)中,我們已經(jīng)掌握了如何使用Cocos2d-x加載魚的模型和播放魚的動(dòng)畫,這一節(jié)我們來(lái)學(xué)習(xí)一下如何為魚的模型增加波光處理,以使它看起來(lái)像在海水中游動(dòng)。

在模型的身上加入波光的感覺(jué),是通過(guò)紋理動(dòng)畫來(lái)實(shí)現(xiàn)的,其原理是給模型增加一個(gè)紋理,并循環(huán)的移動(dòng)紋理貼圖尋址的UV坐標(biāo),這樣貼在模型表面的紋理就會(huì)按照不斷變化的UV值來(lái)產(chǎn)生出貼圖運(yùn)動(dòng)的效果。下面我們來(lái)實(shí)際做一下這個(gè)效果。

我們需要用到Shader文件UVAnimation.vsh和UVAnimation.fsh,它們?cè)赗esources\3D目錄中。 UVAnimation.vsh是一個(gè)模型骨骼動(dòng)畫的計(jì)算Shader,而UV動(dòng)畫的效果在UVAnimation.fsh中進(jìn)行處理:

  1. uniform sampler2D u_texture1;  
  2. uniform sampler2D u_lightTexture;     
  3. uniform vec4 v_LightColor;     //顏色色彩  
  4. uniform vec2 v_animLight;     //UV動(dòng)畫紋理偏移  
  5. varying vec2 v_texCoord;      //模型的紋理UV值  
  6.    
  7. void main(void)   
  8. {  
  9.     //通過(guò)UV值的移動(dòng)形成UV動(dòng)畫  
  10.      vec4 lightcolor = texture2D(u_lightTexture, v_texCoord + v_animLight.xy) * v_LightColor;  
  11.     gl_FragColor = texture2D(u_texture1, v_texCoord) + lightcolor;  
  12. }  

然后我們需要一張波光圖caustics.png,它是黑白圖,用于在模型上增加色值操作,這樣的話,黑色的區(qū)域色值為0,與魚原來(lái)的紋理色值相加不變,而白色區(qū)域的值大于0,與魚原來(lái)的紋理色值相加后會(huì)有增亮效果。這張圖我們放在工程的Resources\3D目錄中。

我們?cè)贔ishLayer中增加一個(gè)變化的UV值:

  1. Vec2 _lightani;

在FishLayer::init函數(shù)中,我們將上面所寫的vsh,fsh等組合成魚模型可以使用的Shader并使用它:

  1. // 取得文件管理器  
  2. auto fileUtiles = FileUtils::getInstance();  
  3.    
  4. // 加載相應(yīng)的Shader文件  
  5. // 加載UVAnimation.vsh并取得文件內(nèi)容字符串  
  6. auto vertexFilePath = fileUtiles->fullPathForFilename("UVAnimation.vsh");  
  7. auto vertSource = fileUtiles->getStringFromFile(vertexFilePath);  
  8.    
  9. // 加載UVAnimation.fsh并取得文件內(nèi)容字符串  
  10. auto fragmentFilePath = fileUtiles->fullPathForFilename("UVAnimation.fsh");  
  11. auto fragSource = fileUtiles->getStringFromFile(fragmentFilePath);  
  12.    
  13. // 將vsh與fsh裝配成一個(gè)完整的Shader文件。  
  14. auto glprogram = GLProgram::createWithByteArrays(vertSource.c_str(), fragSource.c_str());  
  15. // 由Shader文件創(chuàng)建這個(gè)Shader  
  16. auto glprogramstate = GLProgramState::getOrCreateWithGLProgram(glprogram);  
  17. // 給精靈設(shè)置所用的Shader  
  18. _sprite->setGLProgramState(glprogramstate);  
  19.    
  20. //創(chuàng)建海龜所用的貼圖。  
  21. auto textrue1 = Director::getInstance()->getTextureCache()->addImage("tortoise.png");  
  22. //將貼圖設(shè)置給Shader中的變量值u_texture1  
  23. glprogramstate->setUniformTexture("u_texture1", textrue1);  
  24.    
  25. //創(chuàng)建波光貼圖。  
  26. auto textrue2 = Director::getInstance()->getTextureCache()->addImage("caustics.png");  
  27.    
  28. //將貼圖設(shè)置給Shader中的變量值u_lightTexture  
  29. glprogramstate->setUniformTexture("u_lightTexture", textrue2);  
  30.    
  31. //注意,對(duì)于波光貼圖,我們希望它在進(jìn)行UV動(dòng)畫時(shí)能產(chǎn)生四方連續(xù)效果,必須設(shè)置它的紋理UV尋址方式為GL_REPEAT。  
  32. Texture2D::TexParams tRepeatParams;  
  33. tRepeatParams.magFilter = GL_LINEAR_MIPMAP_LINEAR;  
  34. tRepeatParams.minFilter = GL_LINEAR;  
  35. tRepeatParams.wrapS = GL_REPEAT;  
  36. tRepeatParams.wrapT = GL_REPEAT;  
  37. textrue2->setTexParameters(tRepeatParams);  
  38.    
  39. //在這里,我們?cè)O(shè)置一個(gè)波光的顏色,這里設(shè)置為白色。  
  40. Vec4  tLightColor(1.0,1.0,1.0,1.0);  
  41. glprogramstate->setUniformVec4("v_LightColor",tLightColor);  
  42.    
  43. //下面這一段,是為了將我們自定義的Shader與我們的模型頂點(diǎn)組織方式進(jìn)行匹配。模型的頂點(diǎn)數(shù)據(jù)一般包括位置,法線,色彩,紋理,以及骨骼綁定信息。而Shader需要將內(nèi)部相應(yīng)的頂點(diǎn)屬性通道與模型相應(yīng)的頂點(diǎn)屬性數(shù)據(jù)進(jìn)行綁定才能正確顯示出頂點(diǎn)。  
  44. long offset = 0;  
  45. auto attributeCount = _sprite->getMesh()->getMeshVertexAttribCount();  
  46. for (auto k = 0; k < attributeCount; k++) {  
  47.     auto meshattribute = _sprite->getMesh()->getMeshVertexAttribute(k);  
  48.     glprogramstate->setVertexAttribPointer(s_attributeNames[meshattribute.vertexAttrib],  
  49.         meshattribute.size,  
  50.         meshattribute.type,  
  51.         GL_FALSE,  
  52.         _sprite->getMesh()->getVertexSizeInBytes(),  
  53.                                              (GLvoid*)offset);  
  54.         offset += meshattribute.attribSizeBytes;  
  55.     }  
  56.    
  57. //uv滾動(dòng)初始值設(shè)為0  
  58. _lightani.x = _lightani.y = 0;  

之后我們重載一下FishLayer的draw函數(shù),加入U(xiǎn)V值的變化處理和設(shè)置。

  1. void FishLayer::draw(Renderer* renderer, const Mat4 &transform, uint32_t flags)  
  2. {  
  3.     if(_sprite)  
  4.     {  
  5.            
  6.         auto glprogramstate = _sprite->getGLProgramState();  
  7.         if(glprogramstate)  
  8.         {  
  9.             _lightani.x += 0.01;  
  10.             if(_lightani.x > 1.0)  
  11.             {  
  12.                 _lightani.x-= 1.0;  
  13.             }  
  14.             _lightani.y += 0.01;  
  15.             if(_lightani.y > 1.0)  
  16.             {  
  17.                 _lightani.y-= 1.0;  
  18.             }  
  19.             glprogramstate->setUniformVec2("v_animLight",_lightani);  
  20.         }  
  21.     }  
  22.     Node::draw(renderer,transform,flags);  
  23. }  

這樣,我們就完成了魚身上的波光處理。

責(zé)任編輯:chenqingxiang 來(lái)源: cocoachina
相關(guān)推薦

2015-04-20 18:12:49

Cocos實(shí)戰(zhàn)《捕魚達(dá)人3》

2014-08-14 10:06:14

Cocos2d-x

2015-04-27 15:35:42

Cocos3D場(chǎng)景編輯器

2014-07-28 17:09:54

Cocos

2015-01-19 17:44:02

Cocos引擎3D特效

2013-11-21 19:36:56

暢游游戲引擎Genesis-3D

2024-12-10 09:40:00

AI3D模型

2022-10-19 13:43:42

CocosOpenHarmon3D游戲引擎

2014-11-21 12:37:49

暢思廣告《捕魚達(dá)人3》

2017-07-12 23:08:03

白鷺引擎

2011-10-06 13:30:45

宏碁投影儀

2012-11-26 12:51:44

木材3D打

2022-09-14 09:23:51

Java3D引擎

2012-12-24 08:48:25

iOSUnity3D

2011-05-26 10:05:07

優(yōu)派投影機(jī)

2015-04-03 11:40:08

Cocos 2015

2011-08-26 14:50:23

2011-04-26 14:21:20

3DJVC投影機(jī)

2012-08-13 17:11:37

Silverlight

2023-03-03 21:42:18

鴻蒙
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)