首页
学习
活动
专区
工具
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绘制每个点都有不同颜色的二维点数组了。

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

相关·内容

【前端er入门Shader系列】03—Shader形状绘制

使用顶点缓冲对象绘制纯色三角形 OpenGL 可以根据顶点信息绘制三角形,如果每个顶点发送一次数据到 GPU 后再执行绘制效率会很低,因为从 CPU 发送数据到 GPU 相对较慢,使用 vertexBuffer...缓冲对象可以一次性发送一大批数据到 GPU上,而不是每个顶点发送一次。...使用顶点缓冲对象绘制带颜色信息的三角形 在 OpenGL 中,使用不同颜色的顶点绘制三角形,在光栅化阶段会在顶点之间进行像素插值。...如果需要动态顶点颜色,有两种方式: (1) 使用 uniform 传入三个顶点相同的颜色 (2) 扩展顶点属性 为每个顶点定义不同颜色,就不能使用 uniform 方式传值,因为它作为全局变量被访问...,对每个顶点和片段着色器来说是相同的,此时可以通过扩展顶点缓冲对象的属性为每个顶点传递不同的颜色信息。

23610
  • 实用 WebGL 图像处理入门

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

    3.2K40

    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.4K81

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

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

    1.8K10

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

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

    98640

    WebGL简易教程(四):颜色

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

    93320

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

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

    50040

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

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

    4.7K31

    一起学 WebGL:纹理对象学习

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

    28110

    一起来玩玩WebGL

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

    1.1K41

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

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

    1.6K20

    几个简单的小例子手把手带你入门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.4K21

    一起来玩玩WebGL

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

    63320

    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) ,看下图: ?

    89630

    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.9K20

    浅入浅出WebGPU

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

    2.1K21

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

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

    2.8K11

    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.6K20
    领券