在 WebGL 中渲染到立方体贴图教程

render to cubemap tutorial in WebGL

在我的程序中,我在场景中间有一个光源,周围有物体。

我想为它做阴影贴图。我已经知道如何对屏幕外某处的光源进行阴影贴图。所以我的想法是在我的灯泡周围渲染一个立方体贴图,立方体贴图的每一侧都有一个阴影贴图,就像我习惯的那样。

如何渲染立方体贴图?有教程吗?这是要走的路吗?

在 webgl 中,您通过渲染立方体贴图的每个面来渲染立方体贴图,因此每个立方体贴图绘制 6 次。

您通过调用将立方体贴图的一侧附加到 FBO gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X+side, glTextureCube, 0);

您还需要为每一侧使用不同的视图矩阵。这通常是通过 .lookAt 函数完成的。相关的look direction和up vector如下:

var ENV_CUBE_LOOK_DIR = [
    new Vec3(1.0, 0.0, 0.0),
    new Vec3(-1.0, 0.0, 0.0),
    new Vec3(0.0, 1.0, 0.0),
    new Vec3(0.0, -1.0, 0.0),
    new Vec3(0.0, 0.0, 1.0),
    new Vec3(0.0, 0.0, -1.0)
];

var ENV_CUBE_LOOK_UP = [
    new Vec3(0.0, -1.0, 0.0),
    new Vec3(0.0, -1.0, 0.0),
    new Vec3(0.0, 0.0, 1.0),
    new Vec3(0.0, 0.0, -1.0),
    new Vec3(0.0, -1.0, 0.0),
    new Vec3(0.0, -1.0, 0.0)
];

投影矩阵为var CUBE_PROJECTION = mat4.perspective(Math.PI/2, aspect, near, far);

然后在渲染时,你做:

//change to right framebuffer...
for (var side = 0; side<6;side++){
    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X+side, glTextureCube, 0);
    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
    view = mat4.lookAt(camera.pos, camera.pos + ENV_CUBE_LOOK_DIR[side], ENV_CUBE_LOOK_UP[side]);
    viewProjection = CUBE_PROJECTION * view;
    // upload uniforms
    // render
}