WebGL绘制和变换三角形

1、绘制多个点

 构建三维模型的基本单位是三角形。不管三维模型的形状多么复杂,其基本组成部分都是三角形,只不过复杂的模型由更多的三角形构成而已。

gl.vertexAttrib3f()一次只能向顶点着色器传入一个顶点,而绘制三角形、矩形和立方体等,你需要一次性将图形的顶点全部传入顶点着色器。WebGL提供了一种很方便的机制,即缓冲区对象。 

缓冲区对象:可以一次性地向着色器传入多个顶点的数据。缓冲区对象是WebGL系统中的一块内存区域,我们可以一次性地向缓冲区对象中填充大量的顶点数据,然后将这些数据保存在其中,供顶点着色器使用。

 示例:

//顶点着色器程序
var VSHADER_SOURCE = `
attribute vec4 a_Position;
void main(){
    gl_Position = a_Position;//将attribute变量赋值给gl_Position变量
    gl_PointSize = 10.0;//设置尺寸
}
`;
//片元着色器程序
var FSHADER_SOURCE = `
precision mediump float;
uniform vec4 u_FragColor;//uniform变量
void main(){
    gl_FragColor = u_FragColor;//设置颜色
}`

function main() {
    //获取<canvas>元素
    var canvas = document.getElementById('myCanvas');
    if (!canvas) {
        console.log("failed to retrieve the canvas element");
        return;
    }
    //获取WebGL的绘图上下文
    var gl = canvas.getContext('webgl');
    if (!gl) {
        console.log("failed to get webgl context");
        return;
    }
    //初始化着色器
    if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
        console.log("failed to initialize shaders");
        return;
    }
    //*************设置顶点位置start***************/
    var n = initVertexBuffers(gl);
    if (n < 0) {
        console.log("failed to set the positions of the vertices");
        return;
    }
    //*************设置顶点位置end***************/

    var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
    gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);

    //设置canvas的背景色
    gl.clearColor(0.0, 0.0, 0.0, 1.0);//黑色
    //清除canvas
    gl.clear(gl.COLOR_BUFFER_BIT);
    //绘制三个点
    gl.drawArrays(gl.POINTS, 0, n);
}

function initVertexBuffers(gl) {
    var vertices = new Float32Array([0.0, 0.5, -0.5, -0.5, 0.5, -0.5]);
    var n = 3;
    //1.1 创建缓冲区对象
    var vertexBuffer = gl.createBuffer();
    if (!vertexBuffer) {
        console.log("failed to create the buffer object");
        return -1;
    }
    //1.2 将缓冲区对象绑定到目标
    gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
    //1.3 向缓冲区对象中写入数据
    gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

    //2.1 获取顶点着色器变量位置
    var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
    //2.2 将缓冲区对象分配给a_Position
    gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);
    //2.3 连接a_Position变量与分配给它的缓冲区对象
    gl.enableVertexAttribArray(a_Position);

    return n;
}

initVertexBuffers()函数的功能是:

  • 创建顶点缓冲区对象
  • 将多个顶点的数据保存在缓冲区中
  • 然后将缓冲区传给顶点着色器

1.1 使用缓冲区对象

使用缓冲区对象向顶点着色器传入多个顶点的数据,需要遵循以下五个步骤:

  1. 创建缓冲区对象(gl.createBuffer())
  2. 绑定缓冲区对象(gl.bindBuffer())
  3. 将数据写入缓冲区对象(gl.bufferData())
  4. 将缓冲区对象分配给一个attribute变量(gl.vertexAttribPointer())
  5. 开启attribute变量(gl.enableVertexAttribArray())

1.2 创建缓冲区对象

 执行该方法的结果是:WebGL系统中多了一个新创建出来的缓冲区对象

gl.createBuffer()函数规范如下:

gl.createBuffer();//创建缓冲区对象
返回值非null新创建的缓冲区对象
null创建缓冲区对象失败
错误

相应地,gl.deleteBuffer(buffer)函数可用来删除被gl.createBuffer()创建出来的缓冲区对象。

gl.deleteBuffer(buffer);//删除参数buffer表示的缓冲区对象
参数buffer待删除的缓冲区对象
返回值
错误

