首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何用WebGl一次绘制每个点都有不同颜色的二维点数组?

使用WebGL绘制每个点都有不同颜色的二维点数组可以通过以下步骤实现:

  1. 创建WebGL上下文:首先,需要在HTML文档中创建一个canvas元素,并获取WebGL上下文。可以使用以下代码获取WebGL上下文:const canvas = document.getElementById('canvas'); const gl = canvas.getContext('webgl');
  2. 编写顶点着色器和片元着色器:WebGL使用着色器来控制图形的绘制过程。顶点着色器用于定义顶点的位置,片元着色器用于定义每个像素的颜色。可以使用以下代码编写简单的顶点着色器和片元着色器:// 顶点着色器 const vertexShaderSource = ` attribute vec2 a_position; void main() { gl_Position = vec4(a_position, 0, 1); } `; // 片元着色器 const fragmentShaderSource = ` precision mediump float; uniform vec4 u_color; void main() { gl_FragColor = u_color; } `;
  3. 编译和链接着色器:将上述着色器源代码编译为可用的着色器程序,并链接到WebGL上下文中。可以使用以下代码编译和链接着色器:// 创建顶点着色器 const vertexShader = gl.createShader(gl.VERTEX_SHADER); gl.shaderSource(vertexShader, vertexShaderSource); gl.compileShader(vertexShader); // 创建片元着色器 const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); gl.shaderSource(fragmentShader, fragmentShaderSource); gl.compileShader(fragmentShader); // 创建着色器程序 const program = gl.createProgram(); gl.attachShader(program, vertexShader); gl.attachShader(program, fragmentShader); gl.linkProgram(program); gl.useProgram(program);
  4. 创建顶点缓冲区:为了绘制二维点数组,需要将点的位置数据存储在顶点缓冲区中。可以使用以下代码创建顶点缓冲区:const positionBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(points), gl.STATIC_DRAW);其中,points是一个包含点的位置数据的二维数组。
  5. 设置顶点属性:将顶点缓冲区中的数据与顶点着色器中的属性关联起来。可以使用以下代码设置顶点属性:const positionAttributeLocation = gl.getAttribLocation(program, 'a_position'); gl.enableVertexAttribArray(positionAttributeLocation); gl.vertexAttribPointer(positionAttributeLocation, 2, gl.FLOAT, false, 0, 0);
  6. 绘制点:使用片元着色器中定义的颜色,绘制每个点。可以使用以下代码绘制点:const colorUniformLocation = gl.getUniformLocation(program, 'u_color'); for (let i = 0; i < points.length; i++) { gl.uniform4fv(colorUniformLocation, points[i].color); gl.drawArrays(gl.POINTS, i, 1); }其中,points[i].color是一个包含RGBA颜色值的数组,表示第i个点的颜色。

完整的示例代码如下:

代码语言:html
复制
<!DOCTYPE html>
<html>
<head>
  <title>WebGL Example</title>
  <style>
    canvas {
      border: 1px solid black;
    }
  </style>
</head>
<body>
  <canvas id="canvas" width="400" height="400"></canvas>
  <script>
    const canvas = document.getElementById('canvas');
    const gl = canvas.getContext('webgl');

    const vertexShaderSource = `
      attribute vec2 a_position;
      void main() {
        gl_Position = vec4(a_position, 0, 1);
      }
    `;

    const fragmentShaderSource = `
      precision mediump float;
      uniform vec4 u_color;
      void main() {
        gl_FragColor = u_color;
      }
    `;

    const vertexShader = gl.createShader(gl.VERTEX_SHADER);
    gl.shaderSource(vertexShader, vertexShaderSource);
    gl.compileShader(vertexShader);

    const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
    gl.shaderSource(fragmentShader, fragmentShaderSource);
    gl.compileShader(fragmentShader);

    const program = gl.createProgram();
    gl.attachShader(program, vertexShader);
    gl.attachShader(program, fragmentShader);
    gl.linkProgram(program);
    gl.useProgram(program);

    const points = [
      { position: [0, 0], color: [1, 0, 0, 1] },
      { position: [0.5, 0.5], color: [0, 1, 0, 1] },
      { position: [-0.5, 0.5], color: [0, 0, 1, 1] }
    ];

    const positionBuffer = gl.createBuffer();
    gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
    gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(points.flatMap(p => p.position)), gl.STATIC_DRAW);

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

    const colorUniformLocation = gl.getUniformLocation(program, 'u_color');
    for (let i = 0; i < points.length; i++) {
      gl.uniform4fv(colorUniformLocation, points[i].color);
      gl.drawArrays(gl.POINTS, i, 1);
    }
  </script>
