Standard 标准物理光照渲染

Standard 材质基于标准的 PBR 进行实现。

PBR(Physically Based Rendering) 是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。

end

使用 PBR 的优势

  • 基于物理模型与数学推演带来的效果的 真实
  • 艺术导向性的、标准化的美术参数带来的 易用效果一致

xr-frame 使用 PBR 有以下两种方式

  1. 使用带光照材质的 glTF 资源,目前主流的各类 DCC工具 (Digital Content Create) 都可以产出这种业界通用的格式。
  2. 使用内置的 standard 创建材质,并设置所需的不同 uniform 来进行对应渲染。

创建 standard 材质进行渲染

使用 standard 材质进行渲染时,可以设置以下的 uniform 来决定渲染效果。

各系数的美术意义可以参考 创建PBR纹理实用指南

基础色 (baseColor)

uniforms 类型 备注 默认值
u_baseColorMap texture 颜色贴图,颜色空间为 SRGB 默认未使用
u_baseColorFactor vec4 颜色因子,颜色空间为 SRGB 1, 1, 1, 1

基础色表示物体的 表面颜色PBR 中可以认为影响 电介质(非金属)漫反射 与 金属反射率值。

vec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);
// 若设定基础色贴图
baseColor *= SRGBtoLINEAR(u_baseColorMap);
// 若设定基础色因子,glTF情况下,传入LINEAR空间颜色,不进行颜色空间转化
baseColor *= SRGBtoLINEAR(u_baseColorFactor);
// 若设定顶点色
baseColor *= vec4(v_Color, 1.0);

基础色贴图:左侧为只有基础色效果;右侧为基础色贴图 baseColor

金属度粗糙度 (metallic rougness)

uniforms 类型 备注 默认值
u_metallicRoughnessMap texture 金属粗糙度贴图,g 部分为粗糙度,b 部分为金属度 默认未使用
u_metallicMap texture 金属度贴图,未使用金属粗糙度贴图时才生效 默认未使用
u_roughnessMap texture 粗糙度度贴图,未使用金属粗糙度贴图时才生效 默认未使用
u_metallicRoughnessValues vec2 金属粗糙度因子,第一位为金属度,第二位为粗糙度 0, 1
u_ior float 折射率,默认值可以认为类似塑料折射率 1.5

金属度 表示 哪些区域是粗金属(0=电介质,1=金属),影响 电介质模型 与 金属模型 的 线性混合

粗糙度 表示 表面粗糙度,控制 漫反射和镜面反射

IOR 表示 折射率,控制材质的 F0,即0度角入射的菲涅尔反射值。

