框架内置了一些图集资源。
普通纹理
|名称|资源id|帧名|描述|
|—|—|—|
|数字|numbers|0~9|
|
框架内置了一些图集资源。
|名称|资源id|帧名|描述|
|—|—|—|
|数字|numbers|0~9|
|
Standard 材质基于标准的 PBR 进行实现。
PBR(Physically Based Rendering) 是指使用基于物理原理和微平面理论建模的着色/光照模型,以及使用从现实中测量的表面参数来准确表示真实世界材质的渲染理念。

使用 PBR 的优势
真实。易用 与 效果一致。xr-frame 使用 PBR 有以下两种方式
DCC工具 (Digital Content Create) 都可以产出这种业界通用的格式。standard 创建材质,并设置所需的不同 uniform 来进行对应渲染。使用 standard 材质进行渲染时,可以设置以下的 uniform 来决定渲染效果。
各系数的美术意义可以参考 创建PBR纹理实用指南。
| 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);
基础色贴图:左侧为只有基础色效果;右侧为基础色贴图

| 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 部分为金属度。

| 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 );
法线:左侧图片为世界空间中法线效果,右侧为法线贴图。

| uniforms | 类型 | 备注 | 默认值 |
|---|---|---|---|
| u_emissiveMap | texture | 自发光贴图,颜色空间为 SRGB | 默认未使用 |
| u_emissiveFactor | vec3 | 自发光贴图因子,颜色空间为 LINEAR | 0, 0, 0 |
自发光 表示了材质作为光源向外发送的颜色信息,颜色空间为 SRGB。
vec4 emissiveColor = u_emissiveFactor;
// 若设定自发光贴图
vec4 emissiveColor *= SRGBtoLINEAR(u_emissiveMap);
自发光:左侧图片为只有自发光的效果,右侧图片为自发光贴图。

| uniforms | 类型 | 备注 | 默认值 |
|---|---|---|---|
| u_occlusionMap | texture | 环境光遮蔽贴图 | 默认未使用 |
| u_occlusionStrength | float | 环境光遮蔽贴图强度,需使用遮蔽贴图才生效 | 1 |
环境光遮蔽 指表面某点能获得多少环境中的光。该贴图只影响漫反射分配,不影响高光反射分配。
// 若设定遮蔽贴图
float ao = u_occlusionMap;
// 若设定遮蔽贴图 与 遮蔽因子
ao *= u_occlusionStrength;
环境光遮蔽:左侧图片为默认PBR渲染效果,右侧图片为环境光遮挡显示效果,0为完全遮蔽,1为完全不遮蔽。

| uniforms | 类型 | 备注 | 默认值 |
|---|---|---|---|
| u_alphaCutoff | float | 透明剔除阈值,当 baseColor 的 alpha 小于 u_alphaCutoff 时,不进行绘制,alphaMode 为 MASK 的情况下才生效 | 0.5 |
透明剔除 用于进行透明度剔除。当alphaMode 为 MASK 的情况下,会不渲染 baseColor 的 alpha 小于 u_alphaCutoff 的像素。
如需使用透明剔除,需手动设置宏 WX_USE_ALPHA_CUTOFF或设置渲染状态使用。
透明剔除:左侧图片为开启alphaCutoff效果,右侧图片为未使用alphaCutoff效果。

| uniforms | 类型 | 备注 | 默认值 |
|---|---|---|---|
| u_clearcoatFactor | float | 清漆强度 | 0 |
| u_clearcoatRoughnessFactor | float | 清漆粗糙度 | 0 |
清漆效果 可以认为是往物体表面添加透明涂层。
如需使用清漆效果,需手动设置宏 WX_USE_CLEARCOAT。
清漆强度:左侧图片为使用clearcoat效果,右侧图片为未使用clearcoat效果

| 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部分为光泽度。

| 宏 | 说明 | 类型 |
|---|---|---|
| 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 |
"renderStates": {
cullOn: true,
blendOn: false,
depthWrite: true,
cullFace: Kanata.ECullMode.BACK
}
具体渲染状态细节可以参考 材质支持渲染状态列表。
参照 glTF 文档使用。
<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 材质基于最基本的 无光照 情况进行实现。
使用该材质渲染的物体,不受任何光源影响,渲染性能最高。

| 名称 | 类型 | 备注 | 默认值 |
|---|---|---|---|
| u_baseColorMap | texture | 颜色贴图,颜色空间为 SRGB | 默认未使用 |
| u_baseColorFactor | vec4 | 颜色因子,颜色空间为 SRGB | 1, 1, 1, 1 |
| 宏 | 说明 | 类型 |
|---|---|---|
| WX_USE_BASECOLORMAP | 是否使用基础色贴图,使用u_baseColorMap后会自动设为true | bool |
参照 glTF 文档使用 Unlit 材质资源即可。
<!-- 加载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>
框架内置了一些效果资源。
目前除去内部效果之外,暴露给开发者会使用的效果有两个:
在内置的之外,开发者还可能会自定义效果,这里就可能会用到一些内置的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 |

<!-- 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的时刻;sizeScale与sizeScale2值的大小为相对于粒子系统属性中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 | 指定粒子速度的右区间[可选] |
speedScale与speedScale2值的大小为相对于粒子系统属性中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>
粒子将从图集依次序取出对应纹理样式进行渲染
目前系统支持构建子发射器,可以通过构建子发射器实现类似的烟花绽放的粒子效果。 示例如下,为子发射器构建参数的过程与粒子系统的构建基本一致,可以参考粒子系统的相关参数介绍。
<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
当粒子灭亡时,从子发射器阵列中随机选择一种进行克隆并渲染,用于在新粒子上创建收尾特效。