美文网首页Cocos Creator随笔-生活工作点滴
cocos creator 2.1版本Material材质系统解

cocos creator 2.1版本Material材质系统解

作者: 正向反馈 | 来源:发表于2019-07-10 23:53 被阅读5次

ProgramLib(Shader库)

管理与缓存shader源码与编译后的shader引用
_templates 关联shader_nameshader源码(vert, frag, defines)。显而易见,shader_name要求全局唯一。
_cache缓存编译后的shader引用。因为支持宏, 不同的宏配置,就对应了单独的shader源码,
不同的宏配置编译出不一样的program,所以_cachekey为元组(shader_name, defines)计算得到。

Pass(渲染)

Pass通过programName绑定shader,并记录一些webgl的状态:

  • cullMode 剔除模式
  • blend 混合模式
  • depth 深度测试开关
  • stencil 模板测试配置

详见 engine\cocos2d\core\renderer\render-engine.js:10322

Stage

是不是类比于UnityRendering Mode?
如果是的话,2d游戏,stage基本上都是设为transparent就可以了

Technique(技术)

Technique管理1到多个pass. 多个pass的意义在于多通道渲染一组模型。 描边或许算是一种应用场景?
Technique也提供了pass中用到的uniform变量的名称、类型、大小和值的管理。
Technique设定Stages,可为渲染顺序提供参考,通常设为transparentstages为数组类型,passes也是数组类型,是否存在一一对应的关系?
_layer不知道作用

Effect(表现)

关联多个Technique
配置uniform属性值

Effect.prototype.setProperty(name, value)
Effect.prototype.getProperty(name)

配置shader

Effect.prototype.getDefine(name)
Effect.prototype.define(name, value)

注意 defines要求在构造函数中给出,后续define的值可以变,但属性没办法直接调用define函数动态增减

Material(材质)

关联一个Effect
管理 _texIds:

_texIds: ids collected from texture defines

维护一个更新哈希值_hash。材质数据有变化时,需要调用updateHash更新哈希。

作用

上述可知,Material,Effect,Technique,Pass都只是数据容器而已,具体如何使用,就是渲染函数的责任了。

网上的资料讲,OGRE的材质系统分成三层抽象:Material,Technique, Pass. Unity的材质系统也是三层:Shader,SubShader,Pass。多Pass实现同一模型,调用多次渲染。多Technique方便作低中高质量切换,Material存放配置数据。
cocos creator的材质系统多出个Effect,现在还是比较不理解。

渲染流程

渲染相关类:

class Base;
class ForwardRenderer extends Base;

render-engine.js中定义了唯一一个stage:transparent.并在ForwardRenderer中注册了transparentstage的渲染函数_transparentStage

渲染入口函数为ForwardRenderer.prototype.render,遍历所有相机,为每个相机调用一次ForwardRenderer.prototype.renderCamera(camera, scene)。然后跳入Base._render,清除设备,从scene._modelsextractDrawItem,遍历每个drawItem,从effect.getTechnique(stage)中得到tech。最后调用_transparentStage
_transparentStage设定下矩阵,又回到Base._draw函数中,执行真正的渲染。
Base._draw根据Effect,Technique,Pass的数据,得到shader,并为shader设置好webgl状态和各个Uniform变量,最后调用device.draw完成一个渲染流程。

根据渲染流程,可推测,cocos creator的材质系统也是三层:Effect,Technique,PassMaterial继承Asset,对Effect作进一步封闭, 是为了方便编辑器?

详见 engine\cocos2d\core\renderer\render-engine.js:13303engine\cocos2d\core\renderer\render-engine.js:13677

相关文章

网友评论

    本文标题:cocos creator 2.1版本Material材质系统解

    本文链接:https://www.haomeiwen.com/subject/nydkkctx.html