webgl-画一个彩色矩形

news2025/1/13 2:38:24

html

<!DOCTYPE html>

<head>

    <style>

        *{

            margin: 0px;

            padding: 0px;

        }

    </style>

</head>

<body>

    <canvas id = 'webgl'>

        您的浏览器不支持HTML5,请更换浏览器

    </canvas>

    <script src="./main.js"></script>

</body>

main.js

 

let canvas = document.getElementById('webgl')

canvas.width = window.innerWidth

canvas.height = window.innerHeight

let ctx = canvas.getContext('webgl')

//创建顶点资源和像素资源(颜色)

let vertexSource = `

attribute vec2 a_Position;

attribute vec3 a_Position_color;

varying vec3 a_color;

void main() {

  a_color = a_Position_color;

  gl_Position = vec4(a_Position, 0.0, 1.0);

  gl_PointSize = 10.0;

}

`

let fragmentSource = `

precision mediump float;

uniform vec3 u_color;

varying vec3 a_color;

void main (){

  gl_FragColor = vec4(a_color, 1.0);

}

`

if (initShader(ctx, vertexSource, fragmentSource)) {

    //设置颜色

    let color = ctx.getUniformLocation(ctx.program, "u_color2")

    ctx.uniform3f(color, 1.0, 0.0, 0.0)

    //画三角形

    let vertexs = [

        //   x     y    R    G    B

        -0.5, 0.5, 1.0, 0.0, 0.0, //第一个点的信息

        -0.5, -0.5, 0.0, 1.0, 0.0, //第二个点的信息

        0.5, -0.5, 0.0, 0.0, 1.0,//第三个点的信息

        0.5, 0.5, 1.0, 1.0, 1.0 //第三个点的信息

    ]

    let float32Array = new Float32Array(vertexs)

    //创建buffer

    let buffer = ctx.createBuffer()

    //绑定buffer

    ctx.bindBuffer(ctx.ARRAY_BUFFER, buffer)

    //往buffer中填充值,并指定数据用途

    ctx.bufferData(ctx.ARRAY_BUFFER, float32Array, ctx.STATIC_DRAW)

    //获取vertexShader指定变量内存

    let a_Position = ctx.getAttribLocation(ctx.program, "a_Position")

    //指定每两个数组元素为一个点

    /*

     * 当数组元素不需进行分割拆分的时候最后两位可以指定为0,0

     *

     *

     */

    ctx.vertexAttribPointer(

        a_Position, //location: vertex Shader里面的attributes变量的location

        2, ctx.FLOAT, //size: attribute变量的长度 vec2长度2 vec3长度3

        false, //normalized: 正交化 true或false  , [1, 2] => [1/根号5, 2/根号5]

        5 * float32Array.BYTES_PER_ELEMENT, //stride: 每个点的信息所占的BYTES

        0 //offset: 每个点的信息,从第几个BYTES开始数

    )

    ctx.enableVertexAttribArray(a_Position);

    //获取vertexShader指定变量内存

    let a_Position_color = ctx.getAttribLocation(ctx.program, "a_Position_color")

    ctx.vertexAttribPointer(

        a_Position_color, //location: vertex Shader里面的attributes变量的location

        3, ctx.FLOAT, //size: attribute变量的长度 vec2长度2 vec3长度3

        false, //normalized: 正交化 true或false  , [1, 2] => [1/根号5, 2/根号5]

        5 * float32Array.BYTES_PER_ELEMENT, //stride: 每个点的信息所占的BYTES

        2 * float32Array.BYTES_PER_ELEMENT //offset: 每个点的信息,从第几个BYTES开始数

    )

    //确认吧带有数据的buffer赋值给a_Position

    ctx.enableVertexAttribArray(a_Position_color);

    ctx.drawArrays(ctx.TRIANGLE_FAN, 0, 4)

}


 

//创建顶点阴影和像素阴影

function createShader(ctx, type, source) {

    //创建shader

    let shader = ctx.createShader(type)

    //绑定

    ctx.shaderSource(shader, source)

    //编译shader

    ctx.compileShader(shader)

    //获取编译结果

    let compiler = ctx.getShaderParameter(shader, ctx.COMPILE_STATUS)

    if (compiler) {

        return shader

    } else {

        let log = ctx.getShaderInfoLog(shader)

        console.log("compile shaders error", log)

        //删除异常的shader,防止内存泄露

        ctx.deleteShader(shader)

        return null

    }

}

