This JavaScript program demonstrates how to animate the colors of points without buffers in a WebGL program.
<!DOCTYPE html> <html> <head> <title>XoaX.net's WebGL</title> <script id="idVertexShader" type="c"> attribute vec4 av4Vertex; void main() { gl_Position = av4Vertex; gl_PointSize = 20.0; } </script> <script id="idFragmantShader" type="c"> precision mediump float; uniform vec4 uv4Color; void main() { gl_FragColor = uv4Color; } </script> <script type="text/javascript"> var gqWebGL = null; 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 Initialization() { gqWebGL = new CInstanceWebGL("idCanvas", "idVertexShader", "idFragmantShader", 18); CreateProgramAndContext(gqWebGL); // Begin the animation loop. const kiIntervalId = setInterval(Render, 20); } var gfT = 0.0; function Render() { var dR = .01 gfT = ((gfT + dR < 1.0) ? (gfT + dR) : (gfT + dR - 1)); var dSinT = (Math.sin(2.0*Math.PI*gfT) + 1.0)/2.0; var qGL = gqWebGL.mqGL; qGL.clearColor(0.85, 0.95, 0.85, 1.0); qGL.clear(qGL.COLOR_BUFFER_BIT); const kiPos = qGL.getAttribLocation(gqWebGL.mqProgram, 'av4Vertex'); const kiColor = qGL.getUniformLocation(gqWebGL.mqProgram, 'uv4Color'); const kiPoints = 12; for (let i = 0; i < kiPoints; ++i) { const kdU = i / (kiPoints); // 0 to 1 const dSinU = Math.sin(2.0*Math.PI*kdU); const dCosU = Math.cos(2.0*Math.PI*kdU); qGL.vertexAttrib2f(kiPos, dCosU/1.2, dSinU/1.2); qGL.uniform4f(kiColor, (dSinU + 1)/2, dSinT, (dCosU + 1)/2, 1); const kiOffset = 0; const kiCount = 1; qGL.drawArrays(qGL.POINTS, kiOffset, kiCount); } } function CInstanceWebGL(sCanvasID, sVertexShaderID, sFragmentShaderID, iVertices) { this.mqGL = null; this.mqProgram = null; this.msCanvasID = sCanvasID; this.msVertexShaderID = sVertexShaderID; this.msFragmentShaderID = sFragmentShaderID; } </script> </head> <body onload="Initialization();"> <canvas id="idCanvas" width="400", height="400" style="border:1px solid lightgray"></canvas> </body> </html>
© 20072024 XoaX.net LLC. All rights reserved.