This JavaScript WebGL program demonstrates how draw an ellipse using points.
<!DOCTYPE html>
<html>
<head>
<title>XoaX.net's WebGL</title>
<script id="idVertexShader" type="c">
attribute float afVertIndex;
uniform float ufVertexCount;
void main() {
float fAngleRad = 2.0 * radians(180.0) * (afVertIndex / ufVertexCount);
vec2 qCoordXY = vec2(.9*cos(fAngleRad), .4*sin(fAngleRad));
gl_Position = vec4(qCoordXY, 0.0, 1.0);
gl_PointSize = 2.0;
}
</script>
<script id="idFragmantShader" type="c">
precision mediump float;
void main() {
gl_FragColor = vec4(0.0, 0.0, 1.0, .25);
}
</script>
<script type="text/javascript">
var gqGL = null;
var gqProgram = null;
function CreateProgramAndContext() {
// Get the WebGL Context
var qCanvas = document.querySelector("#idCanvas");
gqGL = qCanvas.getContext("webgl");
// Compile the vertex shader
var sVertexShaderCode = document.querySelector("#idVertexShader").text;
var qVertexShader = gqGL.createShader(gqGL.VERTEX_SHADER);
gqGL.shaderSource(qVertexShader, sVertexShaderCode);
gqGL.compileShader(qVertexShader);
// Compile the fragment shader
var sFragmentShaderCode = document.querySelector("#idFragmantShader").text;
var qFragmentShader = gqGL.createShader(gqGL.FRAGMENT_SHADER);
gqGL.shaderSource(qFragmentShader, sFragmentShaderCode);
gqGL.compileShader(qFragmentShader);
// Compile and link the program
gqProgram = gqGL.createProgram();
gqGL.attachShader(gqProgram, qVertexShader);
gqGL.attachShader(gqProgram, qFragmentShader);
gqGL.linkProgram(gqProgram);
gqGL.useProgram(gqProgram);
}
function Initialization() {
CreateProgramAndContext();
gqGL.clearColor(0.3, 0.3, 0.3, 1.0);
gqGL.clear(gqGL.COLOR_BUFFER_BIT);
const kiPointCount = 1000;
const kiVertexLoc = gqGL.getUniformLocation(gqProgram, 'ufVertexCount');
gqGL.uniform1f(kiVertexLoc, kiPointCount);
const faVertexIndices = new Float32Array(kiPointCount);
faVertexIndices.forEach((v, i) => { faVertexIndices[i] = i; });
const kiIndexBuffer = gqGL.createBuffer();
gqGL.bindBuffer(gqGL.ARRAY_BUFFER, kiIndexBuffer);
gqGL.bufferData(gqGL.ARRAY_BUFFER, faVertexIndices, gqGL.STATIC_DRAW);
const kiVertexIndicesLoc = gqGL.getAttribLocation(gqProgram, 'afVertIndex');
// Define how data is taken out of the buffer
const kiValuesPerIteration = 1;
const kiValueType = gqGL.FLOAT;
const kiNormalize = false; // This may be used on integer types to cast to value between [-1, 1] or [0, 1] for unsigned types
const kiByteSkipsPerIteration = 0;
const kiInitialValueOffset = 0;
gqGL.vertexAttribPointer(kiVertexIndicesLoc, kiValuesPerIteration, kiValueType, kiNormalize, kiByteSkipsPerIteration, kiInitialValueOffset);
gqGL.enableVertexAttribArray(kiVertexIndicesLoc);
const kiOffset = 0;
gqGL.drawArrays(gqGL.POINTS, kiOffset, kiPointCount);
}
</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.