This JavaScript program demonstrates how to animate a point orbiting around another point in WebGL program.
<!DOCTYPE html>
<html>
<head>
<title>XoaX.net's WebGL</title>
<script id="idVertexShader" type="c">
attribute vec4 av4Vertex;
attribute vec4 av4Color;
varying vec4 vv4Color;
void main() {
gl_Position = av4Vertex;
gl_PointSize = 10.0;
vv4Color = av4Color;
}
</script>
<script id="idFragmantShader" type="c">
precision mediump float;
varying vec4 vv4Color;
void main() {
gl_FragColor = vv4Color;
}
</script>
<script type="text/javascript">
function CreateProgramAndContext(qInstanceWebGL) {
// Get the WebGL Context
var qCanvas = document.querySelector("#"+qInstanceWebGL.msCanvasID);
qInstanceWebGL.mqGL = qCanvas.getContext("webgl");
var qGL = qInstanceWebGL.mqGL;
// Compile the vertex shader
var sVertexShaderCode = document.querySelector("#"+qInstanceWebGL.msVertexShaderID).text;
var qVertexShader = qGL.createShader(qGL.VERTEX_SHADER);
qGL.shaderSource(qVertexShader, sVertexShaderCode);
qGL.compileShader(qVertexShader);
// Compile the fragment shader
var sFragmentShaderCode = document.querySelector("#"+qInstanceWebGL.msFragmentShaderID).text;
var qFragmentShader = qGL.createShader(qGL.FRAGMENT_SHADER);
qGL.shaderSource(qFragmentShader, sFragmentShaderCode);
qGL.compileShader(qFragmentShader);
// Compile and link the program
qInstanceWebGL.mqProgram = qGL.createProgram();
qGL.attachShader(qInstanceWebGL.mqProgram, qVertexShader);
qGL.attachShader(qInstanceWebGL.mqProgram, qFragmentShader);
qGL.linkProgram(qInstanceWebGL.mqProgram);
qGL.useProgram(qInstanceWebGL.mqProgram);
}
function CreateBuffers(qInstanceWebGL) {
var qGL = qInstanceWebGL.mqGL;
var qVerticesBuffer = qGL.createBuffer();
qGL.bindBuffer(qGL.ARRAY_BUFFER, qVerticesBuffer);
qGL.bufferData(qGL.ARRAY_BUFFER, qInstanceWebGL.mfaTransformedVertices, qGL.STATIC_DRAW);
// uiVertexIndex is the index of the attritube.
var uiVertexIndex = qGL.getAttribLocation(qInstanceWebGL.mqProgram, 'av4Vertex');
// uiComponentsPerVertex specifies how many components are used per vertex
var uiComponentsPerVertex = 4;
// eDataType specifies the data type of each component of the array: gl.BYTE: [-128, 127], gl.UNSIGNED_BYTE: [0, 255],
// gl.SHORT: [-32768, 32767], gl.UNSIGNED_SHORT: [0,65535], gl.FLOAT: 32 bit IEEE float
// For WebGL 2, we have gl.HALF_FLOAT: 16 bit IEEE float, gl.INT: 32 bit signed integer, gl.UNSIGNED_INT: 32 bit unsigned integer,
// gl.INT_2_10_10_10_REV: 32 bit signed integer [-512, 511], gl.UNSIGNED_INT_2_10_10_10_REV: 32 bit unsigned integer [0, 1023]
var eDataType = qGL.FLOAT;
// bIsNormalized is boolean value to indicated whether gl.BYTE and gl.SHORT should be normailed to the values [-1, 1] and
// gl.UNSIGNED_BYTE and gl.UNSIGNED_SHORT should be normalized to the values [0, 1] when they are cast to a float.
var bIsNormalized = false;
// iStride is the offset, in bytes, between consecutive vertex attributes. It has the type GLsizei in the range [0,255]
var iStride = 0;
// iOffset is a GLintptr is the offset, in bytes, of the first component in the array. It must be a multiple of the size of eDataType.
var iOffset = 0;
qGL.vertexAttribPointer(uiVertexIndex, uiComponentsPerVertex, eDataType, bIsNormalized, iStride, iOffset);
qGL.enableVertexAttribArray(uiVertexIndex);
var qColorsBuffer = qGL.createBuffer();
qGL.bindBuffer(qGL.ARRAY_BUFFER, qColorsBuffer);
qGL.bufferData(qGL.ARRAY_BUFFER, qInstanceWebGL.mfaVertexColors, qGL.STATIC_DRAW);
var qColors = qGL.getAttribLocation(qInstanceWebGL.mqProgram, 'av4Color');
qGL.vertexAttribPointer(qColors, 4, qGL.FLOAT, false, 0, 0);
qGL.enableVertexAttribArray(qColors);
}
var gqWebGL = null;
var gfaVertices = null;
function Initialization() {
gfaVertices = new Float32Array([
0.0, 0.0, 0.0, 1.0,
0.5, 0.0, 0.0, 1.0
]);
gqWebGL = new CInstanceWebGL("idCanvas", "idVertexShader", "idFragmantShader", 2);
CreateProgramAndContext(gqWebGL);
// Begin the animation loop. This should use requestAnimationFrame instead
const kiIntervalId = setInterval(Render, 20);
}
function Render() {
RenderModel(gqWebGL);
}
var gfAngle = 0.0;
function RenderModel(qInstanceWebGL) {
var faVert = qInstanceWebGL.mfaTransformedVertices;
var faClr = qInstanceWebGL.mfaVertexColors;
gfAngle = ((gfAngle + .02 >= 2.0*Math.PI) ? (gfAngle + .02 - 2.0*Math.PI) : gfAngle + .02);
// First copy the vertices before the transformation
var faColors = [1.0, 1.0, 0.5, 1.0, 0.5, 0.5, 1.0, 1.0];
for (var i = 0; i < 8; ++i) {
faVert[i] = gfaVertices[i];
faClr[i] = faColors[i];
}
faVert[4] = .5*Math.cos(gfAngle);
faVert[5] = .5*Math.sin(gfAngle);
// We need to create the buffers afterward
CreateBuffers(qInstanceWebGL);
var qGL = qInstanceWebGL.mqGL;
qGL.clearColor(0.0, 0.0, 0.0, 1.0);
qGL.clear(qGL.COLOR_BUFFER_BIT);
qGL.drawArrays(qGL.POINTS, 0, 2);
}
function CInstanceWebGL(sCanvasID, sVertexShaderID, sFragmentShaderID, iVertices) {
this.mqGL = null;
this.mqProgram = null;
this.msCanvasID = sCanvasID;
this.msVertexShaderID = sVertexShaderID;
this.msFragmentShaderID = sFragmentShaderID;
this.mfaTransformedVertices = new Float32Array(4*iVertices);
this.mfaVertexColors = new Float32Array(4*iVertices);
}
</script>
</head>
<body onload="Initialization();">
<canvas id="idCanvas" width="400", height="400" style="border:1px solid lightgray"></canvas>
</body>
</html>© 20072025 XoaX.net LLC. All rights reserved.