1e41f4b71Sopenharmony_ci# ArkGraphics 3D资源创建以及使用
2e41f4b71Sopenharmony_ci3D场景中资源类型主要包含以下几种:
3e41f4b71Sopenharmony_ci- 材质(Material): 材质是对场景中物体的光学物理性质的数学建模。在渲染计算的过程中,利用这些物理性质计算与光的相互作用,得到最终渲染的颜色。ArkGraphics 3D提供的材质类型基于PBR渲染,支持用户参照PBR渲染材质类型创建材质资源,得到预期的渲染结果。
4e41f4b71Sopenharmony_ci- 图片(Image): 图片本质上是上一个储存信息的二维内存块(buffer),用于储存3D渲染计算过程需要的相关信息,比如基础色、法线等等。ArkGraphics 3D提供基于png、jpg、ktx格式创建Image资源的能力,支持用户自定义需要的Image资源。
5e41f4b71Sopenharmony_ci- 着色器(Shader): 着色器是GPU上可以执行的一段程序,可以控制GPU执行哪些并行计算操作。AGP引擎提供的默认着色器实现了PBR渲染,开发者只需要指定对应的参数就可以完成不同的PBR渲染。ArkGraphics 3D支持开发者创建自定义的着色器,开发者可以通过自定义着色器自定义渲染计算过程,完全控制渲染计算流程,比如控制某物体不受某光源的影响等。
6e41f4b71Sopenharmony_ci- 环境(Environment): 环境是3D场景背景的一种描述,可以基于图片进行创建。通过将一张图片进行正方体或者球体的映射处理,将图片贴在正方体或者球体上,在3D场景中模拟真实的环境。ArkGraphics 3D支持用户创建环境资源,定义3D场景的背景。
7e41f4b71Sopenharmony_ci- 动画(Animation): 3D中的动画资源用于创建三维场景可以运动的虚拟对象,例如人物、动物、车辆等。它们是构成3D场景的基本元素之一,为动画片、游戏、虚拟现实等领域提供了丰富的内容。
8e41f4b71Sopenharmony_ci
9e41f4b71Sopenharmony_ci## 材质的创建及使用
10e41f4b71Sopenharmony_ci
11e41f4b71Sopenharmony_ci材质的关键属性包括名字和类型,以此为输入可以创建材质。示例代码如下:
12e41f4b71Sopenharmony_ci```ts
13e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
14e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
15e41f4b71Sopenharmony_ci
16e41f4b71Sopenharmony_cifunction createMaterialPromise() : Promise<Material> {
17e41f4b71Sopenharmony_ci  return new Promise(() => {
18e41f4b71Sopenharmony_ci    let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
19e41f4b71Sopenharmony_ci    scene.then(async (result: Scene) => {
20e41f4b71Sopenharmony_ci      let sceneFactory: SceneResourceFactory = result.getResourceFactory();
21e41f4b71Sopenharmony_ci      let sceneMaterialParameter: SceneResourceParameters = { name: "material" };
22e41f4b71Sopenharmony_ci      // 创建材质
23e41f4b71Sopenharmony_ci      let material: Promise<Material> = sceneFactory.createMaterial(sceneMaterialParameter, MaterialType.SHADER);
24e41f4b71Sopenharmony_ci      return material;
25e41f4b71Sopenharmony_ci    });
26e41f4b71Sopenharmony_ci  });
27e41f4b71Sopenharmony_ci}
28e41f4b71Sopenharmony_ci```
29e41f4b71Sopenharmony_ci## 着色器资源的创建及使用
30e41f4b71Sopenharmony_ci着色器主要用于控制GPU计算,给开发者提供自定义渲染的能力,提高了3D渲染控制的灵活性。着色器资源的创建需要着色器资源的名字以及着色器在文件沙箱中的路径。着色器资源主要的使用场景是替换材质的着色器属性,给材质自定义渲染算法,达到灵活控制渲染过程的目的,示例代码如下:
31e41f4b71Sopenharmony_ci```ts
32e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
33e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
34e41f4b71Sopenharmony_ci
35e41f4b71Sopenharmony_cifunction createShaderPromise() : Promise<Shader> {
36e41f4b71Sopenharmony_ci  return new Promise(() => {
37e41f4b71Sopenharmony_ci    let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
38e41f4b71Sopenharmony_ci    scene.then(async (result: Scene) => {
39e41f4b71Sopenharmony_ci      let sceneFactory: SceneResourceFactory = result.getResourceFactory();
40e41f4b71Sopenharmony_ci
41e41f4b71Sopenharmony_ci      // 创建SceneResourceParameters类型变量并以此创建shader
42e41f4b71Sopenharmony_ci      let sceneResourceParameter: SceneResourceParameters = { name: "shaderResource",
43e41f4b71Sopenharmony_ci        uri: $rawfile("shaders/custom_shader/custom_material_sample.shader") };
44e41f4b71Sopenharmony_ci      let shader: Promise<Shader> = sceneFactory.createShader(sceneResourceParameter);
45e41f4b71Sopenharmony_ci      shader.then(async (shaderEntity: Shader) => {
46e41f4b71Sopenharmony_ci        let sceneMaterialParameter: SceneResourceParameters = { name: "material" };
47e41f4b71Sopenharmony_ci        // 创建材质
48e41f4b71Sopenharmony_ci        let material: Promise<Material> = sceneFactory.createMaterial(sceneMaterialParameter, MaterialType.SHADER);
49e41f4b71Sopenharmony_ci        material.then(async (materialEntity: ShaderMaterial) => {
50e41f4b71Sopenharmony_ci          // 绑定材质与shader
51e41f4b71Sopenharmony_ci          materialEntity.colorShader = shaderEntity;
52e41f4b71Sopenharmony_ci        });
53e41f4b71Sopenharmony_ci      });
54e41f4b71Sopenharmony_ci      return shader;
55e41f4b71Sopenharmony_ci    });
56e41f4b71Sopenharmony_ci  });
57e41f4b71Sopenharmony_ci}
58e41f4b71Sopenharmony_ci```
59e41f4b71Sopenharmony_ci
60e41f4b71Sopenharmony_ci## 图片资源的创建及使用
61e41f4b71Sopenharmony_ci3D场景中的图片资源是指GPU可以直接使用的图片资源。创建图片资源的关键参数包括图片资源的名字以及图片资源的路径。将图片资源应用到材质中作为材质属性,是常见的图片资源使用方式之一,示例代码如下:
62e41f4b71Sopenharmony_ci```ts
63e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
64e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
65e41f4b71Sopenharmony_ci
66e41f4b71Sopenharmony_cifunction createImagePromise() : Promise<Image> {
67e41f4b71Sopenharmony_ci  return new Promise(() => {
68e41f4b71Sopenharmony_ci    let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
69e41f4b71Sopenharmony_ci    scene.then(async (result: Scene) => {
70e41f4b71Sopenharmony_ci      let sceneFactory: SceneResourceFactory = result.getResourceFactory();
71e41f4b71Sopenharmony_ci      let sceneImageParameter: SceneResourceParameters = { name: "image", uri: $rawfile("bricks.jpg") };
72e41f4b71Sopenharmony_ci      // 创建Image
73e41f4b71Sopenharmony_ci      let image: Promise<Image> = sceneFactory.createImage(sceneImageParameter);
74e41f4b71Sopenharmony_ci      image.then(async (imageEntity: Image) => {
75e41f4b71Sopenharmony_ci        let sceneMaterialParameter: SceneResourceParameters = { name: "material" };
76e41f4b71Sopenharmony_ci        // 创建材质
77e41f4b71Sopenharmony_ci        let material: Promise<Material> = sceneFactory.createMaterial(sceneMaterialParameter, MaterialType.SHADER);
78e41f4b71Sopenharmony_ci        material.then(async (materialEntity: ShaderMaterial) => {
79e41f4b71Sopenharmony_ci          // 利用创建的图片资源设置纹理属性
80e41f4b71Sopenharmony_ci          if (materialEntity && materialEntity.colorShader) {
81e41f4b71Sopenharmony_ci            materialEntity.colorShader.inputs["BASE_COLOR_Image"] = imageEntity;
82e41f4b71Sopenharmony_ci          }
83e41f4b71Sopenharmony_ci        });
84e41f4b71Sopenharmony_ci      });
85e41f4b71Sopenharmony_ci      return image;
86e41f4b71Sopenharmony_ci    });
87e41f4b71Sopenharmony_ci  });
88e41f4b71Sopenharmony_ci}
89e41f4b71Sopenharmony_ci```
90e41f4b71Sopenharmony_ci## 环境资源的创建及使用
91e41f4b71Sopenharmony_ci环境资源的创建需要指定名字以及图片或者glTF在文件沙箱中的路径,将环境资源设置到3D scene的environment属性,即可以将创建的环境资源设置为3D场景的背景环境。环境资源提供了diffuseFactor、specularFactor等的属性,支撑开发者对于环境资源属性进行控制。示例代码如下:
92e41f4b71Sopenharmony_ci```ts
93e41f4b71Sopenharmony_ciimport { Image, Shader, MaterialType, Material, ShaderMaterial, Animation, Environment, Container, SceneNodeParameters,
94e41f4b71Sopenharmony_ci  LightType, Light, Camera, SceneResourceParameters, SceneResourceFactory, Scene, Node } from '@kit.ArkGraphics3D';
95e41f4b71Sopenharmony_ci
96e41f4b71Sopenharmony_cifunction createEnvironmentPromise() : Promise<Environment> {
97e41f4b71Sopenharmony_ci  return new Promise(() => {
98e41f4b71Sopenharmony_ci    let scene: Promise<Scene> = Scene.load($rawfile("gltf/CubeWithFloor/glTF/AnimatedCube.gltf"));
99e41f4b71Sopenharmony_ci    scene.then(async (result: Scene) => {
100e41f4b71Sopenharmony_ci      let sceneFactory: SceneResourceFactory = result.getResourceFactory();
101e41f4b71Sopenharmony_ci      let sceneEnvironmentParameter: SceneResourceParameters = { name: "env", uri: $rawfile("bricks.ktx") };
102e41f4b71Sopenharmony_ci      // 创建Environment
103e41f4b71Sopenharmony_ci      let env: Promise<Environment> = sceneFactory.createEnvironment(sceneEnvironmentParameter);
104e41f4b71Sopenharmony_ci      env.then(async (envEntity: Environment) => {
105e41f4b71Sopenharmony_ci        // 设置env相关属性
106e41f4b71Sopenharmony_ci        envEntity.indirectDiffuseFactor.x = 1;
107e41f4b71Sopenharmony_ci        envEntity.indirectDiffuseFactor.y = 1;
108e41f4b71Sopenharmony_ci        envEntity.indirectDiffuseFactor.z = 1;
109e41f4b71Sopenharmony_ci        envEntity.indirectDiffuseFactor.w = 1;
110e41f4b71Sopenharmony_ci      });
111e41f4b71Sopenharmony_ci      return env;
112e41f4b71Sopenharmony_ci    });
113e41f4b71Sopenharmony_ci  });
114e41f4b71Sopenharmony_ci}
115e41f4b71Sopenharmony_ci```
116e41f4b71Sopenharmony_ci## 相关实例
117e41f4b71Sopenharmony_ci
118e41f4b71Sopenharmony_ci对于3D资源更加综合的使用可以参考以下实例:
119e41f4b71Sopenharmony_ci- [3D引擎接口示例(ArkTS)(API12)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Graphics/Graphics3d)
120e41f4b71Sopenharmony_ci
121