function createProgram(ctx, vertexShader, fragmentShader) {

    //创建program

    let program = ctx.createProgram()

    if (!program) {

        return null

    }

    //点资源和像素资源合并

    ctx.attachShader(program, vertexShader)

    ctx.attachShader(program, fragmentShader)

    ctx.linkProgram(program)

    //获取linked的结果

    let linked = ctx.getProgramParameter(program, ctx.LINK_STATUS)

    if (linked) {

        return program

    } else {

        //获取link错误信息

        let log = ctx.getProgramInfoLog(program)

        console.log("link program error", log)

        //删除防止内存泄漏

        ctx.delete(program)

        ctx.deleteShader(vertexShader)

        ctx.deleteShader(fragmentShader)

        return null

    }

}

function initShader(ctx, vertexSource, fragmentSource) {

    let vertexShader = createShader(ctx, ctx.VERTEX_SHADER, vertexSource)

    let fragmentShader = createShader(ctx, ctx.FRAGMENT_SHADER, fragmentSource)

    let program = createProgram(ctx, vertexShader, fragmentShader)

    if (program) {

        ctx.useProgram(program)

        //挂载到ctx

        ctx.program = program

        return true

    } else {

        return false

    }

}

效果图

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/410411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于七牛云和PicGo的图床搭建

第一次搭建的博客因为误操作且没有备份导致无法访问和恢复。第二次搭建吸取了第一次的错误&#xff0c;并且准备用图床进行图片的访问。 需要用到的&#xff1a; 七牛云&#xff0c; PicGo&#xff0c; Typora&#xff0c; 已备案域名。 七牛云和域名 进入七牛云的页面&…

Nginx 服务器 SSL 证书安装部署

工具&#xff1a;WinSCP、putty 1.下载证书 cloud.tencent.com_bundle.crt 证书文件cloud.tencent.com_bundle.pem 证书文件&#xff08;可忽略该文件&#xff09;cloud.tencent.com.key 私钥文件cloud.tencent.com.csr CSR 文件 2.上传证书到服务器 通过WinSCP将已获取到的…

Linux宝塔面板搭建Discuz论坛, 并公网远程访问【内网穿透】

文章目录前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&…

paddle实现手写数字识别终章

要点&#xff1a; 资源配置训练调试恢复训练模型部署参考文档&#xff1a; paddle官方文档 一 资源配置 1 概述 从前几节的训练看&#xff0c;无论是房价预测任务还是MNIST手写字数字识别任务&#xff0c;训练好一个模型不会超过10分钟&#xff0c;主要原因是我们所使用的神…

T 级数据量迁移!知名云巨头如何从 Jira 切换至 ONES?

2021 年&#xff0c;Atlassian 旗下 Jira&Confluence 等系列产品 Server 版&#xff08;本地私有化部署版&#xff09;全面停售&#xff0c;并将在 2024 年停止维护&#xff0c;Server 版客户必须迁移至 Cloud&#xff08;云&#xff09;或 Data Center&#xff08;数据中心…

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

Unicode 编码表

正则查找: 中文文字中文符号表情符号... [^\x00-\xff] 其中 \x00-\xff 匹配 ASCII 代码中十六进制代码为 00-ff 的字符&#xff0c; 加个取反 ^ &#xff0c;则就表示表示匹配非单字节的字符&#xff0c;例如汉字&#xff0c;汉字符号等字符集。 中文文字&#xff08;简体繁…

python形态学滤波:腐蚀、膨胀、开、闭运算

文章目录二值形态学灰度形态学最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;scipy.ndimage分别实现了二值数组和灰度数组的这四种运算 二值灰度binary_erosiongrey_erosion腐蚀binary_dilationgrey_dilation膨胀binary_closinggrey_clos…

快速部署专业领域AI处理网站

当前AI大型语言模型展示了很强的信息整合与处理能力&#xff0c;但一些专业知识方面的问答知识量还不够完善&#xff0c;我们在AI的基础上增加了内容训练数据库&#xff0c;相关内容自动添加到AI内容数据库索引。在使用时&#xff0c;可以实时根据对话内容进行检索调取相关上下…

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

