babylon初始化创建

137 阅读3分钟

初始化创建实例

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        html,
        body {
            padding: 0;
            margin: 0;
        }

        #canvasContainer {
            width: 100vw;
            height: 100vh;
        }
    </style>
</head>

<body>
    <script src="https://cdn.babylonjs.com/babylon.js"></script>
    <canvas id="canvasContainer"></canvas>
    <script>
        //初始化3d引擎
        const canvas = document.getElementById('canvasContainer');
        const engine = new BABYLON.Engine(canvas);
        //添加场景
        const scene = new BABYLON.Scene(engine);
        //相机
        const camera = new BABYLON.ArcRotateCamera(
            'Camera',
            Math.PI / 2,
            Math.PI / 2,
            2,
            new BABYLON.Vector3(0, 0, 5),
            scene
        );
        //添加相机控制
        camera.attachControl(canvas, true);
        // 创建内容,一个球
        const sphere = BABYLON.MeshBuilder.CreateSphere('sphere', { diameter: 2 }, scene);
        // loop
        engine.runRenderLoop(function () {
            scene.render();
        });
             // Watch for browser/canvas resize events
        window.addEventListener("resize", function () {
           engine.resize();
        });
    </script>
</body>

</html>

Api

地址:doc.babylonjs.com/typedoc/mod…

初始化

两种方式

  • webgpu方式
  • webgl方式

Babaylon.js 可以理解为一个游戏引擎,Engine 就是引擎,负责处理渲染、游戏循环、音频等。目前 WebGPU 已经开始慢慢被接受,所以使用 EngineFactory 可以自动选择底层渲染机制。WebGPU 的初始化是异步的,因此这里需要使用 async

目前 Babylon.js 中的 WebGPU 并不是能直接替换传统 WebGL 的,因此有一些功能是有冲突或者不支持的。Babylon.js 可以直接指定需要的渲染机制:

//官方示例,反向兼容必须异步
const engine = new BABYLON.WebGPUEngine(canvas);
await engine.initAsync();
//webgl
const engine = new BABYLON.Engine(canvas);

babylonjs 引擎性能比对

Babylon.js 渲染引擎提供了两种引擎:EngineWebGPUEngine

  1. 渲染API:Engine 使用 WebGL 渲染,而 WebGPUEngine 使用 WebGPU 渲染。WebGPU 是一个新的图形API,可以通过它优化现代GPU的渲染能力和计算能力。
  2. 性能:由于 WebGPU 允许更为直接地控制GPU的操作,使用 WebGPUEngine 可以使得场景中的动态元素处理、特效渲染等更快速,且在大规模场景中运作更为流畅。
  3. 兼容性:由于 WebGPU 是比较新的 API,还不是所有的浏览器均提供对它的支持。现在只有chrome 113版本支持webGPU。

在babylonjs中使用WebGL引擎和WebGPU引擎加载同一个模型,进行性能对比:

  1. 更低的渲染延迟,WebGPUEngine 支持 WebGPU 原生异步调用机制,使得渲染执行更加高效。
  2. 更高的内存性能。WebGPUEngine 支持更快速的高效内存分配,同时避免频繁地切换内存。

Engine

  • canvasOrContext :定义用于呈现的画布或 WebGL 上下文

  • antialias:布尔值,定义启用抗锯齿(默认值:假)

  • options:定义要发送到 getContext() 函数的更多选项

  • adaptToDeviceRatio:布尔值 定义是否适应设备的视口特征(默认值:false):如果设置为 true,则在浏览器中放大和缩小将正确重新缩放硬件缩放。

new Engine(canvasOrContext: Nullable<HTMLCanvasElement | 屏幕外画布 |WebGLRenderingContext | WebGL2RenderingContext>, antialias?: boolean, options?: EngineOptions, adaptToDeviceRatio?: boolean): Engine

 //初始化3d引擎
 const canvas = document.getElementById('canvasContainer');
 const engine = new BABYLON.Engine(canvas);

scene

 //添加场景
 const scene = new BABYLON.Scene(engine);

camera

两种相机

  • UniversalCamera:可以自由移动和转向的相机,兼容三端
  • ArcRotateCamera:360度“围观”一个场景用的相机
// 最常用的是两种相机:
// UniversalCamera, 可以自由移动和转向的相机,兼容三端
const camera = new BABYLON.UniversalCamera(
  'FCamera',
  new BABYLON.Vector3(0, 0, 0),
  scene
)
camera.attachControl(this.canvas, true)


// 以及ArcRotateCamera, 360度“围观”一个场景用的相机
// 参数分别是alpha, beta, radius, target 和 scene
const camera = new BABYLON.ArcRotateCamera("Camera", 0, 0, 10, new BABYLON.Vector3(0, 0, 0), scene)
camera.attachControl(canvas, true)

光源

// 点光源
const light1 = new BABYLON.PointLight("pointLight", new BABYLON.Vector3(1, 10, 1), scene)
// 方向光
const light2 = new BABYLON.DirectionalLight("DirectionalLight", new BABYLON.Vector3(0, -1, 0), scene)
// 聚光灯
const light3 = new BABYLON.SpotLight("spotLight", new BABYLON.Vector3(0, 30, -10), new BABYLON.Vector3(0, -1, 0), Math.PI / 3, 2, scene)
// 环境光
const light4 = new BABYLON.HemisphericLight("HemiLight", new BABYLON.Vector3(0, 1, 0), scene)
复制代码

光的色彩

// 所有光源都有 diffuse 和 specular
// diffuse 代表光的主体颜色
// specular 代表照在物体上高亮部分的颜色
light.diffuse = new BABYLON.Color3(0, 0, 1)
light.specular = new BABYLON.Color3(1, 0, 0)
// 只有环境光有groundColor,代表地上反射光的颜色
light.groundColor = new BABYLON.Color3(0, 1, 0)

渲染

 // loop
  engine.runRenderLoop(function () {
     scene.render();
  });

物体

 // 创建内容,一个球
 const sphere = BABYLON.MeshBuilder.CreateSphere('sphere', { diameter: 2 }, scene);

参考资料 blog.csdn.net/qq_31967569…