(一)使用 WebGL 绘制一个简单的点和原理解析

使用 WebGL 绘制一个简单的点,我们需要通过 WebGL 的管线来进行一系列的步骤。以下是实现的详细步骤和原理解析:

WebGL 绘制点的基本步骤

  1. 初始化 WebGL 上下文
    首先,我们需要获取 WebGL 上下文,这样才能进行所有的绘图操作。通常,WebGL 上下文是通过 <canvas> 元素获取的。

  2. 编写着色器代码(Shader)
    WebGL 使用着色器(Shaders)来定义如何处理顶点数据和像素数据。我们需要两个着色器:顶点着色器和片段着色器。

  3. 创建缓冲区
    WebGL 使用缓冲区存储顶点数据,我们需要一个顶点缓冲区来存储绘制的点的坐标。

  4. 设置 WebGL 状态
    我们需要设置 WebGL 的一些状态,确保它正确地绘制图形。

  5. 执行绘制命令
    最后,使用 WebGL 提供的 drawArraysdrawElements 来执行绘制。

步骤 1:初始化 WebGL 上下文

<canvas id="myCanvas" width="500" height="500"></canvas>
<script>const canvas = document.getElementById('myCanvas');const gl = canvas.getContext('webgl');if (!gl) {console.log('WebGL not supported');}
</script>

步骤 2:编写着色器代码

顶点着色器

顶点着色器负责处理每个顶点的位置,在这里我们定义一个点的坐标。

const vertexShaderSource = `attribute vec4 a_position;void main(void) {gl_Position = a_position;}
`;
片段着色器

片段着色器定义每个像素的颜色。为了使点看起来为某种颜色,我们在片段着色器中设置 gl_FragColor

const fragmentShaderSource = `precision mediump float;void main(void) {gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);  // 红色}
`;

步骤 3:创建缓冲区

我们需要将顶点数据存储在缓冲区中。因为我们绘制的是一个点,顶点数据只有一个点的坐标。

const vertices = new Float32Array([0.0, 0.0,  // 点的坐标
]);// 创建并绑定顶点缓冲区
const vertexBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);

步骤 4:编译和链接着色器

接下来,我们编译顶点着色器和片段着色器,并将它们链接成一个程序。

// 编译着色器的函数
function compileShader(source, type) {const shader = gl.createShader(type);gl.shaderSource(shader, source);gl.compileShader(shader);if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {console.error('Error compiling shader:', gl.getShaderInfoLog(shader));}return shader;
}const vertexShader = compileShader(vertexShaderSource, gl.VERTEX_SHADER);
const fragmentShader = compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER);// 创建着色器程序
const shaderProgram = gl.createProgram();
gl.attachShader(shaderProgram, vertexShader);
gl.attachShader(shaderProgram, fragmentShader);
gl.linkProgram(shaderProgram);if (!gl.getProgramParameter(shaderProgram, gl.LINK_STATUS)) {console.error('Error linking program:', gl.getProgramInfoLog(shaderProgram));
}gl.useProgram(shaderProgram);

步骤 5:启用顶点属性并绑定缓冲区

为了使 WebGL 知道如何从缓冲区中提取数据并传递给着色器,我们需要启用顶点属性。

const positionAttributeLocation = gl.getAttribLocation(shaderProgram, 'a_position');
gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(positionAttributeLocation);

步骤 6:清除画布并绘制

在绘制之前,我们需要清除画布,然后执行绘制命令。

// 清空画布
gl.clearColor(0.0, 0.0, 0.0, 1.0);  // 设置背景色为黑色
gl.clear(gl.COLOR_BUFFER_BIT);// 绘制点
gl.drawArrays(gl.POINTS, 0, 1);  // 绘制一个点
</script>

原理解析

WebGL 渲染管线
  1. 顶点着色器:WebGL 将每个顶点的数据(如坐标)传递给顶点着色器。在本例中,a_position 变量接收的是一个二维坐标([0.0, 0.0]),顶点着色器将其转换为裁剪空间中的位置。

  2. 裁剪空间与屏幕空间:顶点着色器的输出(gl_Position)会经过裁剪和投影变换,最终转换到屏幕空间。

  3. 片段着色器:每个像素(即片段)都会被片段着色器处理。在本例中,片段着色器简单地给每个像素设置红色。

  4. 绘制命令:在这一步,WebGL 使用 gl.drawArrays(gl.POINTS, 0, 1) 来绘制点。gl.POINTS 表示我们要绘制的是一个点。

