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

原创 2016年06月15日 16:58:05

       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,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可以被重用。


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

  






版权声明:本文为博主原创文章,未经博主允许不得转载。

15款Cocos2d-x游戏源码

http://blog.okbase.net/iphone/archive/4619.html (1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象...
  • kenkao
  • kenkao
  • 2016年07月01日 22:23
  • 10056

史上最全android cocos2d游戏源码大全

  • 2014年10月06日 17:23
  • 13.21MB
  • 下载

15款Cocos2d-x游戏源码

(1)用cocos2d-x开发的中国象棋游戏源码 使用Cocos2d-X2.2.3开发的一款中国象棋游戏,游戏中可以实现、新局面、悔棋、游戏音乐、胜利后会显示游戏结果。 源码下载:http...
  • Jailman
  • Jailman
  • 2017年11月30日 17:52
  • 11072

Cocos2d游戏源码下载分享

对于很多新手来说,学习游戏开发不仅需要大量的技术文档、教程支持,我觉得一个完整的游戏源码那也是必须的,毕竟实践出真知嘛!遥想当年,为了完成大学每学期的工程实践课程,花了好多时间在网上收刨各种学习资料及...
  • renshan81
  • renshan81
  • 2014年12月05日 12:37
  • 4420

cocos2dx源码大全

  • 2014年05月24日 09:54
  • 3KB
  • 下载

OICQ木马程序源代码

  • 2003年02月25日 00:00
  • 141KB
  • 下载

cocos2D-X源码分析之从cocos2D-X学习OpenGL(4)---混合

之前在项目中就使用过混合,但是研究的不深入,近期美术的一个需求让我下决心重新深入的研究了一下混合以及它在cocos2d-x中的使用,在这里分享给大家。...
  • bill_man
  • bill_man
  • 2015年12月30日 20:12
  • 4024

cocos2dx Material System讲解一

cocos2dx 增加了材料系统,因为之前我深入研究过RenderMonkey这个软件,又深入学习了OpenGl es2.0,所以理解起来还是挺轻松的。但是有些写法还是不太一样,所以在这里记下,和大家...
  • sh15285118586
  • sh15285118586
  • 2015年10月28日 10:25
  • 1095

Cocos2d-x 3.x 图形学渲染系列二十

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》...
  • jxw167
  • jxw167
  • 2017年01月19日 09:36
  • 706

认识 Cocos2dx 3.x

cpp11: 支持了auto标识符, 这样可以大大简化了声明变量的类型 auto标识符: 泛类定义 nullptr 代替 NULL, NULL只代表内存地址位为0, 这样做有时会出问题, cpp11后...
  • zszeng
  • zszeng
  • 2015年09月07日 11:06
  • 1446
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:cocos2D-X源码分析之从cocos2D-X学习OpenGL(20)----模型,网格和材质
举报原因:
原因补充:

(最多只允许输入30个字)