Hello Cube
Goal: expand the triangle model with geometry, a sampled texture, depth testing, and uniforms that change every frame.
From a draw to a scene object
CubeGeometry supplies positions, texture coordinates, and indices. Model converts
that geometry into GPU buffers and associates the attributes with the locations declared
by the WGSL and GLSL vertex shaders.
A DynamicTexture begins loading the image immediately. The model binds it by name, so
the WebGPU shader's @binding(auto) declarations and the WebGL2 sampler uniform can use
the same JavaScript binding object.
Updating uniforms
The model-view-projection matrix changes every frame as the cube rotates. UniformStore
maintains the typed CPU values and the corresponding managed GPU uniform buffer. The
frame performs three steps:
- Recalculate the matrix for the current aspect ratio and animation tick.
- Call
setUniformswith the new value. - Draw the model in a pass with color and depth attachments.
Depth writes and less-equal comparison ensure the cube's hidden faces do not overwrite
nearer surfaces.
// Loading canonical example source…
Common problems
- A black cube usually indicates that the image failed to load; check the asset URL.
- Distorted faces usually indicate an attribute layout that does not match the shader.
- Missing faces or incorrect overlap often means depth testing or the depth attachment is absent.
Summary
You combined geometry, asynchronous texture data, bindings, uniforms, and depth state in one reusable model. Next, Hello Instancing draws many objects with one model and one draw call.