1.3 绑定缓冲区

将缓冲区对象绑定到WebGL系统中已经存在的“目标”上。这个“目标”表示缓冲区对象的用途,这样WebGL才能够正确处理其中的内容。gl.bindBuffer(gl.ARRAY_BUFFER,vertexBuffer)函数规范如下:

gl.bindBuffer(target,buffer);//允许使用buffer表示的缓冲区对象并将其绑定到target表示的目标上
targetgl.ARRAY_BUFFER表示缓冲区对象中包含了顶点的数据
gl.ELEMENT_ARRAY_BUFFER表示缓冲区对象中包含了顶点的索引值
buffer指定之前由gl.createBuffer()返回的待绑定的缓冲区对象。如果为null,则禁用对target的绑定
返回值
错误INVALID_ENUMtarget不是上述值之一,这时将保持原有的绑定情况不变

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志

一、基本介绍 ​ 每当我们要对一条记录做改动时&#xff08;这里的改动可以指 INSERT 、 DELETE 、 UPDATE &#xff09;&#xff0c;都需要留一手 -> 把回滚时所需的东西都给记下来 ​ 你插入一条记录时&#xff0c;至少要把这条记录的主键值记下来&#xff0c;之后回滚的…

【Redis】set 数据类型

文章目录 常用命令sadd & smemberssismember & scardspopsmove & srem 多个集合间的交互命令交集 & sinter & sinterstore并集 & sunion & sunionstore差集 & sdiff & sdiffstore 内部编码 集合类型也是保存多个字符串类型的元素的&#x…

【电控笔记5.6】Butterworth滤波器

Butterworth滤波器 需求&#xff1a;在增益交越频率拥有最小的相位滞后 波器经常被使用原因是 Butterworth 滤波器对于给定阶数&#xff0c;拥有最倾斜的衰减率而在伯德图又不会产生凸峰&#xff0c;同时在低频段的相位滞后小&#xff0c;因此本节将为各位介绍 Butterworth 低…

基于SSM的在线家教管理系统(含源码+sql+视频导入教程)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的在线家教管理系统1拥有三种角色 管理员&#xff1a;学生管理、老师管理、发布管理、留言管理、回复管理、订单管理等教师&#xff1a;我的订单、我的关注、查看回复留言、登录注…

使用 Docker 部署 Draw.io 在线流程图系统

1&#xff09;介绍 Draw.io GitHub&#xff1a;https://github.com/jgraph/drawio Draw.io 是一款开源的绘制流程图的工具&#xff0c;拥有大量免费素材和模板。程序本身支持中文在内的多国语言&#xff0c;创建的文档可以导出到多种网盘或本地。无论是创建流程图、组织结构图…

手拿滑块撕瑞数,我叫超弟你记住!腾讯滑块2024.4.23最新版,高复用,看到就是赚到,珍惜资源首次公开!!!

众所周知&#xff0c;腾讯阿里系安全属于国内天花板&#xff0c;让很多同行望眼欲穿&#xff0c;却束手无策&#xff0c;我们小团队因业务需要&#xff0c;一直都有现成的解决方案&#xff0c;有需求的朋友可以私信&#xff0c;后续准备办一个商学院&#xff0c;完全分享行内超…

基于java,SpringBoot和HTML实验室预约管理系统设计

摘要 本研究旨在设计并实现一个基于Java, Spring Boot和HTML的实验室预约管理系统&#xff0c;以解决实验室资源分配不均、管理混乱和预约流程繁琐等问题。系统采用B/S架构设计&#xff0c;后端使用Spring Boot框架进行开发&#xff0c;前端使用HTML进行页面设计&#xff0c;实…

AI大模型实现软件智能化落地实践

1、什么是大模型 大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff1b;Large Language Models&#xff0c;LLMs)。 大语言模型是一种深度学习模型&#xff0c;特别是属于自然语言处理&#xff08;NLP&#xff09;的领域&#xff0c;一般是指包含数干亿&…

【前后端】django前后端交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、django是什么二、django前后端交互指引三、总结 前言 随着开发语言及人工智能工具的普及&#xff0c;使得越来越多的人会主动学习使用一些开发语言&#x…

