在着色器简介我们了解了着色器的基本概念,Galacean 引擎基于着色器程序,将其他渲染相关的信息进行了统一封装,形成了 Shader 对象。Shader 对象和 材质 共同决定了被渲染物体最终的渲染结果。
Shader 对象包含以下内容:
Shader 实例对象名。Shader 对象创建后会被引擎缓存,后续复用可以通过 Shader.find()
以 Shader.name
为索引进行查找,因此,引擎规定在单个引擎实例下,Shader 的 name 属性必须唯一。
一个 Shader 对象包含至少一个 SubShader 对象。
一个着色器程序可能会运行在不同的 GPU 硬件平台、不同的渲染管线中,因此 Shader 对象通过 tags 键值对的方式为不同的硬件平台、渲染管线指定不同的渲染逻辑,即 SubShader 对象。
SubShader 包含以下内容:
Tags 是用于被渲染管线消费的 key-value 键值对,通常用于指定 Shader 兼容的硬件平台、渲染管线等信息,当前引擎内置管线消费的 Tags 有
Key | value |
---|---|
pipelineStage | Forward |
pipelineStage | DepthOnly |
pipelineStage | ShadowCaster |
pipelineStage | DepthOnly |
此外还可以通过 Camera.setReplacementShader,指定渲染管线的replacementTag
,实现对设置指定 Tag
的 SubShader
替换的目的。
Tags 可以通过 SubShader.setTag 和 ShaderPass.setTag进行指定,ShaderLab 指定 Tag 方式详见文档
一个 SubShader 包含至少一个 ShaderPass 对象。
SubShader 下所有 ShaderPass 共享的 RenderState 渲染状态
ShaderPass 封装了具体的着色器程序,以及执行最终渲染时的渲染状态。
同一 SubShader 下的 ShaderPass 按照数组顺序依次渲染,渲染效果逐步叠加,形成 Shader 在当前帧的最终渲染结果。