重要概念
  • 着色器:着色器是 WebGL 中的一个重要概念,它定义了如何处理顶点数据和片段数据。
  • 缓冲区:WebGL 使用缓冲区来存储顶点数据。数据存储在内存中,通过 GPU 加速处理。
  • 绘制命令gl.drawArraysgl.drawElements 是 WebGL 绘制图形的命令,前者是根据缓冲区中的数据绘制,后者则是通过索引来绘制。

总结

通过以上步骤,我们使用 WebGL 成功绘制了一个点。在这个过程中,关键的概念包括着色器、缓冲区和绘制命令。

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

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

相关文章

Vue路由跳转报错

说明&#xff1a;使用 Vue 的router.replace/push&#xff0c;若跳转到当前路由&#xff0c;控制台会报错如下&#xff1a;NavigationDuplicated: Avoided redundant navigation to current location 原因&#xff1a;Vue-router在3.1之后把$router.push()方法改为了Promise。所…

【Axure高保真原型】环形进度条(开始暂停效果)

今天和大家分享环形进度条&#xff08;开始暂停效果&#xff09;的原型模版&#xff0c;效果包括&#xff1a; 点击开始按钮&#xff0c;可以环形进度条开始读取&#xff0c;中部百分比显示环形的读取进度&#xff1b; 在读取过程中&#xff0c;点击暂停按钮&#xff0c;可以随…

Euler 21.10(华为欧拉)安装oracle19c-RAC

