当前示例源码github地址:
https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/BasePbrMaterialTest.ts
当前示例运行效果:
微调参数之后的效果:
此示例基于此渲染系统实现,当前示例TypeScript源码如下:
- export class BasePbrMaterialTest {
- private mRscene = new RendererScene();
-
- initialize(): void {
-
- this.mRscene.initialize({ canvasWith: 1024, canvasHeight: 1024, rpassparam: { multisampleEnabled: true } });
- this.initScene();
- this.initEvent();
- }
- private hdrEnvtex = new SpecularEnvBrnTexture();
- private createTextures(ns: string): WGTextureDataDescriptor[] {
- const albedoTex = { albedo: { url: `static/assets/pbr/${ns}/albedo.jpg` } };
- const normalTex = { normal: { url: `static/assets/pbr/${ns}/normal.jpg` } };
- const aoTex = { ao: { url: `static/assets/pbr/${ns}/ao.jpg` } };
- const roughnessTex = { roughness: { url: `static/assets/pbr/${ns}/roughness.jpg` } };
- const metallicTex = { metallic: { url: `static/assets/pbr/${ns}/metallic.jpg` } };
- let textures = [this.hdrEnvtex, albedoTex, normalTex, aoTex, roughnessTex, metallicTex];
- return textures;
- }
- private initScene(): void {
- this.initEntities();
- }
- private initEntities(): void {
- let rc = this.mRscene;
-
- let monkeySrc = new ModelEntity({
- modelUrl: "static/assets/draco/monkey.drc"
- });
- let sphSrc = new SphereEntity({
- radius: 100,
- latitudeNumSegments: 30,
- longitudeNumSegments: 30
- });
-
- let lightData = this.createLightData();
-
- let startV = new Vector3(-500, 0, -500);
- for (let i = 0; i < 3; ++i) {
- for (let j = 0; j < 5; ++j) {
-
- let pos = new Vector3(j * 300 + startV.x, 0, i * 600 + startV.z);
-
- let roughness = 1.0 - (0.05 + 0.95 * j/(5-1));
- let roughnessBase = i/(3-1);
- let material = new BasePBRMaterial();
- let property = material.property;
- property.setLightData(lightData.lightsData, lightData.lightColorsData);
- property.ambient.value = new Color4().randomRGB(0.3, 0.1);
- property.albedo.value = new Color4().randomRGB(1.0, 0.2);
- property.arms.value = [1, roughness, 1];
- property.armsBase.value = [0, roughnessBase ,0];
-
- material.addTextures(this.createTextures("gold"));
-
- let sph = new SphereEntity({
- materials: [material],
- geometry: sphSrc.geometry
- });
- sph.transform.setPosition(pos);
- rc.addEntity(sph);
-
- material = new BasePBRMaterial();
- property = material.property;
- property.setLightData(lightData.lightsData, lightData.lightColorsData);
-
- property.ambient.value = new Color4().randomRGB(0.3, 0.1).ceil();
- property.albedo.value = new Color4().randomRGB(1.0, 0.2);
- property.arms.value = [1, roughness, 1];
- property.armsBase.value = [0, roughnessBase ,0];
- property.uvParam.value = [2,2];
- material.addTextures(this.createTextures("rusted_iron"));
-
- let monkey = new ModelEntity({
- materials: [material],
- geometry: monkeySrc.geometry,
- transform: { position: pos.clone().subtractBy(new Vector3(0, 0, 270)), scale: [100, 100, 100], rotation: [0, 90, 0] }
- });
- rc.addEntity(monkey);
- }
- }
- }
-
- private createLightData(): { lightsData: Float32Array; lightColorsData: Float32Array } {
- let lightsData = new Float32Array([0.0, 300.0, 0, 0.000001]);
- let lightColorsData = new Float32Array([5.0, 5.0, 5.0, 0.000005]);
- return { lightsData, lightColorsData };
- }
- private initEvent(): void {
- const rc = this.mRscene;
- rc.addEventListener(MouseEvent.MOUSE_DOWN, this.mouseDown);
- new MouseInteraction().initialize(rc, 0, false).setAutoRunning(true);
- }
- private mouseDown = (evt: MouseEvent): void => {};
- run(): void {
- this.mRscene.run();
- }
- }