首页 > 其他分享 >使用 WebGL 绘制一个简单的点和原理解析

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

时间:2025-01-07 18:28:47浏览次数:11  
标签:解析 WebGL 缓冲区 顶点 gl 绘制 着色器

使用 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.pointSize(10.0);

// 绘制点
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 成功绘制了一个点。在这个过程中,关键的概念包括着色器、缓冲区和绘制命令。

标签:解析,WebGL,缓冲区,顶点,gl,绘制,着色器
From: https://blog.csdn.net/cuijiying/article/details/144991062

相关文章

  • 03、MySQL安全管理和特性解析(DBA运维专用)
     03、MySQL安全管理和特性解析本节主要讲MySQL的安全管理、角色使用、特定场景下的数据库对象、各版本特性以及存储引擎目录 03、MySQL安全管理和特性解析1、用户和权限管理2、MySQL角色管理3、MySQL密码管理4、用户资源限制5、忘记root密码处理办法6、SQLMO......
  • JAVA实现抖音、快手短视频解析去除水印下载无水印视频
    前言之间抖音接口有些变动,导致抖音解析代码失效,现在更新下文章的代码,亲测有效。需要引入的pom文件   <!--hutool工具类-->      <dependency>         <groupId>cn.hutool</groupId>         <artifactId>hutool-all</artifactId......
  • 企业选型指南:AI Agent与SaaS工具的优劣势深度解析
    AIAgent(AI智能代理)和SaaS工具(软件即服务)代表了现代智能化软件产品的两种重要发展方向。虽然它们都致力于提升效率、优化任务和改善用户体验,但在本质、结构、优势、应用场景以及技术架构上有显著的区别。1、AIAgent和SaaS工具本质区别AIAgent定义:AIAgent是一种无需持续人类......
  • 前端学习openLayers配合vue3(圆形形状的绘制)
    上节课我们学了加载了矢量图片,这节我们来学绘制圆形关键代码,第一段呢是设置圆点的操作,第二步是点击地图获取地图位置来设置圆点,ol还有很多类,各种形状的//设置圆点//letanchorLayer=newVectorLayer({//source:newVectorSource(),//});//letanchorFeat......
  • 深入解析 Spring AI 系列:项目结构一览
    从今天起,我们将以SpringAI为主线,开始更新一系列的文章。这些文章将围绕SpringAI项目展开,结合我的理解,深入讲解其相关的知识点、技术原理、以及在实际开发过程中涉及到的部分代码实现等内容。通过这些文章,希望能够帮助大家更好地理解和使用SpringAI。今天的主题是将对Spri......
  • BUG:SWM32开机绘制lvgl框架下的某个自定义控件死机
    一.BUG描述现象1.画了一个关于"模式"的自定义控件,结果开机绘制总是死机。现象2.用keil进行仿真调试全速运行同样死机,但是如果在异常处加断点,然后单步调试就正常。(注:仿真调试比直接运行的速度要慢)现象3.把这个异常对象的创建代码删除,再后面加四个打印追踪,还是死机;但是删除两个......
  • Python爬虫与1688图片搜索API接口:深度解析与显著收益
     在电子商务的浩瀚海洋中,数据是驱动业务决策的核心引擎。阿里巴巴旗下的1688平台,作为全球领先的B2B在线市场,不仅汇聚了海量的商品信息,还提供了丰富的API接口,为开发者提供了强大的数据获取工具。本文将深入探讨1688图片搜索API接口,通过Python爬虫技术的结合,展示如何高效利用这......
  • 量化交易选择券商有何讲究?从交易成本到技术支持全面解析
    炒股自动化:申请官方API接口,散户也可以python炒股自动化(0),申请券商API接口python炒股自动化(1),量化交易接口区别Python炒股自动化(2):获取股票实时数据和历史数据Python炒股自动化(3):分析取回的实时数据和历史数据Python炒股自动化(4):通过接口向交易所发送订单Python炒股自动化(5):......
  • 【MyBatis-Plus 分页插件】深入分析和实战解析
    分页是Web应用开发中的高频需求,而在MyBatis的生态中,MyBatis-Plus分页插件和PageHelper是两种常见的实现方案。本文将通过工作机制、使用方法和细节剖析,带你循序渐进地掌握这两种方式,并为你的项目选择提供指导。一、什么是分页?分页的核心目标是减少数据传输......
  • 《 C++ 点滴漫谈: 十八 》写出无懈可击的代码:全面解析 C++ 的 explicit 和 implicit 显
    摘要在C++中,隐式和显式转换是程序设计中至关重要的概念,而关键字explicit则是掌控这一机制的核心工具。本文从基础概念出发,全面解析explicit和隐式转换的关系,深入探讨它们在构造函数、防止隐式类型转换错误等场景中的应用。通过对比分析隐式与显式的优缺点,以及C++11......