1. Euler 21.10安装oracle19c-RAC 1.1. 环境规划 1.1.1. 主机规划 hostname IP 实例名 hfdb90 192.168.40.90 hfdb1 hfdb91 192.168.40.90 hfdb2 系统版本 BigCloud Enterprise Linux For Euler 21.10 (GNU/Linux 4.19.90-2107.6.0.0100.oe1.bclinux.x86_64 x86_6…

【python】matplotlib(radar chart)

文章目录 1、功能描述和原理介绍2、代码实现3、效果展示4、完整代码5、多个雷达图绘制在一张图上6、参考 1、功能描述和原理介绍 基于 matplotlib 实现雷达图的绘制 一、雷达图的基本概念 雷达图&#xff08;Radar Chart&#xff09;&#xff0c;也被称为蛛网图或星型图&…

(三)通过WebGL绘制一个简单的三角形来理解渲染管线

理解 WebGL 绘图原理的关键是了解它的渲染管线。WebGL 渲染管线实际上是由多个阶段组成的&#xff0c;每个阶段都有特定的任务&#xff0c;最终输出的是屏幕上的图像。为了让你能轻松理解这些原理&#xff0c;我将通过一个简单的例子来详细解释。 绘制一个简单的三角形 我们将…

【shell编程】报错信息:bash: bad file descriptor(包含6种解决方法)

大家好&#xff0c;我是摇光~ 在运行 Shell 脚本时&#xff0c;遇到 bash: bad file descriptor 错误通常意味着脚本尝试对一个无效或不可用的文件描述符&#xff08;file descriptor&#xff09;执行了读写操作。 以下是一些可能导致这个问题的原因、详细案例以及相应的解决…

Kafka3.x KRaft 模式 (没有zookeeper) 常用命令

版本号&#xff1a;kafka_2.12-3.7.0 说明&#xff1a;如有多个地址&#xff0c;用逗号分隔 创建主题 bin/kafka-topics.sh --bootstrap-server localhost:9092 --create --topic demo --partitions 1 --replication-factor 1删除主题 bin/kafka-topics.sh --delete --boots…

Business Cooperation Process

Business Cooperation Process 商务合作基本流程 并不是每个人都能做到言而有信的&#xff0c;因此还是需要流程来约束的。

模式识别-Ch2-分类错误率

分类错误率 最小错误率贝叶斯决策 样本 x x x的错误率&#xff1a; 任一决策都可能会有错误。 P ( error ∣ x ) { P ( w 2 ∣ x ) , if we decide x as w 1 P ( w 1 ∣ x ) , if we decide x as w 2 P(\text{error}|\mathbf{x})\begin{cases} P(w_2|\mathbf{x}), &…

Milvus×全诊通:从导诊到智能超声,如何将人效比翻倍

AI与智慧医疗的结合已是未来发展的必然趋势。近年来&#xff0c;国家卫健委推崇智慧医疗和AI技术&#xff0c;如智能导诊、预问诊、辅助诊断等&#xff0c;以提高医疗服务效率和诊断准确性&#xff0c;改善患者就医体验。 全诊通是一家专注于医疗SaaS和人工智能的公司&#xff…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具&#xff0c;故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著&#xff1b;出版时间&#xff1a;2023年3月 二、图像的分类、分割与检测任务区别 如图所示&#xff0c;这些更高阶的…

springcloud 介绍

Spring Cloud是一个基于Spring Boot的微服务架构解决方案集合&#xff0c;它提供了一套完整的工具集&#xff0c;用于快速构建分布式系统。在Spring Cloud的架构中&#xff0c;服务被拆分为一系列小型、自治的微服务&#xff0c;每个服务运行在其独立的进程中&#xff0c;并通过…

Blazor用户身份验证状态详解

在 Blazor 应用程序中&#xff0c;AuthenticationState 是一个核心概念&#xff0c;用于表示用户的身份验证状态。它提供有关当前用户的信息&#xff0c;例如是否已登录、用户的身份信息&#xff08;如用户名、角色等&#xff09;。 AuthenticationState 通常由 Authenticatio…

VAxios

VAxios&#xff08;或v-axios&#xff09;是一个基于Axios的Vue插件&#xff0c;旨在让开发者在Vue项目中更方便、快捷地引入和使用Axios。以下是对VAxios的详细介绍&#xff1a; 一、功能与特性 VAxios作为Axios的Vue封装插件&#xff0c;继承了Axios的众多特性&#xff0c;…

什么是 ERP?

目录 企业资源计划&#xff08;ERP&#xff09;的定义 ERP与财务管理的区别 ERP基础知识 ERP的业务价值 ERP简史 ERP部署模式&#xff1a;从本地部署到云端 ERP云 — 新的ERP交付模式 迁移至ERP云技术解决方案的7个原因 企业资源计划&#xff08;ERP&#xff09;的定义 …

Linux环境下确认并操作 Git 仓库

在软件开发和版本控制中&#xff0c;Git 已成为不可或缺的工具。有时&#xff0c;我们需要确认某个目录是否是一个 Git 仓库&#xff0c;并在该目录中运行脚本。本文将详细介绍如何确认 /usr/local/src/zcxt/backend/policy-system-backend 目录是否是一个 Git 仓库&#xff0c…

【PLL】非线性瞬态性能

频率捕获、跟踪响应&#xff0c;是大信号非线性行为锁相范围内的相位、频率跟踪&#xff0c;不是非线性行为 所以&#xff1a;跟踪&#xff0c;是线性区域&#xff1b;捕获&#xff0c;是大信号、非线性区域 锁定范围&#xff1a;没有周跳&#xff08;cycle-slipping&#xff0…

QML学习(七) 学习QML时,用好Qt设计器,快速了解各个组件的属性

在初步学习QML时&#xff0c;特别建议看看Qt设计器&#xff0c;先利用Qt Quick设计师的使用&#xff0c;快速的对Qt Quick的各个组件及其常用的属性&#xff0c;有个初步的了解和认识。如果初始学习一上来直接以代码形式开干&#xff0c;很容易一头雾水。而设计器以最直白的所见…

回调函数和工厂模式

回调函数和工厂模式可以结合使用&#xff0c;以实现灵活的对象创建和动态行为。这种结合通常用于需要根据特定条件创建对象并在对象上执行某些操作的场景。以下是如何将回调函数与工厂模式结合的示例和解释。 结合使用的场景 动态对象创建&#xff1a;使用工厂模式创建不同类型…

find 查找文件grep匹配数据

一、find介绍 1. find . -iname "*.txt"查找当前目录下各个文件夹下的txt属性的文件(i忽略大小写)。 2.find . -type f 查找当前目录下各个文件夹下的文件 3.find . -type d 查找当前目录下各个文件夹下的目录 4.find . -type f | xargs grep -ain -E "匹配…