float metallic = u_metallicRoughnessValues.b; // 默认值 0.0,glTF 为 1.0
float roughness = u_metallicRoughnessValues.g; // 默认值 1.0
// 若设定金属度粗糙度贴图
metallic *= metallicRoughnessMap.b;
roughness *= metallicRoughnessMap.g;
// F0
f0 = min( pow2( ( u_ior - 1.0 ) / ( u_ior + 1.0 ) ) * specularColorFactor;

金属度粗糙度:左上角为金属度效果图,左下角为粗糙度效果图,数值0为黑色,数值1为白色;右侧为金属粗糙度贴图,g 部分为粗糙度,b 部分为金属度。 metallic

法线 (Normal)

uniforms 类型 备注 默认值
u_normalMap texture 法线贴图 默认未使用
u_normalScale float 法线贴图缩放,需使用法线贴图才生效 1

法线 可以认为是 垂直于顶点表面 的(单位)向量。于顶点数据中传入,用于 PBR 中光照相关的各类运算。

法线贴图 可以理解为一种高度贴图,用于模仿表面细节。贴图中的每个像素,代表切线空间中,将法线处理为真实法线的偏差处理。

使用法线贴图的情况下,需要传入顶点Tangent才能生效。

float normal = vNormal;
// 如果使用法线贴图,需要保证存在 vNormal 与 vTangent 以算出vTBN
mat3 vTBN = mat3( tangent, bitangent, normal );
normal = normalize( vTBN * normalMap );

法线:左侧图片为世界空间中法线效果,右侧为法线贴图。 normal

自发光 (Emissive)

uniforms 类型 备注 默认值
u_emissiveMap texture 自发光贴图,颜色空间为 SRGB 默认未使用
u_emissiveFactor vec3 自发光贴图因子,颜色空间为 LINEAR 0, 0, 0

自发光 表示了材质作为光源向外发送的颜色信息,颜色空间为 SRGB

vec4 emissiveColor = u_emissiveFactor;
// 若设定自发光贴图
vec4 emissiveColor *= SRGBtoLINEAR(u_emissiveMap);

自发光:左侧图片为只有自发光的效果,右侧图片为自发光贴图。 emissive

环境光遮蔽 (Ambient occlusion)

uniforms 类型 备注 默认值
u_occlusionMap texture 环境光遮蔽贴图 默认未使用
u_occlusionStrength float 环境光遮蔽贴图强度,需使用遮蔽贴图才生效 1

环境光遮蔽 指表面某点能获得多少环境中的光。该贴图只影响漫反射分配,不影响高光反射分配。

// 若设定遮蔽贴图
float ao = u_occlusionMap;
// 若设定遮蔽贴图 与 遮蔽因子
ao *= u_occlusionStrength;

环境光遮蔽:左侧图片为默认PBR渲染效果,右侧图片为环境光遮挡显示效果,0为完全遮蔽,1为完全不遮蔽。 ao

透明剔除 (alphaCutoff)

uniforms 类型 备注 默认值
u_alphaCutoff float 透明剔除阈值,当 baseColor 的 alpha 小于 u_alphaCutoff 时,不进行绘制,alphaModeMASK 的情况下才生效 0.5

透明剔除 用于进行透明度剔除。当alphaModeMASK 的情况下,会不渲染 baseColor 的 alpha 小于 u_alphaCutoff 的像素。

如需使用透明剔除,需手动设置宏 WX_USE_ALPHA_CUTOFF或设置渲染状态使用。

透明剔除:左侧图片为开启alphaCutoff效果,右侧图片为未使用alphaCutoff效果。 alphacutoff

清漆效果 (clearcoat)

uniforms 类型 备注 默认值
u_clearcoatFactor float 清漆强度 0
u_clearcoatRoughnessFactor float 清漆粗糙度 0

清漆效果 可以认为是往物体表面添加透明涂层。

如需使用清漆效果,需手动设置宏 WX_USE_CLEARCOAT

清漆强度:左侧图片为使用clearcoat效果,右侧图片为未使用clearcoat效果 clearcoat

高光反射与光泽度 (specularGlossiness)

uniforms 类型 备注 默认值
u_specularFactor vec3 高光反射因子 1, 1, 1
u_glossinessFactor float 光泽度 1.0
u_specularGlossinessMap texture 高光光泽贴图,其中rgb部分是高光反射,a部分为光泽度 默认未使用

高光反射与光泽度PBR 的另外一种渲染流程,相对于金属度粗糙度流程,该流程可以在高光反射贴图中控制F0。其中 光泽度 相当于(1 – 粗糙度)。

漫反射部分 的 diffuse 因子与贴图可以直接使用 基础色 basecolor 相关参数。

如需使用高光反射与光泽度流程,需手动设置宏 WX_USE_SPECULARGLOSSINESS

高光反射与光泽度:左侧为使用高光反射与光泽度流程模型的渲染效果;右上为diffuse贴图(baseColorMap);右下为specularGlossiness贴图,其中rgb部分为高光反射,a部分为光泽度。 specularGlossiness

standard 参数定义

  • 基础色相关 basecolor
  • 金属度粗糙度相关 metallic rougness ior
  • 法线相关 normal
  • 自发光相关 emissive
  • 环境光遮蔽相关 ambient occlusion
  • 透明剔除相关 alphacutoff
  • 清漆效果相关 clearcoat
  • 高光反射与光泽度相关 specular glossiness
  • 透射 transmission (TODO)
  • 体积渲染 volume (TODO)

standard 宏定义

说明 类型
WX_MANUAL_LINEAR_BASECOLORFACTOR 基础色因子是否使用 Linear空间 bool
WX_USE_BASECOLORMAP 是否使用基础色贴图,使用u_baseColorMap后会自动设为true bool
WX_USE_METALROUGHNESSMAP 是否使用金属粗糙度贴图,使用u_metallicRoughnessMap后会自动设为true bool
WX_USE_EMISSIVEMAP 是否使用自发光贴图,使用u_emissiveMap后会自动设为true bool
WX_USE_OCCLUSIONMAP 是否使用遮挡贴图,使用u_occlusionMap后会自动设为true bool
WX_USE_COLOR_0 是否使用第一位顶点色 bool
WX_USE_ALPHA_CUTOFF 是否使用透明剔除 bool
WX_USE_CLEARCOAT 是否使用清漆效果 bool
WX_USE_SPECULARGLOSSINESS 是否使用高光反射与光泽度渲染流程 bool
WX_USE_SPECULARGLOSSINESSMAP 是否使用高光反射与光泽度渲染贴图,使用u_specularGlossinessMap后会自动设为true bool

standard 默认渲染状态

"renderStates": {
  cullOn: true,
  blendOn: false,
  depthWrite: true,
  cullFace: Kanata.ECullMode.BACK
}

具体渲染状态细节可以参考 材质支持渲染状态列表。

使用glTF渲染

参照 glTF 文档使用。

使用Mesh渲染

<xr-assets>
  <!-- 加载外部环境配置 -->
  <xr-asset-load type="env-data" asset-id="env1" src="/assets/env-hdr/data.bin" />

  <!-- 加载外部贴图 -->
  <xr-asset-load type="texture" asset-id="gold-albedo" src="/assets/material/gold/albedo.png" />
  <xr-asset-load type="texture" asset-id="gold-metallic" src="/assets/material/gold/metallic.png" />
  <xr-asset-load type="texture" asset-id="gold-roughness" src="/assets/material/gold/roughness.png" />
  <xr-asset-load type="texture" asset-id="gold-ao" src="/assets/material/gold/ao.png" />

  <!-- 加载standard材质 -->
  <xr-asset-material asset-id="standard-mat" effect="standard" />
</xr-assets>

<!--
  设置环境数据,配置对应的IBL(漫反射与镜面反射)
  使用外部配置
    env1
  使用内置配置 
    xr-frame-team-workspace-day
    xr-frame-team-workspace-day2
    xr-frame-team-workspace-night
-->
<xr-env env-data="env1"/>

<!--
  添加 圆体
  使用 standard-mat 材质
  设置 金属度因子为1,粗糙度因子为1
  设置 不同类型的贴图
  设置 渲染状态 cullOn 为 false
  ...
-->
<xr-mesh
  node-id="mesh-sphere" geometry="sphere"
  material="standard-mat"
  uniforms="
    u_metallicRoughnessValues: 1 1,
    u_baseColorMap: gold-albedo,
    u_metallicMap: gold-metallic,
    u_roughnessMap: gold-roughness
  "
  states="cullOn: false"
></xr-mesh>

glTF Resource from SketchFab by @re1monsen @theblueturtle_ @Bastien Genbrugge @Willy Decarpentrie @Martin Trafas

Simple 无光照渲染

Simple 材质基于最基本的 无光照 情况进行实现。

使用该材质渲染的物体,不受任何光源影响,渲染性能最高

simple

simple 参数定义

名称 类型 备注 默认值
u_baseColorMap texture 颜色贴图,颜色空间为 SRGB 默认未使用
u_baseColorFactor vec4 颜色因子,颜色空间为 SRGB 1, 1, 1, 1

simple 宏定义

说明 类型
WX_USE_BASECOLORMAP 是否使用基础色贴图,使用u_baseColorMap后会自动设为true bool

使用glTF渲染

参照 glTF 文档使用 Unlit 材质资源即可。

使用Mesh渲染

<!-- 加载simple材质 -->
<xr-asset-material asset-id="simple-mat" effect="simple" />
<!--
  添加 圆体
  默认使用 simple 材质
  设置 颜色因子为 红色
-->
<xr-mesh
  node-id="mesh-sphere" geometry="sphere"
  material="simple-mat"
  uniforms="
    u_baseColorFactor: 1 0 0 1
  "
></xr-mesh>

内置效果和定义

框架内置了一些效果资源。

内置效果

目前除去内部效果之外,暴露给开发者会使用的效果有两个:

  1. 简单无光照效果 simple
  2. 标准物理渲染效果 standard

在内置的之外,开发者还可能会自定义效果,这里就可能会用到一些内置的uniforms、宏和着色器方法,我们将其列举如下:

内置Uniforms和宏

框架内置了一些uniforms和宏,便于开发者使用,它们分为以下几个大类:

基础

类型 说明
是否为蒙皮网格 WX_SKINNED 布尔值
骨骼数量 WX_BONE_NUM 整数
是否使用骨骼数据纹理 WX_USE_BONE_MATRIX_TEXTURE 布尔值
类型 uniforms 说明
视图矩阵 u_view 4×4矩阵
投影矩阵 u_projection 4×4矩阵
世界矩阵 u_world 4×4矩阵
视图投影矩阵 u_vp 4×4矩阵
视图逆矩阵 u_viewInverse 4×4矩阵
游戏时间戳 u_gameTime 浮点数
骨骼偏移矩阵 u_boneOffsetMatrix 4×4矩阵数组(大小由宏决定)
骨骼矩阵太大时,转换为的贴图 u_boneMatrixTexture 2D纹理

图元数据相关

图元数据相关的主要是创建几何数据时定义的那些attributes,由usage决定,每中usage对应唯一的宏,比如:

xrFrameSystem.EVertexLayoutUsage.NORMAL对应于WX_USE_NORMAL

后处理相关

主要是要注意开了后处理时,前置的渲染流程需要保证输出是线性的,可能要视情况removeGamma

vec3 removeGammaCorrection(vec3 color) {
  return pow(color, vec3(2.2));
}
类型 说明
是否开启了后处理 WX_PP_ACTIVE 布尔值

光照和阴影相关

可见灯光相关部分。

环境相关

可见环境相关部分。

内置着色器方法

@todo

内置纹理资源

微信小程序框架内置了一些纹理资源。

普通纹理

资源id 描述
white 白色
transparent 白色透明
black 黑色
red 红色
green 绿色
blue 蓝色
yellow 黄色
babyblue 淡蓝色
babygreen 淡绿色
babyred 淡红色
brdf-lut
uv-debug

立方体纹理

资源id 描述
white 白色
transparent 白色透明
black 黑色
red 红色
green 绿色
blue 蓝色
yellow 黄色
babyblue 淡蓝色
babygreen 淡绿色
babyred 淡红色

内置几何数据

我们提供了几个内置的几何数据,均拥有UV、法线和切线:

资源id 描述 尺寸
cube 立方体 原点在中心,大小为1x1x1
sphere 球体 原点在中心,半径为1
plane 平面 原点在中心,一个xz平面,大小为1×1
cylinder 圆柱 原点在中心,半径为1,高度为2

内置 Geometry 使用缩放为1的 xr-mesh 的渲染效果

geometry

<!-- wxml 代码示例 -->
<!-- plane -->
<xr-mesh node-id="mesh-plane" position="1 0 1" rotation="0 0 0" scale="1 1 1" geometry="plane" uniforms="u_baseColorFactor:0.6 0.8 0.6 1"></xr-mesh>
<!-- cube -->
<xr-mesh node-id="mesh-cube" position="1 0 -1" scale="1 1 1" rotation="0 0 0" geometry="cube" uniforms="u_baseColorFactor:0.298 0.764 0.85 1, u_metallicRoughnessValues: 0.0 0.0"></xr-mesh>
<!-- sphere -->
<xr-mesh node-id="mesh-sphere" position="-1 0 -1" scale="1 1 1" geometry="sphere"  uniforms="u_metallicRoughnessValues: 0 0"></xr-mesh>
<!-- cylinder -->
<xr-mesh node-id="mesh-cylinder" position="-1 0 1" scale="1 1 1" geometry="cylinder" uniforms="u_baseColorFactor:1 0.776 0.364 1, u_metallicRoughnessValues: 0.0 0.0"></xr-mesh>

内置环境数据

微信小程序框架内置了一些环境数据资源。

资源id 描述 预览
xr-frame-team-workspace-day xr-frame团队工作地,白天
xr-frame-team-workspace-night xr-frame团队工作地,夜晚
xr-frame-team-workspace-day2 xr-frame团队工作地2,白天
gz-haixinsha 广州海心沙,下午

录制画布

在基础库版本v3.1.1之后,分享系统提供了如下方式来录制:

// 录制配置,以下是默认值
// 这里建议根据实际情况,等比缩放`width`和`height`,防止丢帧
const options: XrFrame.IShareRecordOptions = {
  fps: 30,
  width: scene.width,
  height: scene.height,
  videoBitsPerSecond: 1000
};

// 启动录制
await scene.share.recordStart(options);

// 暂停录制
await scene.share.recordPause(options);

// 唤醒录制
await scene.share.recordResume(options);

// 停止录制,并保存到临时文件
const tempFilePath = await scene.share.recordFinishToTempFile(options);

// 停止录制,直接保存到相册
await scene.share.recordFinishToAlbum(options);

// 可以获取录制状态,来做用户提示
if (scene.share.recordState === xrFrameSystem.EShareRecordState.Recording) {
  ......
}

截取画布

分享系统提供了三种方式来截图:

// 判断当前客户端是否支持分享系统
const supported = scene.share.supported;

// 截取配置,可选`type`为`jpg`或`png`,在为`jpg`时,可配置`0~1`的`quality`
// 以下是默认值
const options: XrFrame.IShareCaptureOptions = {
  type: 'jpg',
  quality: 0.8
};

// 在鸿蒙上有BUG,已弃用,请使用下方异步接口!
const base64 = scene.share.captureToDataURL(options);
// 基础库`3.0.2`以上新增的异步接口,获取原始的`base64`字符串
const base64 = await scene.share.captureToDataURLAsync(options);

// 在鸿蒙上有BUG,已弃用,请使用异步接口!
const buffer = scene.share.captureToArrayBuffer(options);
// 基础库`3.0.2`以上新增的异步接口,直接获取转换后的`ArrayBuffer`
const buffer = await scene.share.captureToArrayBufferAsync(options);

// 获取本地路径的分享图片
// 第一个方法来处理本地路径,结束后释放文件
// 此回调在`2.27.3`基础库以及之前时是异步,之后兼容同步和异步
// 在基础库`3.0.2`之后,为异步接口
await scene.share.captureToLocalPath(options, fp => {});

// 直接唤起分享图片给好友
// 在基础库`3.0.2`之后,为异步接口
await scene.share.captureToFriends(options);

唤起分享给好友的结果如下:

其他属性和动画

基于不同渲染模式的渲染

RenderMode不进行设置的前提下,无论相机如何转动,所有粒子永远正对着屏幕。

这里通过render-mode字段进行控制,示例如下:

<xr-particle id="colorGradient" position="2 0 -2" render-mode="off" capacity="20" emit-rate="5" life-time="3" emitter-type="BoxShape"></xr-particle>

渲染模式字段相关变量介绍

名称 备注
off 是否启用公告板渲染
default 默认公告板渲染模式,粒子始终正对屏幕
y Y轴渲染模式,粒子Y轴将锁定,其它轴的显示正对屏幕
stretched 拉伸渲染模式,将附带一些旋转,使粒子朝向其运动方向
mesh 粒子将以指定网格渲染,与粒子系统中的mesh字段搭配

可以通过代码调用禁用公告板渲染,粒子将保持它自己的位置,面片的显示不会随着相机旋转而进行调整:

  particleComponent.useBillBoard = false

要设定公告板模式,首先要启用useBillBoard,并对billboardMode进行设置,这里以”BILLBOARDMODE_Y”为例:

  particleComponent.useBillBoard = true
  particleComponent.billboardMode = BillBoardMode.BILLBOARDMODE_Y || 1

支持色彩取样构建

粒子系统目前支持基于alpha值,在色彩梯度渐变图上进行采样,从而更改粒子的颜色。要启用此功能,首先将useRampGradients置为true。

通过如下示例,构建自定义色彩取样表:

  particleComponent.useRampGradient = true;
  particleComponent.addRampGradient(0.0, Vector3.createFromNumber(1, 1, 1));
  particleComponent.addRampGradient(0.2, Vector3.createFromNumber(0.8, 0.8, 0.05));
  particleComponent.addRampGradient(0.4, Vector3.createFromNumber(0.86, 0.5, 0.05));
  particleComponent.addRampGradient(0.6, Vector3.createFromNumber(0.75, 0.18, 0.07));
  particleComponent.addRampGradient(0.8, Vector3.createFromNumber(0.45, 0.08, 0.06));
  particleComponent.addRampGradient(1, Vector3.createFromNumber(0.05, 0.05, 0.05));

最终粒子将根据自身alpha值,在取样表中采取对应的色彩。

通过如下示例,也可以在生命周期的不同阶段,指定alpha值的变化范围,影响对色彩渐变图的采样。

例如:0.2秒时,因为此时的采样范围为[0.1, 0.8],粒子alpha值小于等于0.1时视为0,当大于等于0.8时视为1,在区间内值映射为(alpha-0.1)/0.8。

  particleComponent.addColorRemapGradient(0, 0, 0.1);
  particleComponent.addColorRemapGradient(0.2, 0.1, 0.8);
  particleComponent.addColorRemapGradient(0.3, 0.2, 0.85);
名称 类型 备注 默认值
useRampGradients boolean 是否启用色彩梯度取样 false

相关方法

addRampGradient

名称 类型 备注
gradient number 在指定位置设置对应色彩,该值与(1-粒子alpha值)对应,取值范围[0~1]
color Vector3 色彩RGB值

addColorRemapGradient

名称 类型 备注
time number 指定粒子生命周期的阶段
min number alpha值左区间
max number alpha值右区间

粒子属性的动态变化

粒子在运动过程中,可以定制对其大小、颜色、速度的动态变化。

本粒子系统同时内置有关粒子大小的控制方法addSizeGradient,用法如下:

  particleComponent.addSizeGradient(0,1);
  particleComponent.addSizeGradient(0.5,0.8);
  particleComponent.addSizeGradient(0.75,0.3,0.5);
  particleComponent.addSizeGradient(1,0);

调用addColorGradient支持带有alpha通道的颜色过渡:

    particleComponent.addColorGradient(0, Vector4.createFromNumber(1,1,1,0));
    particleComponent.addColorGradient(0.3, Vector4.createFromNumber(0.3,1,1,0.5),Vector4.createFromNumber(0.2,0,0.6,0.5),);
    particleComponent.addColorGradient(1, Vector4.createFromNumber(0,1,1,1));

调用addAlphaGradient可以专门调整透明度的过渡:

    particleComponent.addAlphaGradient(0,0);
    particleComponent.addAlphaGradient(0.3,0.3, 0.5);
    particleComponent.addAlphaGradient(1,1);

调用addSpeedScaleGradient动态改变粒子运动过程中的速度大小:

    particleComponent.addSpeedScaleGradient(0,0);
    particleComponent.addSpeedScaleGradient(0.3,0.5, 1);
    particleComponent.addSpeedScaleGradient(1,2);

相关方法

addSizeGradient

参数 类型 描述
gradient number 指定所处粒子生命周期的阶段
sizeScale number 指定粒子大小的左区间
sizeScale2 number 指定粒子大小的右区间[可选]

其中gradient统一取值范围为[0,1]间,表示相对粒子生命周期的占比,如0.1,即指定粒子在0.1 * lifeTime的时刻;sizeScalesizeScale2值的大小为相对于粒子系统属性中scale配置的值,如sizeScale为2,则粒子体积大小为size * 2。

addColorGradient

参数 类型 描述
gradient number 指定所处粒子生命周期的阶段
color Vector4 指定粒子颜色的左区间
color2 Vector4 指定粒子颜色的右区间[可选]

addAlphaGradient

参数 类型 描述
gradient number 指定所处粒子生命周期的阶段
alpha number 指定粒子颜色透明度的左区间
alpha2 number 指定粒子颜色透明度的右区间[可选]

addSpeedScaleGradient

参数 类型 描述
gradient number 指定所处粒子生命周期的阶段
speed number 指定粒子速度的左区间
speed2 number 指定粒子速度的右区间[可选]

gradient number 指定所处粒子生命周期的阶段 speedScale number 指定粒子速度的左区间 speedScale2 number 指定粒子速度的右区间[可选]

speedScalespeedScale2值的大小为相对于粒子系统属性中speed配置的值,如speedScale为2,则粒子速度大小为speed * s2

动画粒子

首先我们需要创建一个图集资源,如实例所示,命名此资源名为”particle-atlas”:

    <xr-asset-load type="atlas" asset-id="particle-atlas" src="/path/to/atlas.json" />
    <xr-particle capacity="100" size="2" emit-rate="12" life-time="4" angle="0 360" atlas="particle-atlas" atlas-frames="frame-name" atlas-speed="4" atlas-random="true" atlas-loop="true"></xr-particle>

粒子将从图集依次序取出对应纹理样式进行渲染

  • atlas-random:决定默认的纹理从第一张开始或者是随机
  • atlas-frames:指定图集中特定的纹理名字参与渲染
  • atlas-speed:将控制纹理的变化速度
  • atlas-loop:决定当轮转到图集最后一张纹理时,是否回到第一张纹理开始渲染

子发射器

目前系统支持构建子发射器,可以通过构建子发射器实现类似的烟花绽放的粒子效果。 示例如下,为子发射器构建参数的过程与粒子系统的构建基本一致,可以参考粒子系统的相关参数介绍。

 <xr-asset-load type="texture" asset-id="particlePoint" src="xxx" /> <!-- xxx为纹理的url -->
   var myData ={}
    myData = {
      "capacity": 10,
      "emitRate": 5,
      "size":[0.1],
      "startColor":[1,1,0,1],
      "endColor":[1,1,0,1],
      "emitterType":"SphereShape",
      "emitterProps": [["radius","0.1"]],
      "stopDuration":3,
      "lifeTime":[3],
      "texture":"particlePoint", // xxx为纹理的url
      "speed":[0.5],
    }
    const particleSystemElement = xrScene.getElementById("xxxx"); // xxx为粒子系统的id命名
    tempSystem = particleSystemElement.getComponent(xrFrameSystem.Particle)
    var subEmitter = this.createSubEmitter(myData)
    subEmitter.state = 0
    //可以规定多个子发射器的阵列
    particleComponent.subEmitters = [subEmitter]

myData的配置所示,调用createSubEmitter创建一个子发射器,具体参数类型参考粒子系统的相关参数介绍:

相关属性

SubEmitterState

参数 类型 描述 默认值
ATTACH number 指定发射器为附加类型 0
END number 指定发射器为粒子结束时生成 1

SubEmitterState.ATTACH
当一个粒子产生时,从子发射器阵列中随机选择一种并附加到新粒子上,用于在新粒子上创建拖尾粒子效果。

SubEmitterState.END
当粒子灭亡时,从子发射器阵列中随机选择一种进行克隆并渲染,用于在新粒子上创建收尾特效。