</body>
</html>

这样,就可以使用WebGL绘制每个点都有不同颜色的二维点数组了。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

实用 WebGL 图像处理入门

要想渲染真实际场景,一般需要多组着色器与多个资源,来回绘制多次才能完成一帧。每次绘制前,我们都需要选好着色器,并为其关联好不同资源,也都会启动一次图形渲染管线。...还有很重要,那就是虽然我们已经知道,一帧画面可以通过多次绘制而生成,而每次绘制又对应执行一次图形渲染管线执行。但是,所谓图形渲染管线又是什么呢?这对应于这张图: ?...这里一些要点包括如下: 可以粗略认为,顶点着色器对三角形每个顶点执行一次,而片元着色器则对三角形内每个像素执行一次。 顶点着色器和片元着色器,都是用 WebGL 标准中 GLSL 语言编写。...每个 Uniform 都是一份短小数据, vec4 向量或 mat4 矩阵等。.../ 2, y0 + y1 / 2] // 每个粒子中心二维坐标 const h = 0.5 // 将中心从 (0.5, 0.5) 平移到原点偏移量 // positions

3.1K40

webgl 基础

它有一些不同于JavaScript特性,主要目的是为栅格化图形提供常用计算功能。webgl 发展WebGL起源于Mozilla员工弗拉基米尔·弗基西维奇一项称为Canvas 3D实验项目。...而 Canvas 2D 相当于获取了内置二维图形接口,也就是二维画笔。Canvas 3D 是获取基于 WebGL图形接口,相当于三维画笔。你可以选择不同画笔在上面作画。...工作原理WebGL在GPU上工作基本上分为两部分,第一部分是将顶点(或数据流)转换到裁剪空间坐标, 第二部分是基于第一部分结果绘制像素var primitiveType = gl.TRIANGLES...根据计算出一系列顶点位置,WebGL可以对, 线和三角形在内一些图元进行光栅化处理。当对这些图元进行光栅化处理时需要使用片断着色器方法。 片断着色器作用是计算出当前绘制图元中每个像素颜色值。...沙发模型洗衣机模衣服模型webgl使用试用webgl详细webglWebGL 需要掌握知识1.图像处理2.二维平移,旋转,缩放和矩阵运算3.三维(正射投影,透视投影, 相机)4.光照(方向光源,光源

1.3K80

WebGL简易教程(一):第一个简单示例

getWebGLContext(canvas):获取WebGL渲染上下文,保存在gl变量中。因为不同浏览器获取函数不太一样,所以通过组件cuon-utils提供函数来统一行为。...如果你只学习过固定管线或者其他二维绘图组件(GDI),就会非常困惑着色器是什么,为什么要用着色器。比如说在固定管线中,绘制就是drawPoint,绘制线就drawLine。...在启动JS程序后,绘制工作首先进入是顶点着色器,在顶点着色器中描述顶点特性(位置、颜色等),顶点就是三维空间,比如三角形三个顶点;然后进入到片元着色器,在片元着色器中逐片元处理像素(光照、阴影...既然是语言也就有自己函数与变量定义。main()函数是每个着色器程序定义入口。在main函数中,将顶点坐标赋值给内置变量gl_Position,尺寸赋值给内置变量gl_PointSize。...顶点着色器只是指定了绘制顶点,还需要指定顶点到底成、成线还是成面,gl.drawArrays()就是这样一个函数,这里告诉WebGL系统应该绘制一个。 3.

1.7K10

WebGL简易教程(三):绘制一个三角形(缓冲区对象)

概述 在上一篇教程《WebGL简易教程(二):向着色器传输数据》中,通过向着色器(shader)传输数据,改变了绘制大小和颜色。...之前例子只能绘制一个,如果需要绘制三角形、矩形或者立方体等稍微复杂图形,需要怎么做呢?这个时候就需要一种很方便机制——缓冲区对象(buffer object)。...3) 缓冲区对象 在函数initVertexBuffers()中,可以看到首先初始化了一个JavaScript数组(Float32Array是WebGL引入特殊类型化数组,能够保存大量同一种类型元素...不同是,这里用过函数gl.vertexAttribPointer(),将整个缓冲区对象,也就是顶点数据,一次性分配给attribute变量a_Position。其函数具体说明如下: ?...4) 基本图形绘制 与前两篇教程中绘制不同,这里绘制是一个三角形: // 绘制三角形 gl.drawArrays(gl.TRIANGLES, 0, 3); 可以看到这里同样是用函数gl.drawArrays

93540

WebGL简易教程(四):颜色

那么,如果这些数据(与顶点相关数据,法向量、颜色等)需要继续传送到片元着色器该怎么办呢? 例如这里给三角形每个顶点赋予不同颜色绘制一个彩色三角形。...var FSIZE = verticesColors.BYTES_PER_ELEMENT; //数组每个元素字节数 // 创建缓冲区对象 var vertexBuffer = gl.createBuffer...其中关键就在于gl.vertexAttribPointer()这个函数。之前使用这个函数都是使用默认值,这里通过设置步进和偏移值,分别访问了缓冲区中不同数据。 ?...理解 1) 图形装配和光栅化 更进一步思考下,这里虽然给每个顶点赋予颜色值,但是为什么三角形表面都赋予了颜色,并且是平滑过渡效果呢?...在这个例子中,给三个顶点赋予了三个不同颜色值。WebGL就根据三个顶点颜色值内插了三角形中每个片元(像素)颜色值,并传递给片元着色器。

87220

【前端可视化】 OpenGL WebGL 入门和实践

简单绘制流程 简单说来,WebGL绘制过程包括以下三步: 获取顶点坐标(使用顶点着色器) 图元装配(这里画出一个个三角形,gl.TRIANGLES) 光栅化(生成片元/片段,即一个个像素,使用片段/像素着色器...想一下,每个三角形都有三个顶点,而一个茶壶就会有成千上万个顶点,而且还需要精密计算,显然人肉眼以及精力是不允许一个一个写这些坐标的。...整体详细绘制流程 至此,实质上,WebGL经历了如下处理流程(这里我们涉及到前面没讲到名词稍微多一,但是大概涵盖了所有涉及到内容): 准备数据阶段 在这个阶段,我们需要提供顶点坐标、索引(三角形绘制顺序...光栅化 通过第4步生成了片元着色器,因此 GPU 内部已经确定好了每个片元颜色,然后根据深度缓存区判断哪些片元被挡住了,不需要渲染,最终将片元信息存储到颜色缓存区,最终完成整个渲染。 ?.../旋转/缩放(二维矩阵由来看这里https://webglfundamentals.org/webgl/lessons/zh_cn/webgl-2d-matrices.html) 其实最重要就是顶点坐标

4.4K30

PixiJS 源码解读:绘制矩形渲染过程讲解

要求读者熟悉 WebGL 基础知识。 本文会 以绘制设置了填充和描边矩形为例子,看底层 WebGL 调用执行。...这些三角形,根据不同图形(比如矩形和圆形),需要用不同算法去计算出来,然后把数据通过 WebGL 命令交给 GPU,让它帮我们绘制出来。...6 个一组,逐顶点绘制。 传完后,会调用 BatchRender 类 flush 方法,将顶点数据和索引数组通过 gl.bufferData() 进行绑定。...结尾 PixiJS 绘制图形使用了 WebGL,为了利用 GPU 并行能力,需要给着色器一次性提供尽可能多顶点和颜色信息。 PixiJS 提供了一些基础图形,比如矩形。...绘制时会根据图形属性信息进行三角化,最后将所有的信息组合起来,一次性提供给 WebGL。 这篇文章其实断断续续写了好久,PixiJS 里弯弯道道挺多,经常调试了半天就是找不着北了,一度搁置。

38040

一起学 WebGL:纹理对象学习

大家好,我是前端西瓜哥,今天我们来了解 WebGL 纹理对象(Texture) 纹理对象,是将像素(texels)以数组方式传给 GPU 对象,常见场景是贴图,就是将图片数据应用到 3D 物体上。...纹理比绘制区域大,就要做缩放;纹理比绘制区域小,就要做放大;纹理没能完全填充绘制区域,就要在水平和垂直方向进行填充。 这些场景都需要对应设置不同策略。...,并制定了这个 4 个像素颜色,然后被放大绘制到指定区域上。...:三角形加上渐变色 一起学 WebGL:复合矩阵 一起学 WebGL绘制图片 一起学 WebGL:图元类型 一起学 WebGL绘制三角形 一起学 WebGL:改变颜色 一起学 WebGL...:动态绘制 一起学 WebGL绘制一个 一起学 WebGL:坐标系

21210

一起来玩玩WebGL

学过物理,我们也知道三原色,只要红绿蓝即可调出所有颜色,也就是说,其实每个像素都是有不同红绿蓝三色。...最后操作系统把数据交换给显卡,通常是复制到显存,交给了GPU来渲染显示,本质上GPU也是处理了这些数据,根据这些数据来控制显示器在不同放射不同量度原色,这样就能展示图形了。...片元着色器 光栅化后每个片元都会执行一次片元着色器(Fragment Shader),可以理解为每个像素都执行一次二维角度理解),主要功能是纹理采样和颜色汇总。...gl_FragColor = texture2D(sTexture, vTextureCoord); } 实际上,绘制一个矩形是通过绘制两个三角形合成,也就是有6个顶点,每个顶点执行 一次顶点着色器...例如,把一张图片绘制满1920x1080屏幕,则每个像素都执行一遍片元着色器。

1K41

图扑 Web 可视化引擎在仿真分析领域应用

SDK 在渲染每一个时候,根据点周围空间 4 个做插值拟合获得属性值,并根据属性值范围计算出渲染颜色。...图扑三维粒子插件可以实现和二维粒子流相似的参数调节:粒子大小粒子形状粒子流速粒子数量现实阈值等体绘制绘制是一种将三维空间中体数据,渲染到二维图形上技术。...这里有多种插值算法,反距离加权法、克里金法、自然邻域法、样条函数法等。这里采用反距离加权算法。种体绘制算法有多种:光线投射算法、抛雪球算法、错切变形算法。...以下案例是体绘制在 CT 可视化领域应用:云图扑引擎内置对支持。支持点数量可达千万。云里每个贴图/形状可配置。云可以用于展示模型本身或者模型表面的属性信息,比如压力和温度等。...对于激光云数据,通常一个信息包含三维坐标和颜色值,比如 x,y,z,r,g,b 六个字段。将三维坐标和颜色信息传给图扑云可以直接展示模型。

1.5K20

几个简单小例子手把手带你入门webgl

() { gl_Position = vec4(position,1); } ` 每个顶点调用一次(顶点)着色器,每次调用都需要设置一个特殊全局变量 「gl_Position...片元着色器 「光珊化后,每一个像素都包含了 颜色 、深度 、纹理数据, 这个我们叫做片元」 ❝小tips :每个像素颜色由片元着色器「gl_FragColor」提供 ❞ 接收光栅化阶段生成片元,...在光栅化阶段中,已经计算出每个片元颜色信息,这一阶段会将片元做逐片元挑选操作,处理过片元会继续向后面的阶段传递。...「片元着色器运行次数由图形有多少个片元决定」。 「逐片元挑选」 通过模板测试和深度测试来确定片元是否要显示,测试过程中会丢弃掉部分无用片元内容,然后生成可绘制二维图像绘制并显示。...fragmentShaderSource = ` void main() { gl_FragColor = vec4(1.0,0.0,0.0,1.0); } ` 这个其实理解起来非常简单哈, 每个像素颜色

1.3K20

一起来玩玩WebGL

NO.2 什么是Canvas 还记得不,第一次百科了解WebGL时候,Get到三个就是:JS、Canvas、OpenGLES,那好,JS我们都会啦,现在就来了解一下Canvas;各位看客都是前端大佬...片元着色器 再看片元着色器,核心就是给gl_FragColor赋值,它也是一个内置变量,也是唯一输出变量,从第一弹了解到,光栅化后每个片元都会执行一次片元着色器,可以理解为每个像素都执行一次,而这里例子也就是绘制一个像素...然后丢给了WebGL系统去执行; 第四步是设置canvas背景色,调用是clearColor()方法,可以理解为每次绘制时候把画布清掉并填充上一个颜色,另外关于归一化问题上面已经说到啦。...第六步绘图其实就是调用了drawArrays()函数,第一个值,指定绘制一个,第二个值是告诉从哪个点开始绘制,第三个参数是告诉绘制几个,后续就会有了解到了。...上面了解到,通过canvas拿到了WebGLcontext了,如何用它来初始化着色器使之执行呢?

60320

WebGL学习笔记 | 使用着色器绘制一个

前一篇 《WebGL学习笔记 | 创建着色器程序》介绍了如何创建着色器程序,这次我们让着色器程序运行起来,并在屏幕上绘制一个。 1....= 4.0; } ` 顶点着色器是用来描述顶点特性比如:位置和大小,它是指二维或三维空间中一个,顶点着色器中有两个内置变量: gl_Position:表示顶点位置..., 0.0, 1.0); } `; gl_FragColor 是片元着色器中唯一内置变量,它控制像素在屏幕上最终颜色,上面代码中 vec4 4个分量代表颜色 RGBA 值。...,我们这里只绘制了一个,因此count为1。...当顶点着色器执行完成后,片元着色器开始执行,将颜色值赋给 gl_FragColor,最后一个红色像素绘制到了屏幕中心位置 (0.0, 0.0, 0.0) ,看下图: ?

83030

Python Matplotlib库:统计图补充

bottom 每个条柱底部位置,如果为数字,则每个条柱底部移动相同量。如果是数组,则每个箱子都是独立移动,底部长度必须与箱子数量相匹配。...如果是 2D 数组,则会为 x 中每一列绘制一个箱线图。如果是一系列一维数组,则会为 x 中每个数组绘制一个箱线图。 notch 为True时,绘制凹口箱线图。...meanprops 设置均值属性,大小、颜色等。 capprops 设置箱线图顶端和末端线条属性,颜色、粗细等。 whiskerprops 设置须属性,颜色、粗细、线类型等。...类型为浮点数或类数组,默认值1.5。可选参数。 colors 线条颜色,如果positions参数为二维结构,该参数可为序列,长度应与positions一致。.../散密度图 我们可以用hist2d()方法来绘制二维直方图/散密度图,它作用与散点图类似,语法格式如下: plt.hist2d(x, y, bins=10, range=None, density

1.8K20

浅入浅出WebGPU

还有一个babylon例子(搬自知乎) 这个场景有1000多个没有实例化树,每一颗树都有一次drawcall,使用WebGL,CPU成为巨大瓶颈,每一帧需要花费81ms,而使用WebGPU,CPU...GPU 执行指令写入到 GPU 指令缓冲区(Command Buffer)中,例如我们要在渲染通道中输入顶点数据、设置背景颜色绘制(draw call)等等。...还有一个可选字段depthStencilAttachment表示附加在当前渲染通道用于储存渲染通道深度信息和模板信息附件,因为我们只绘制二维图形,所以不需要处理深度、遮挡、混合这些事情。...相比下来WebGL绘制比它还要更复杂一。...第9行,根据传入下标VertexIndex,找到刚才定义数组具体值并返回,之前draw函数指定有3个顶点,这个顶点着色器就会运行3次,就能获取三个不同顶点了。

1.9K21

数据可视化大屏产品在滴滴技术探索

设计稿是一张二维图片,需要将此二维图片还原到3d场景,但是二维可以设置参数与三维完全不一致,例如三维中通常需要设置材质、光线属性,而这些参数二维中是没有的,因此一开始只能凭经验靠感觉来调整。...效果要反映真实订单情况,所以数据需要实时更新。下面从几个重要点来展开介绍。 ▍1.绘制轨迹 受Chrome限制,webgl绘制线条时候只能绘制1px。因此我们只能通过绘制面的方式来绘制线。...缺陷是这种情况下marker是不断重复轮播,除非我们手动将对应dom移除,否则页面上marker会越来越多。但是我们如何判断每个marker一次动画播放结束从而将其移除呢?...与常规使用不同是,我们需要添加很多判定条件,因为飞线从不同地方飞出,其长度和最大飞行高度是有限制。...在这里还有个优化,一开始是在每次render时候去遍历uv数组更改每个对应值,但是遍历数组也是耗性能,特别是当数据量大时候,后来是将一个常数传进了shader中用于计算每个此时uv坐标,每次

2.7K11

快速入门 WebGL

三角形 WebGL 算是比较底层图形 API,不同于 canvas 2d,WebGL 只能用它来渲染,线和三角形。那些复杂 3D 模型其实都是由一个个三角形组成。...( // 从数组绘制图元 gl.TRIANGLES, // 渲染三角形 0, // 从数组中哪个点开始渲染 3 // 需要用到多少个,三角形三个顶点) 渲染结果如下所示...WebGL 中有两个着色器分别是顶点着色器和片段(也可称为“片元”)着色器。顶点着色器用于处理图形每个,也就是上面例子中三角形三个顶点。...片段着色器可以先理解成像素着色器,也就是将光栅化中每个像素拿过来,给每个像素计算一个颜色。整个流程如下所示。...上图中顶点数据传送给 GPU 后,顶点着色器计算出每个位置,光栅化计算出图形每个像素,片段着色器计算出每个像素颜色,然后就可以渲染到显示器上了。

2.5K10

WebGL简易教程(九):综合实例:地形绘制

地形也就是DEM(数字高程模型),是由一组网格组成模型,每个都有x,y,z值;更简单来说,图像格式就可以作为DEM载体,只不过每个图像像素值代表是高程值。...其中第一行六个值分别表示: 起点X坐标 起点Y坐标 X间距 Y间距 宽 高 剩下每一行表示一个顺序为从上至下,从左至右: 与起点X距离 与起点Y距离 高程值 颜色R 颜色G 颜色B...var verticesColors = terrain.verticesColors; var FSIZE = verticesColors.BYTES_PER_ELEMENT; //数组每个元素字节数...不同在于顶点索引组织。前面提到过,顶点数组是从上至下,从左至右依次排列,所以每个网格是上、下、左、右四个不同组成两个三角形。...所以一共要绘制 (((宽 - 1) * (高 - 1) * 2)) 个三角形,顶点索引数组长度为 (((宽 - 1) * (高 - 1) * 6)) 。

1.5K20
领券