开始使用
让我们开始尝试使用ORE,构建一个场景:视窗中的一个正方形。通过这篇教程,您可以了解到以下内容:
- 建立渲染窗口
- 构建空舞台的渲染场景
- 定义渲染几何与材质,构建渲染节点
- 添加渲染节点到场景中
- 更新场景
从一个空舞台开始
我们不妨从一个最简单的场景开始,比如一个只有背景舞台的场景。通过这个简单示例,大家可以初步了解到在ORE中,如何创建一个场景。
建立渲染窗口
我们的第一步从定义画布开始,之后您的场景将会被绘制到画布之中。
<body>
<canvas id="demo" draggable="false" style='width: 800px; height: 600px' width='1200' height='900'></canvas>
<script type="module" src="./get-started.ts"></script>
</body>
</html>
正式的程序从导入ORE core中的类开始,我们需要用这些类来构建和绘制这个场景。
import { Renderer, Background, JPass, Pass, JScene, clr4, float, ivec2 } from 'ore.core';
首先我们获取之前定义好的画布,并将它传递给渲染引擎
const canvas = document.getElementById("demo") as HTMLCanvasElement;
const scale = window.devicePixelRatio ?? 1;
canvas.width = canvas.clientWidth * scale;
canvas.height = canvas.clientHeight * scale;
const renderer = new Renderer(canvas);
构建场景
我们正式开始构建场景,一个渲染通道需要有三个元素:舞台、演员和摄像机。这里我们只需要定义一个只有背景的空舞台。
- colorMask:背景的颜色
- depthMask:背景深度
const background = Background({
size: ivec2(canvas.width, canvas.height),
colorMask: clr4(0.9, 0.8, 0.7, 1.0),
depthMask: float(1.0)
});
即便只有一个空舞台,我们也可以组织成一个渲染通道,从而构建场景。
const pass: JPass = Pass({
background: background,
});
const scene: JScene = {
name: 'scene',
passes: [pass],
};
至此,您就可以调用渲染引擎来绘制这个空舞台了。
updateScene(scene);
renderer.render(scene);
添加一个演员
如果要使用ORE在背景上绘制出演员的图像,那么我们就需要定义渲染节点node,它是由geometry, material组成。
定义几何
这里我们定义一个简单的几何———正方形,那就需要分别定义它的顶点、顶点间的连接方式。
import { JGeometry } from 'ore.ore';
const geometry: JGeometry = {
vertices: {
positions: Vertices([-0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5]),
},
indices: Triangles([0, 1, 2, 0, 2, 3])
};
当然您也可以直接使用ORE的geometry库中的quad类,定义正方形
import { quad } from 'ore.geometry';
const geometry = quad();
定义材质
在WebGL中,通过GLSL(着色语言)编写的可编程着色器可以精细控制几何的材质,实现诸如颜色、光照、纹理和阴影等效果。 在下面的代码中分别给出了顶点着色器 vs 和片元着色器 fs,并应用到材质的定义中。
const vs = `#version 300 es
in vec2 positions;
void main() {
gl_Position = vec4(positions, 0.0, 1.0);
}`;
const fs = `#version 300 es
precision mediump float;
out vec4 fragColor;
void main() {
fragColor = vec4(0.3, 0.5, 0.7, 1.0);
}`;
const material: JMaterial = {
program: {
vertex: vert(vs),
fragment: frag(fs)
}
};
您可以直接使用ORE的material库中的各种材质类,快速定义一个光照材质:
import { head_light_color } from 'ore.material';
const color = clr3(0.3, 0.5, 0.7);
const material = head_light_color(color);
添加到已有场景中
定义好了几何和材质后,便可以组装成一个渲染节点node,然后将该节点加入到渲染通道中。至此,我们已经实现了在舞台上添加一个演员:正方形。
const node: JNode = {
name: 'test',
mesh: {
primitives: [{
geometry: geometry,
material: material
}]
}
};
pass.node = node;
updatePass(pass);
重新绘制场景
renderer.render(scene);
最终的hello webgl网页
按照下面这个方式,您可以快速地将上面创建的场景显示在一个网页中。
hello webgl.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Test</title>
</head>
<body>
<canvas id="demo" draggable="false" style='width: 800px; height: 600px' width='1200' height='900'></canvas>
<script type="module" src="./get-started.ts"></script>
</body>
</html>