WebGL 绘制正五边形
CSDN 2024-06-26 09:03:06 阅读 86
还是大剑师兰特:曾是美国某知名大学计算机专业研究生,现为航空航海领域高级前端工程师;CSDN知名博主,GIS领域优质创作者,深耕openlayers、leaflet、mapbox、cesium,canvas,webgl,echarts等技术开发,欢迎加底部微信(gis-dajianshi),一起交流。
No. | 内容链接 |
---|---|
1 | Openlayers 【入门教程】 - 【源代码+示例300+】 |
2 | Leaflet 【入门教程】 - 【源代码+图文示例 150+】 |
3 | Cesium 【入门教程】 - 【源代码+图文示例200+】 |
4 | MapboxGL【入门教程】 - 【源代码+图文示例150+】 |
5 | 前端就业宝典 【面试题+详细答案 1000+】 |
文章目录
使用WebGL绘制正五边形涉及到定义五边形的顶点坐标,并使用这些坐标来渲染形状。以下是使用WebGL绘制正五边形的示例代码:
<!DOCTYPE html>
<html>
<head>
<title>WebGL Pentagon</title>
<style>
body { margin: 0; }
canvas { width: 100%; height: 100%; }
</style>
</head>
<body>
<canvas id="myCanvas" width="500" height="500"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
if (!gl) {
alert('WebGL not supported.');
return;
}
// 设置画布大小
gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);
// 定义正五边形的顶点坐标
var vertices = [];
var center = [0.0, 0.0];
var radius = 0.5;
for (var i = 0; i < 5; i++) {
var angle = (i * Math.PI * 2) / 5;
vertices.push(radius * Math.cos(angle) + center[0]);
vertices.push(radius * Math.sin(angle) + center[1]);
}
// 创建顶点缓冲区
var vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices), gl.STATIC_DRAW);
// 定义着色器源码
var vertexShaderSource = `
attribute vec2 a_position;
void main() {
gl_Position = vec4(a_position, 0.0, 1.0);
}
`;
var fragmentShaderSource = `
precision mediump float;
void main() {
gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
`;
// 创建并编译着色器
function createShader(gl, type, source) {
var shader = gl.createShader(type);
gl.shaderSource(shader, source);
gl.compileShader(shader);
var success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);
if (success) {
return shader;
}
console.error(gl.getShaderInfoLog(shader));
gl.deleteShader(shader);
}
var vertexShader = createShader(gl, gl.VERTEX_SHADER, vertexShaderSource);
var fragmentShader = createShader(gl, gl.FRAGMENT_SHADER, fragmentShaderSource);
// 创建并链接着色器程序
var program = gl.createProgram();
gl.attachShader(program, vertexShader);
gl.attachShader(program, fragmentShader);
gl.linkProgram(program);
gl.useProgram(program);
// 获取顶点属性位置
var positionAttributeLocation = gl.getAttribLocation(program, 'a_position');
gl.enableVertexAttribArray(positionAttributeLocation);
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
// 清除颜色缓冲区
gl.clearColor(0.0, 0.0, 0.0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
// 绘制五边形
gl.drawArrays(gl.LINE_LOOP, 0, 5); // 使用LINE_LOOP连接所有点形成闭环
</script>
</body>
</html>
在这个示例中,我们首先计算正五边形的五个顶点坐标。这些坐标是基于圆心(这里设为画布中心)和半径来计算的。然后,我们创建一个顶点缓冲区,将这些顶点坐标传入,并设置着色器。
着色器代码定义了如何处理顶点数据以及如何为每个片段(像素)着色。在这个例子中,我们使用了红色作为填充颜色。
最后,我们使用drawArrays
函数,模式设置为LINE_LOOP
,这样可以自动连接所有的顶点形成一个闭合的五边形轮廓。如果你想要填充五边形而不是仅仅绘制轮廓,你可以将模式更改为TRIANGLE_FAN
,并需要额外的顶点索引数据来正确地构建三角形扇形。
请注意,这段代码假设你的浏览器支持WebGL,并且在HTML中有一个<canvas>
元素。如果不支持WebGL,页面会显示一个警告框。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。