文 | 智商掉了一地你有没有想过&#xff0c;让一台计算机诊断和修复自己生成的错误代码&#xff1f;一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术&#xff0c;通过在生成的代码中添加自解释的信息&#xff0c;让计算机像一个可以自己修复代码的程序员一样调试自己的…

CAN CRC校验15_CAN FD与CAN协议区别

1 概述 CAN-FD&#xff1a;可以理解成CAN协议的升级版&#xff0c;只升级了协议&#xff0c;物理层未改变。 CAN与CAN-FD主要区别&#xff1a;传输速率不同、数据长度不同、帧格式不同、ID长度不同。 2 传输速率不同 CAN&#xff1a;最大传输速率1Mbps。 CAN-FD&#xff1…

MIPI D-PHYv2.5笔记(16) -- Preamble Sequence、HS-Idle State、Sync Patterns

声明&#xff1a;作者是做嵌入式软件开发的&#xff0c;并非专业的硬件设计人员&#xff0c;笔记内容根据自己的经验和对协议的理解输出&#xff0c;肯定存在有些理解和翻译不到位的地方&#xff0c;有疑问请参考原始规范看 Preamble Sequence 前导码序列&#xff08;Preamble …

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展&#xff0c;自然语言处理技术也逐渐成为了研究的热点之一。其中&#xff0c;ChatGPT作为一项领先的自然语言处理技术…

【ChatGPT】ChatGPT还能保持多久的神话?

文章目录引言正文ChatGPT的由来ChatGPT的影响乱象频出ChatGPT未来的走势引言 最近ChatGPT的热度持续拔高&#xff0c;一个功能强大的AI迅速引爆了全世界&#xff0c;上到技术大佬&#xff0c;下到平民百姓&#xff0c;都在讨论并使用这个“跨时代的”的技术。有人拿它聊天&…

前端已死?金三银四?你收到offer了吗?

目录 一、前言 二、“唱衰” 三、不局限于框架、前端 四、打动面试官 五、正向加成 六、小结 一、前言 最近在脉脉、知乎等平台都有人在渲染前端从业人员的危机&#xff0c;甚至使用“前端已死”的字眼&#xff0c;颇有“语不惊人死不休”的意味&#xff0c;对老鸟来说&a…

惊呆了,2小时我就学会了Charles抓包的详细教程

目录 一、什么是Charles 二、下载Charles 三、设置Charles代理 四、配置设备代理 五、抓包操作 六、常见问题及解决方法 抓包不到某些应用程序 Charles抓包后网站出现异常 七、总结 一、什么是Charles Charles是一个跨平台的HTTP代理服务工具&#xff0c;可以用来查看…

Zabbix“专家坐诊”第187期问答汇总

问题一 Q&#xff1a;zabbix server 5.0有办法不通过脚本监控SSL证书到期时间么&#xff1f; A&#xff1a;目前还是流行通过脚本方式去获取。 Q&#xff1a;如果是通配符证书应该怎么监控&#xff1f; A&#xff1a;通过解析域名获取对应的过期时间的&#xff0c;或者证书在…

使用ChatGPT快速实现灰度和RGBA图片转换为RGB三通道图片的Python数据清洗demo

使用ChatGPT快速实现灰度和RGBA图片转换为RGB三通道图片的Python数据清洗demo 任务需求 Imagenet数据集&#xff0c;由于原始图片有灰度图片、彩色图片和RGBA图片&#xff0c;我们的要求是将灰度图片和4通道图片通过Image.open(img_pathimg_name).convert(RGB)转换为RGB三通道…

链式二叉树及相关操作(前,中,后,层序遍历)

欢迎来到 Claffic 的博客 &#x1f49e;&#x1f49e;&#x1f49e; “春来无事&#xff0c;只为花忙。” 前言: 上一期给大家介绍了二叉树的一种顺序结构&#xff1a;堆&#xff0c;这一期承接上一期&#xff0c;给大家继续介绍二叉树的另一种结构&#xff1a;链式结构。 目录…

深度学习部署(十九): CUDA RunTime API YOLOV5后处理cpu解码以及gpu解码

跟着杜老师学AI 看看我们干了什么, 就是把bouding box恢复成框而已 1.1 知识点和先验知识 对于模型推理后的后处理&#xff0c;可以直接使用cuda核函数进行解码&#xff0c;效率比较高nms也可以在核函数里面实现这里演示了一个yolov5的实际案例&#xff0c;后续其他的操作都…