偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

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

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

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

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

我們需要用到Shader文件UVAnimation.vsh和UVAnimation.fsh,它們在Resources\3D目錄中。 UVAnimation.vsh是一個模型骨骼動畫的計算Shader,而UV動畫的效果在UVAnimation.fsh中進行處理:

  1. uniform sampler2D u_texture1;  
  2. uniform sampler2D u_lightTexture;     
  3. uniform vec4 v_LightColor;     //顏色色彩  
  4. uniform vec2 v_animLight;     //UV動畫紋理偏移  
  5. varying vec2 v_texCoord;      //模型的紋理UV值  
  6.    
  7. void main(void)   
  8. {  
  9.     //通過UV值的移動形成UV動畫  
  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,與魚原來的紋理色值相加不變,而白色區(qū)域的值大于0,與魚原來的紋理色值相加后會有增亮效果。這張圖我們放在工程的Resources\3D目錄中。

我們在FishLayer中增加一個變化的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裝配成一個完整的Shader文件。  
  14. auto glprogram = GLProgram::createWithByteArrays(vertSource.c_str(), fragSource.c_str());  
  15. // 由Shader文件創(chuàng)建這個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. //注意,對于波光貼圖,我們希望它在進行UV動畫時能產(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. //在這里,我們設(shè)置一個波光的顏色,這里設(shè)置為白色。  
  40. Vec4  tLightColor(1.0,1.0,1.0,1.0);  
  41. glprogramstate->setUniformVec4("v_LightColor",tLightColor);  
  42.    
  43. //下面這一段,是為了將我們自定義的Shader與我們的模型頂點組織方式進行匹配。模型的頂點數(shù)據(jù)一般包括位置,法線,色彩,紋理,以及骨骼綁定信息。而Shader需要將內(nèi)部相應(yīng)的頂點屬性通道與模型相應(yīng)的頂點屬性數(shù)據(jù)進行綁定才能正確顯示出頂點。  
  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滾動初始值設(shè)為0  
  58. _lightani.x = _lightani.y = 0;  

之后我們重載一下FishLayer的draw函數(shù),加入UV值的變化處理和設(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 來源: cocoachina
相關(guān)推薦

2015-04-20 18:12:49

Cocos實戰(zhàn)《捕魚達人3》

2014-08-14 10:06:14

Cocos2d-x

2014-07-28 17:09:54

Cocos

2015-04-27 15:35:42

Cocos3D場景編輯器

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游戲引擎

2017-07-12 23:08:03

白鷺引擎

2014-11-21 12:37:49

暢思廣告《捕魚達人3》

2011-10-06 13:30:45

宏碁投影儀

2012-11-26 12:51:44

木材3D打

2012-12-24 08:48:25

iOSUnity3D

2011-05-26 10:05:07

優(yōu)派投影機

2022-09-14 09:23:51

Java3D引擎

2015-04-03 11:40:08

Cocos 2015

2023-03-03 21:42:18

鴻蒙

2012-08-13 17:11:37

Silverlight

2015-09-09 11:05:52

3d視差引導(dǎo)頁

2021-12-28 10:52:10

鴻蒙HarmonyOS應(yīng)用
點贊
收藏

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