cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质

cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质,第1张

概述       openGL在cocos2d-x中的应用点,调用的api基本已经介绍的差不多了,这一篇介绍一些3d游戏中的概念,它们也和底层有一些关系,也是游戏中常用的一些封装。        当我们要在屏幕上绘制简单的图形时,我们直接计算点的坐标就可以,但是游戏世界中经常有些复杂的模型,例如房子汽车等,这些模型一般是用建模工具制作出来,并且导出数据到指定文件中,然后我们游戏中在读取文件把模型渲染出

openGL在cocos2d-x中的应用点,调用的API基本已经介绍的差不多了,这一篇介绍一些3d游戏中的概念,它们也和底层有一些关系,也是游戏中常用的一些封装。

当我们要在屏幕上绘制简单的图形时,我们直接计算点的坐标就可以,但是游戏世界中经常有些复杂的模型,例如房子汽车等,这些模型一般是用建模工具制作出来,并且导出数据到指定文件中,然后我们游戏中在读取文件把模型渲染出来,一般比较有名的建模工具包括3dmax,maya等等,推荐一个免费建模工具-blender,文档和教程也都比较多,也相对轻量化,程序员们都可以尝试一下,地址:https://www.blender.org/,中文社区:http://www.blendercn.org/。

关于cocos2d-x读取3d模型文件的方法之前也都介绍过,这里不再赘述,可以参考文章:http://blog.csdn.net/bill_man/article/details/48396719,我们用Spirte3D这个类来读取相关的模型,并在游戏中使用,它的使用方式和正常的node一样

auto ship = Sprite3D::create("Sprite3DTest/boss1.obj");ship->setScale(5);ship->setTexture("Sprite3DTest/boss.png");ship->setnormalizedposition(Vec2(.5,.5));ship->setRotation3D(Vec3(90,0));ship->setForceDepthWrite(true);
目前的Spirte3D功能已经相对完整了,还包含异步加载等功能,观察Spirte3D的源码,我们发现组成它的除了骨骼外,还有一个叫网格的(Mesh),这是一个3d模型的基本单位,一个模型可能有多个网格组成:
Skeleton3D*                  _skeleton; //骨骼Vector<MeshVertexData*>      _meshVertexDatas;//网格数据std::unordered_map<std::string,AttachNode*> _attachments;BlendFunc                    _blend;//混合方法Vector<Mesh*>              _meshes;//网格
一个网格就是一个模型的绘制单位,网格数据包含贴图信息和顶点信息,在cocos2d-x的网格类中包含皮肤,光照uniform等信息,可以通过getMeshByIndex或者getMeshByname等方法获得具体的网格,可以对模型的部分网格进行特定的 *** 作从而达到特定的效果,例如可以控制某个网格的显示与否:

_sprite3d->getMeshByname("Girl_UpperBody02")->setVisible(false);

材质是一个集合概念,它包含色彩,纹理,光照的反射率等等,甚至包含使用的shader文件名等等,它让我们不用使用硬编码去实现不同的渲染效果,cocos2d-x中使用PropertIEs和Material类定义材质:

//定义材质auto propertIEs = PropertIEs::createNonRefCounted("Materials/auto_binding_test.material#sample");PrintPropertIEs(propertIEs,0);Material *mat1 = Material::createWithPropertIEs(propertIEs);//使用材质auto spriteBlur = Sprite::create("Images/grossini.png");spriteBlur->setnormalizedposition(Vec2(0.2f,0.5f));this->addChild(spriteBlur);spriteBlur->setGLProgramState(mat1->getTechniqueByname("blur")->getpassByIndex(0)->getGLProgramState());
材质是这样一个概念,它好比你模型的“衣服”,定义着你的模型的显示,却不能单独的显示,必须附着在模型上才有效。
technique blur{    pass 0    {	shader	{	     defines = THIS_IS_AN_EXAMPLE 1;TOMORROW_IS_HolIDAY 2	     vertexShader = Shaders/example_Simple.vsh	     fragmentShader = Shaders/example_Blur.fsh	     // Uniforms	     sampleNum = 5	     resolution = 100,100	     // auto bindings	     blurRadius = DYNAMIC_RADIUS        }    }}
上面就是一个材质,它定义了shader文件,也定义了一些传给shader的uniform值,实现了逻辑和参数的分离,使得shader可以被重用。


能力不足,水平有限,如有错误,欢迎指出。

总结

以上是内存溢出为你收集整理的cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质全部内容,希望文章能够帮你解决cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1080390.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存