WebGL入门(一)绘制一个点

embedded/2024/11/14 21:06:40/

源码: 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="./glMatrix.min.js"></script>
</head>
<body><canvas id="webglCanvas" width="500" height="500"></canvas><script>var webgl // 全局声明webglvar projMat4 // 全局声明投影矩阵var projMat4 = mat4.create() // 创建一个4*4的矩阵var vertexString = `attribute vec4 a_Position;uniform mat4 proj;void main() {gl_Position = proj * a_Position;gl_PointSize = 60.0;}` // 顶点着色器字符串var fragmentString = `precision mediump float;void main() {gl_FragColor = vec4(0, 1.0, 1.0, 1.0);}` // 片元着色器字符串// 入口初始化函数function init(){initWebgl()initShader()// 初始化着色器initBuffer()// 数据缓冲区draw()// 绘制}// webgl初始化function initWebgl(){let webglDiv = document.getElementById('webglCanvas')webgl = webglDiv.getContext('webgl')webgl.viewport(0, 0, webglDiv.clientWidth, webglDiv.height) // 设置视口,四个参数分别是x,y,width,height mat4.ortho(0, webglDiv.clientWidth, webglDiv.clientHeight, 0, -1, 1, projMat4) // 设置正交投影矩阵    }// 初始化着色器,shader初始化函数function initShader(){let vertexShader = webgl.createShader(webgl.VERTEX_SHADER) // 创建顶点着色器let fragmentShader = webgl.createShader(webgl.FRAGMENT_SHADER) // 创建片元着色器webgl.shaderSource(vertexShader, vertexString) // 顶点着色器绑定字符串webgl.shaderSource(fragmentShader, fragmentString) // 片元着色器绑定字符串webgl.compileShader(vertexShader) // 编译顶点着色器webgl.compileShader(fragmentShader) // 编译片元着色器let program = webgl.createProgram() // 创建着色器程序webgl.attachShader(program, vertexShader) // 顶点着色器绑定到着色器程序webgl.attachShader(program, fragmentShader) // 片元着色器绑定到着色器程序webgl.linkProgram(program) // 链接着色器程序webgl.useProgram(program) // 使用着色器程序webgl.program = program // 将着色器程序绑定到webgl上}// 数据缓冲区初始化函数function initBuffer(){let pointPosition = new Float32Array([100.0, 100.0, 0.0, 1.0]) // 创建一个点的位置let aPosition = webgl.getAttribLocation(webgl.program, 'a_Position') // 获取顶点着色器中的a_Position变量let buffer = webgl.createBuffer() // 创建缓冲区对象webgl.bindBuffer(webgl.ARRAY_BUFFER, buffer) // 绑定缓冲区对象webgl.bufferData(webgl.ARRAY_BUFFER, pointPosition, webgl.STATIC_DRAW) // 上传数据到缓冲区webgl.vertexAttribPointer(aPosition, 4, webgl.FLOAT, false, 0, 0) // 将缓冲区数据绑定到a_Positionwebgl.enableVertexAttribArray(aPosition) // 启用顶点属性数组let uniforproj = webgl.getUniformLocation(webgl.program, 'proj') // 获取顶点着色器中的proj变量webgl.uniformMatrix4fv(uniforproj, false, projMat4) // 将投影矩阵传入顶点着色器,三个参数分别是变量,是否转置,矩阵}// 绘制函数function draw(){webgl.clearColor(0.0, 0.0, 0.0, 1.0) // 设置清空颜色webgl.clear(webgl.COLOR_BUFFER_BIT) // 清空颜色缓冲区webgl.drawArrays(webgl.POINTS, 0, 1) // 绘制点,三个参数分别是绘制类型,起始位置,顶点数量}init()</script>
</body>
</html>

绘图效果: 


http://www.ppmy.cn/embedded/115749.html

相关文章

nano-graphrag代码详解

1.概述 https://github.com/gusye1234/nano-graphrag &#x1f62d; GraphRAG很强大&#xff0c;但官方的实现阅读或修改起来非常困难。 &#x1f60a; 本项目提供了一个更小、更快、更简洁的 GraphRAG&#xff0c;同时保留了核心功能。 以下是该项目的详细代码注释&#x…

演示:基于WPF的DrawingVisual开发的Chart图表和表格绘制

一、目的&#xff1a;基于WPF的DrawingVisual开发的Chart图表和表格绘制 二、预览 钻井井轨迹表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟井轨迹深度的绘制&#xff09; 饼图表格数据演示示例&#xff08;应用Table布局&#xff0c;模拟多个饼状图组合显示&am…

torch.nn系列函数学习 --- Conv2d函数

该函数的官方文档&#xff1a; https://pytorch.org/docs/stable/generated/torch.nn.Conv2d.html#torch.nn.Conv2d torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone)…

Java项目实战II基于Java+Spring Boot+MySQL的卓越导师双选系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者 一、前言 在当今高等教育环境中&#xff0c;师生之间的有效沟通与匹配对于促进学生发展、提升教学质量至关重要…

pcdn盒子连接方式

连接方式 大部分连接方式如下 光猫拨号 → 路由器 → 盒子 优点&#xff1a;光猫负责拨号&#xff0c;路由器只需做路由转发&#xff0c;性能要求不高缺点&#xff1a;光猫会有一层nat&#xff0c;路由器还有一层nat&#xff0c;两层nat需要在两个设备上都做nat优化注意&…

python全栈学习记录(十七)logging、json与pickle、time与datatime、random

logging、json与pickle、time与datatime、random 文章目录 logging、json与pickle、time与datatime、random一、logging二.json与pickle三.time与datatime四.random 一、logging logging模块用来记录日志信息。 import logging # 进行基本的日志配置 logging.basicConfig( fi…

高级java每日一道面试题-2024年9月19日-框架篇[Mybatis篇]-说一下mybatis的一级缓存和二级缓存?

如果有遗漏,评论区告诉我进行补充 面试官: 说一下mybatis的一级缓存和二级缓存? 我回答: 在MyBatis中&#xff0c;缓存机制是一个重要的特性&#xff0c;它可以帮助减少数据库的访问次数&#xff0c;从而提高应用的性能。MyBatis提供了两级缓存&#xff1a;一级缓存&#x…

MySQL5.7主从复制集群如何配置半同步复制

MySQL 5.7主从复制集群配置半同步复制的过程涉及多个步骤&#xff0c;以下是一个详细的配置流程&#xff1a; 一、前置条件 确保MySQL版本&#xff1a;确保你正在使用的MySQL版本为5.5或更高版本&#xff0c;因为半同步复制是从MySQL 5.5开始引入的。检查动态加载功能&#x…