前端框架技术革新历程:从原生DOM操作、数据双向绑定到虚拟DOM等框架原理深度解析,Web开发与用户体验的共赢

前端的发展与前端框架的发展相辅相成&#xff0c;形成了相互驱动、共同演进的关系。前端技术的进步不仅催生了前端框架的产生&#xff0c;也为其发展提供了源源不断的动力。 前端的发展 前端&#xff0c;即Web前端&#xff0c;是指在创建Web应用程序或网站过程中负责用户界面…

LangChain4j

文章目录 关于 LangChain4j特性2 levels of abstractionLibrary StructureTutorials (User Guide)Integrations and Models免责声明 Highlights定义由LLM提供支持的声明性 AI Services&#xff1a;使用 LLM 分类从非结构数据中提取结构化信息 Getting started兼容性 支持的 LLM…

JVM学习笔记(五)内存模型

与【java 内存结构】不同&#xff0c;【java 内存模型】是Java Memory Model&#xff08;JMM&#xff09;的意思。前三章主要介绍java内存结构&#xff08;组成&#xff09;、垃圾回收、字节码技术、类加载器&#xff0c;与内存模型这一章关联更多的是多线程&#xff0c;与前面…

C语言进阶课程学习记录-第48课 - 函数设计原则

C语言进阶课程学习记录 - 函数设计原则 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录

虚拟化+Docker基本管理

一、虚拟化简介 1、云端 华为云、谷歌云、腾讯云、阿里云、亚马逊、百度云、移动云、天翼云、西部数码云等 1.国内云 华为云、阿里云、腾讯云、天翼云(私有云) 2.国外云 谷歌云、亚马逊 2、云计算的服务模式是分层的 IaaS&#xff1a;Infrastructure&#xff08;基础设…

Ansys学生版安装教程

Ansys学生版安装 安装包下载 进入官网Ansys学生版下载&#xff0c;这里选择Ansys Electronics Desktop学生版。 解压安装包 将下载好的安装包解压&#xff0c;内容如下 打开AnsysEMSV文件夹&#xff0c;有以下内容 安装 双击点击setup.exe文件&#xff0c;依次按以下流程走…

社区奶柜的便捷与创新

在快节奏的现代生活中&#xff0c;无人零售技术如自动售货机已成为一种普遍现象&#xff0c;为消费者提供便捷的购物体验。社区奶柜&#xff0c;作为这一趋势中的一部分&#xff0c;不仅优化了日常购物流程&#xff0c;而且还在提升社区服务质量上发挥了重要作用。 1. 社区奶柜…

政企宣传邀请媒体的作用?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 政企宣传邀请媒体的作用主要体现在以下几个方面&#xff1a; 提升品牌知名度&#xff1a;通过媒体广泛报道活动内容、亮点及企业形象&#xff0c;可以提升企业或政府的品牌知名度。增加…

安卓原生项目工程结构说明

.gradle 和 .idea (自动生成) .gradle 是gradle下载好的缓存&#xff0c;如果有配置好的 下载好的缓存 直接会拿来用 没有会下载 生成 .idea 是编辑器的配置 app 代码主逻辑 目录 项目中的代码 资源都会在里面 工作的时候的核心目录 gradle 下载安卓的构建器gradle相关的配置信…

个人开发 App 最简单方法:使用现代开发工具和平台

在移动应用市场的蓬勃发展下&#xff0c;个人开发者也有机会将自己的创意转化为实际的应用程序&#xff0c;并通过应用商店实现盈利。然而&#xff0c;对于许多初学者来说&#xff0c;如何开始个人开发一个应用可能会感到困惑。本文将介绍个人开发 App 的最简单方法&#xff0c…

使用全局代理后导致Pycharm无法请求

一直有一个问题&#xff0c;就是在使用Fiddler等抓包工具或者VPN的时候由于是默认的开启的全局代理&#xff0c;然后就会导致我们使用requests时出现以下报错&#xff1a; 导致这个报错的原因就是requests被代理了&#xff0c;既然如此我们让它不被代理就可以了&#xff0c;代…