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.