网站做重新做_域名不换_空间想转到新网站这边,免费如何做网页或网站,安徽网站优化,网站的规划与建设案例分析写在前面的话
Sceneform-EQR是基于#xff08;filament#xff09;扩展的一个用于安卓端的渲染引擎。故本文内容对Sceneform-EQR与Filament都适用。
需求场景
在使用Filament加载三维场景的过程中#xff0c;一个3D场景对应加载一个背景纹理。而这样的话#xff0c;即便…写在前面的话
Sceneform-EQR是基于filament扩展的一个用于安卓端的渲染引擎。故本文内容对Sceneform-EQR与Filament都适用。
需求场景
在使用Filament加载三维场景的过程中一个3D场景对应加载一个背景纹理。而这样的话即便有多个3D场景是同一个风格但由于背景颜色不同也需要UI设计师准备不同的背景切图。这不仅仅会造成资源的浪费也会增大UI设计师的工作。
要解决的问题在Filament引擎中采用一份背景切图实现不同3D场景的背景颜色的定制化。
具体步骤
我们要基于Filament材质系统定制一个能够支持背景融合的材质文件。 已知Filament提供了以下参数类型
已知在Filament引擎中获取指定纹理的颜色值的方法如下
从图片纹理“background”获取u,v位置的颜色值的方法。 t1(u,v) texture(materialParams_background, getUV0()) 从视频纹理“video”获取u,v位置的颜色值的方法。 t2(u,v) texture(materialParams_video, getUV0()) 获取颜色纹理的颜色值的方法。 t3(u,v) blendColor 定制支持背景融合的材质文件: 1在已知部分中我们采用t1(u,v) t2(u,v) t3(u,v)来表示三种不同类型纹理的获取纹理坐标为uv的颜色值的方法而在实际的需求中我们为了实现复杂的视觉效果往往会使用更多数量的纹理对象。为了简化后续表述现统一采用T(u,v)代替t1(u,v) t2(u,v) t3(u,v)表示方法来表示获取指定纹理对象的纹理坐标为u,v的颜色值。
2为了控制不同纹理的影响程度我们引入了权重从而实现我们通过调节xi的值就可以达到调节3D场景背景效果的目的。
说明xi表示第i个纹理的权重值n表示用于背景融合的纹理数量wi 表示第i个纹理的在融合后的背景中的影响程度。
3结合获取纹理坐标为u,v的颜色值公式T(u,v)和权重公式我们可以得到新颜色值的计算公式Y(u,v)如下
说明i表示纹理对象的索引xi表示第i个纹理的权重值n表示用于背景融合的纹理数量 表示第i个纹理对象在UV坐标为u,v的位置获取到的颜色值。 通过上式我们即可将n个纹理按指定权重进行颜色值的融合从而得到最终生成的用于3D场景背景渲染的纹理上的坐标为(u,v)的点的颜色值。见图2
4最后我们通过编译Filament得到的桌面工具“matc.exe”,使用它编译材质。最终 到可用于Filament引擎在Android平台下加载的材质文件mat.filamat。
在Android平台下读取“matc.exe”工具编译所得的材质在3D场景中实现基于此材质的背景渲染。 1通过 Filament的VertexBuffer.Builder和IndexBuffer.Builder创建顶点和顶点索引然后构建场景背景的Mesh对象。 2基于“mat.filamat”构建Material对象然后将其传入Mesh对象。 3最后我们可以通过Material对象的相关set方法实时将材质参数传入Filament引擎从而通过既定的片段着色器进行多种纹理的背景融合。
附图说明
1、通常的实现方式添加遮罩View去实现背景的叠加显示。
图1.叠加遮罩View的实现方式 2、实现多个源纹理的坐标为(u,v)的点的颜色值的融合。 若将这两个源纹理均采用相同的权重进行融合则融合的效果可参考下图。
图2.两个源纹理采用的权重
3、通过融合的方式生成新背景纹理的流程图如下
图3.生成新纹理的流程