WebGL入门(一)绘制一个点

news/2024/9/22 12:54:49 标签: webgl

源码: 

<!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 // 全局声明webgl
        var 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_Position
            webgl.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.niftyadmin.cn/n/5670296.html

相关文章

【远程调用PythonAPI-flask】

文章目录 前言一、Pycharm创建flask项目1.创建虚拟环境2.创建flask项目 二、远程调用PythonAPI——SpringBoot项目集成1.修改PyCharm的host配置2.防火墙设置3.SpringBoot远程调用PythonAPI 前言 解决Pycharm运行Flask指定ip、端口更改无效的问题 首先先创建一个新的flask项目&…

ubuntu系统插入u盘不识别

fdisk -l Disk /dev/sdb&#xff1a;1.84 TiB&#xff0c;2000398934016 字节&#xff0c;3907029168 个扇区 Disk model: Elements SE SSD 和lsblk显示的都不对 sdb 8:16 0 1.8T 0 disk └─sdb1 8:17 0 1.8T 0 part 要用 sudo mount /dev/sdb1 /home/nvidia/usb//dev/sdb1

tensorflow同步机制

tensorflow同步机制 在 TensorFlow 中&#xff0c;多算子&#xff08;operators&#xff09;和多核&#xff08;CPU 核或 GPU 核&#xff09;同步机制旨在提高深度学习模型的计算效率和资源利用率。主要涉及以下几个方面&#xff1a; 1. 多算子并行化 TensorFlow 通过数据流…

设计模式之责任链

一、责任链设计模式概念 责任链模式&#xff08;Chain Of Responsibility&#xff09; 是一种行为设计模式&#xff0c; 允许你将请求沿着处理者链进行发送。 收到请求后&#xff0c; 每个处理者均可对请求进行处理&#xff0c; 或将其传递给链上的下个处理者。 使多个对象都有…

[Linux]:信号(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 信号的阻塞 1.1 基本概念 信号被操作系统发送给进程之后&#xff0c;进程…

基于SpringBoot+Vue+MySQL的国产动漫网站

系统展示 用户前台界面 管理员后台界面 系统背景 随着国内动漫产业的蓬勃发展和互联网技术的快速进步&#xff0c;动漫爱好者们对高质量、个性化的国产动漫内容需求日益增长。然而&#xff0c;市场上现有的动漫平台大多以国外动漫为主&#xff0c;对国产动漫的推广和展示存在不…

Linux提升篇-服务器BIOS介绍

目录 前言BIOS 概述常用配置进入 BIOS 界面查询 iBMCIP 地址设置 BIOS 系统日期和时间设置服务器启动方式 前言 以下bios介绍适用于大部分2020年之后的服务器&#xff0c;包括Huawei系的鲲鹏CPU架构服务器&#xff0c;X86系也可参考&#xff0c;大部分配置项是一致的。 BIOS …

linux cat命令的实现

cat 是 Linux 和其他 Unix-like 系统中的一个常用命令&#xff0c;它的名称来源于 "concatenate"&#xff08;连接&#xff09;的缩写。cat 命令主要用于查看、创建和拼接文件。它读取一个或多个文件的内容&#xff0c;并将它们显示在标准输出&#xff08;通常是终端…