成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

我們需要用到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,它是黑白圖,用于在模型上增加色值操作,這樣的話,黑色的區域色值為0,與魚原來的紋理色值相加不變,而白色區域的值大于0,與魚原來的紋理色值相加后會有增亮效果。這張圖我們放在工程的Resources\3D目錄中。

我們在FishLayer中增加一個變化的UV值:

  1. Vec2 _lightani;

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

  1. // 取得文件管理器  
  2. auto fileUtiles = FileUtils::getInstance();  
  3.    
  4. // 加載相應的Shader文件  
  5. // 加載UVAnimation.vsh并取得文件內容字符串  
  6. auto vertexFilePath = fileUtiles->fullPathForFilename("UVAnimation.vsh");  
  7. auto vertSource = fileUtiles->getStringFromFile(vertexFilePath);  
  8.    
  9. // 加載UVAnimation.fsh并取得文件內容字符串  
  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文件創建這個Shader  
  16. auto glprogramstate = GLProgramState::getOrCreateWithGLProgram(glprogram);  
  17. // 給精靈設置所用的Shader  
  18. _sprite->setGLProgramState(glprogramstate);  
  19.    
  20. //創建海龜所用的貼圖。  
  21. auto textrue1 = Director::getInstance()->getTextureCache()->addImage("tortoise.png");  
  22. //將貼圖設置給Shader中的變量值u_texture1  
  23. glprogramstate->setUniformTexture("u_texture1", textrue1);  
  24.    
  25. //創建波光貼圖。  
  26. auto textrue2 = Director::getInstance()->getTextureCache()->addImage("caustics.png");  
  27.    
  28. //將貼圖設置給Shader中的變量值u_lightTexture  
  29. glprogramstate->setUniformTexture("u_lightTexture", textrue2);  
  30.    
  31. //注意,對于波光貼圖,我們希望它在進行UV動畫時能產生四方連續效果,必須設置它的紋理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. //在這里,我們設置一個波光的顏色,這里設置為白色。  
  40. Vec4  tLightColor(1.0,1.0,1.0,1.0);  
  41. glprogramstate->setUniformVec4("v_LightColor",tLightColor);  
  42.    
  43. //下面這一段,是為了將我們自定義的Shader與我們的模型頂點組織方式進行匹配。模型的頂點數據一般包括位置,法線,色彩,紋理,以及骨骼綁定信息。而Shader需要將內部相應的頂點屬性通道與模型相應的頂點屬性數據進行綁定才能正確顯示出頂點。  
  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滾動初始值設為0  
  58. _lightani.x = _lightani.y = 0;  

之后我們重載一下FishLayer的draw函數,加入UV值的變化處理和設置。

  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. }  

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

責任編輯:chenqingxiang 來源: cocoachina
相關推薦

2015-04-20 18:12:49

Cocos實戰《捕魚達人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

優派投影機

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視差引導頁

2021-12-28 10:52:10

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品美女 | 极品在线| 欧美午夜精品 | 亚洲精品久久久久中文字幕欢迎你 | 成人黄色在线观看 | 久久久www | 黄网址在线观看 | 亚洲精品一区二三区不卡 | 久久精品免费一区二区 | 亚洲精品99 | 久久国产99 | 国产一区2区| 国产成人精品一区二区三区网站观看 | 91精品在线观看入口 | 中文字幕一区二区三区乱码在线 | 国产免费一区二区三区 | a级在线免费 | 欧美日韩在线观看一区 | 日韩成人免费视频 | 亚洲国产情侣 | 亚洲精品在线免费观看视频 | 亚洲成色777777在线观看影院 | 午夜av免费 | 久久久久久亚洲国产精品 | 精品在线一区 | 成人国产精品一级毛片视频毛片 | 一区二区不卡高清 | 91在线视频播放 | 日韩精品在线观看一区二区三区 | 国产在线观看一区二区三区 | 福利视频网站 | av网站在线免费观看 | 亚洲精品久久久一区二区三区 | 亚洲人成人一区二区在线观看 | 伦理午夜电影免费观看 | 久久人人爽人人爽人人片av免费 | 一区在线播放 | 午夜影院网站 | 亚洲一区二区三区免费视频 | 超碰导航 | 国产一区久久久 |