JSFiddle - React, Tailwind, and code Playground

by Pascal

HTML

<script src="appcode.ch/gl-matrix.js"></script>
<canvas id="webgl-canvas" width="640" height="480"></canvas>
<script id="shader-fs" type="x-shader/x-fragment">
    precision mediump float;
    
    varying vec4 vColor;
    varying vec3 vLighting;
    
    void main(void) {
        gl_FragColor = vec4(vColor.rgb * vLighting, vColor.a);
    }
</script>

<script id="shader-vs" type="x-shader/x-vertex">
    attribute vec3 aVertexPosition;
    attribute vec3 aVertexColor;
    attribute vec3 aVertexNormal;
    
    uniform mat4 uNormalMatrix;
    uniform mat4 uMVMatrix;
    uniform mat4 uPMatrix;
    
    varying vec4 vColor;
    varying vec3 vLighting;
    
    void main(void) {
        gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
        
        vColor = vec4(aVertexColor, 1.0);
        
        vec3 ambientLight = vec3(0.6, 0.6, 0.6);
        vec3 directionalLightColor = vec3(0.5, 0.5, 0.75);
        vec3 directionalVector = vec3(0.85, 0.8, 0.75);
        
        vec4 transformedNormal = uNormalMatrix * vec4(aVertexNormal, 1.0);
        
        float directional = max(dot(transformedNormal.xyz, directionalVector), 0.0);
        vLighting = ambientLight + (directionalLightColor * directional);
    
    }
</script>

JavaScript

var gl;
var shaderProgram;

var vertexPositionBuffer;
var vertexIndexBuffer;
var vertexColorBuffer;
var vertexNormalBuffer;

var mvMatrix = mat4.create();
var pMatrix = mat4.create();
var lMatrix = mat4.create();

var vertices = [
    // Front face
    -1.0, -1.0,  1.0,
    1.0, -1.0,  1.0,
    1.0,  1.0,  1.0,
    -1.0,  1.0,  1.0,
    
    // Back face
    -1.0, -1.0, -1.0,
    -1.0,  1.0, -1.0,
    1.0,  1.0, -1.0,
    1.0, -1.0, -1.0,
    
    // Top face
    -1.0,  1.0, -1.0,
    -1.0,  1.0,  1.0,
    1.0,  1.0,  1.0,
    1.0,  1.0, -1.0,
    
    // Bottom face
    -1.0, -1.0, -1.0,
    1.0, -1.0, -1.0,
    1.0, -1.0,  1.0,
    -1.0, -1.0,  1.0,
    
    // Right face
    1.0, -1.0, -1.0,
    1.0,  1.0, -1.0,
    1.0,  1.0,  1.0,
    1.0, -1.0,  1.0,
    
    // Left face
    -1.0, -1.0, -1.0,
    -1.0, -1.0,  1.0,
    -1.0,  1.0,  1.0,
    -1.0,  1.0, -1.0
];

var indices = [
    0,  1,  2,      0,  2,  3,    // front
    4,  5,  6,      4,  6,  7,    // back
    8,  9,  10,     8,  10, 11,   // top
    12, 13, 14,     12, 14, 15,   // bottom
    16, 17, 18,     16, 18, 19,   // right
    20, 21, 22,     20, 22, 23    // left
];

var normals = [
    [0, 0, 1],
    [0, 0, -1],
    [0, 1, 0],
    [0, -1, 0],
    [1, 0, 0],
    [-1, 0, 0],
];
    
var colors = [
    [1.0,  1.0,  0.0],    // Front face: white
    [1.0,  1.0,  0.0],    // Back face: red
    [1.0,  1.0,  0.0],    // Top face: green
    [1.0,  1.0,  0.0],    // Bottom face: blue
    [1.0,  1.0,  0.0],    // Right face: yellow
    [1.0,  1.0,  0.0]     // Left face: purple
];

var generatedColors = [];
var generatedNormals = [];

webGLStart();

function webGLStart() {
    var canvas = document.getElementById("webgl-canvas");
    
    for (j=0; j<6; j++) {
        var c = colors[j];
        var n = normals[j];
        
        for (var i=0; i<4; i++) {
            generatedColors = generatedColors.concat(c);
            generatedNormals = generatedNormals.concat(n);
        }
    }
    
   ...