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

WebGL:将相同的数据加载到两个属性中

基础概念

WebGL(全称:Web Graphics Library)是一种在不需要任何插件的情况下,在任何兼容的Web浏览器中呈现3D图形和2D图形的JavaScript API。WebGL通过HTML5的<canvas>元素与OpenGL ES 2.0结合在一起,WebGL可以为HTML5 Canvas提供硬件3D加速渲染,这样Web开发人员就可以借助系统显卡来在浏览器里更流畅地显示3D场景和模型了,还能创建复杂的导航和数据视觉化。

相关优势

  1. 跨平台:WebGL被所有支持HTML5的浏览器所支持,无需额外插件。
  2. 性能:利用GPU加速,WebGL可以提供高性能的图形渲染能力。
  3. 集成:可以直接与HTML和JavaScript集成,便于开发和部署。
  4. 开放标准:WebGL是一个开放标准,由Khronos Group维护。

类型

WebGL主要涉及两种类型的对象:

  1. Shader:着色器是运行在GPU上的小程序,用于处理图形的渲染过程。主要有两种类型:顶点着色器(Vertex Shader)和片段着色器(Fragment Shader)。
  2. Buffer:缓冲区用于存储顶点数据,如位置、颜色、纹理坐标等。

应用场景

WebGL广泛应用于游戏开发、数据可视化、虚拟现实、增强现实等领域。

问题:将相同的数据加载到两个属性中

在WebGL中,如果你需要将相同的数据加载到两个不同的属性中,通常是因为你需要在顶点着色器中使用这些数据进行不同的计算或渲染。

原因

这可能是由于你的着色器逻辑需要使用相同的数据进行多种不同的操作,例如,你可能需要同时使用顶点的位置和法线来进行光照计算。

解决方法

你可以通过创建两个独立的缓冲区对象,并将相同的数据复制到这两个缓冲区中,然后在顶点着色器中分别引用这两个缓冲区。

以下是一个简单的示例代码,展示了如何将相同的数据加载到两个属性中:

代码语言:txt
复制
// 假设我们有一个包含位置和法线的顶点数组
var vertices = [
    // 位置              // 法线
    -1.0, -1.0, 0.0,     0.0, 0.0, 1.0,
     1.0, -1.0, 0.0,     0.0, 0.0, 1.0,
     0.0,  1.0, 0.0,     0.0, 0.0, 1.0
];

// 创建两个缓冲区
var positionBuffer = gl.createBuffer();
var normalBuffer = gl.createBuffer();

// 绑定并填充位置缓冲区
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices.slice(0, 9)), gl.STATIC_DRAW);

// 绑定并填充法线缓冲区
gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(vertices.slice(9, 18)), gl.STATIC_DRAW);

// 在顶点着色器中引用这两个缓冲区
var vertexShaderSource = `
    attribute vec3 a_position;
    attribute vec3 a_normal;

    void main() {
        gl_Position = vec4(a_position, 1.0);
        // 使用a_normal进行其他计算...
    }
`;

// 编译着色器、链接程序等常规WebGL设置...

// 获取属性位置
var positionAttributeLocation = gl.getAttribLocation(program, "a_position");
var normalAttributeLocation = gl.getAttribLocation(program, "a_normal");

// 启用属性
gl.enableVertexAttribArray(positionAttributeLocation);
gl.enableVertexAttribArray(normalAttributeLocation);

// 绑定并指定数据格式
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.vertexAttribPointer(positionAttributeLocation, 3, gl.FLOAT, false, 0, 0);

gl.bindBuffer(gl.ARRAY_BUFFER, normalBuffer);
gl.vertexAttribPointer(normalAttributeLocation, 3, gl.FLOAT, false, 0, 0);

// 渲染循环...

在这个示例中,我们创建了两个缓冲区,一个用于存储顶点位置,另一个用于存储顶点法线。然后在顶点着色器中分别引用这两个属性。

参考链接

通过这种方式,你可以有效地将相同的数据加载到WebGL的两个不同属性中,并在着色器中使用它们进行不同的计算或渲染。

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

相关·内容

WebGL基础教程:第一部分

从HTML文件中提取着色器源码代码,封装到了一个函数,称为LoadShader;稍后会讲到。 我们使用这个'着色器程序'两个着色器链接起来,通过它,我们可以访问到着色器变量。...我们数据储存到定义在着色器属性;然后,我们就可以几何体输入到着色器中了。 现在,让我们看一下LoadShader函数,你应该将它置于WebGL函数之外。...第二步:“简单”立方体 为了在WebGL画出对象,你需要如下三个数组: 顶点 (vertices):构造你对象那些点 三角形 (triangles):告诉WebGL如何顶点连接成面 纹理坐标...我们还是回到WebGL方法,并添加一个Draw函数。 第三步:Draw函数 WebGL绘制对象过程有许多步骤;所以最好是每个步骤写成函数,来简化这个过程代码。...基本想法是三个数组加载到WebGL缓存中去。 然后,我们这些缓存连接到着色器定义属性,以及变换和透视矩阵。 接下来,我们需要将纹理加载到内存,并且最后调用draw命令。

2.8K41
  • WebGL 概念和基础入门

    :片元着色器作用是计算图元颜色值,我们可以片元着色器大致理解成网页像素 数据获取方式:在前面我们提到了顶点着色器和片元着色器概念,而顶点着色器和片元着色器这两个方法运行都需要有对应数据,...接下来我们一起来了解一下着色器获取数据四种方式: 属性和缓冲:缓冲是发送到 GPU 一些二进制数据序列,通常情况下缓冲数据包括位置、方向、纹理坐标、顶点颜色值等。...当然你可以根据自己需要存储任何你想要数据属性用于说明如何从缓冲获取所需数据并将它提供给顶点着色器。 全局变量:全局变量在着色程序运行前赋值,在运行过程全局有效。...正如我们之前了解到 WebGL 在 GPU 上工作主要分为两个部分,即顶点着色器所做工作(顶点转换为裁剪空间坐标)和片元着色器所做工作(基于顶点着色器计算结果绘制像素点)。...gl.vertexAttribPointer( // 告诉 OpenGL 如何从 Buffer 获取数据 position, // 顶点属性索引 2, // 组成数量,必须是 1

    4.1K31

    关于Webgl和实时渲染技术方案异同分析

    在日常交流,对Webgl技术熟悉合作伙伴,在初次了解实时渲染技术时,都会问二者之间异同。...今天小芹就从以下6个方面,对Webgl和实时渲染两个技术路线做一些异同分析。...1、技术架构虽然二者均为B/S技术架构路线,但webgl对本地电脑性能还是有些要求,因为webgl程序有些数据是需要下载到本地,借助本地电脑显卡和CPU来完成,不算完全B/S架构。...2、通讯数据Webgl首次使用时,需要将一些数据载到电脑本地,首次加载时间比较长。其次对3D模型修改或者版本更新都需要重新下载新数据到本地电脑,通讯数据量是比较大。...实时渲染是3D模型或者大应用直接在服务器打开进程,没有大量数据传输,只是指令接收传达以及服务器上指令执行过程重新编码和传输。传输是流化后视频流,本质是视频流在网络上低延迟传输。

    19410

    学废了系列 - WebGIS vs WebGL图形编程

    正方形方便瓦片切图(关于瓦片切图知识下文会讲),这样能够提前地图数据切片储存,提高用户使用体验。缺点是Y轴存在0.33%误差; 墨卡托投影有两个致命缺点: 第一,形变非常严重。...现实问题:计算两点之间距离 计算两个POI点之间“直线”距离是我们日常项目中出现概率很高一种需求,之所以“直线”两字引号是因为在现实地球上两个点不存在绝对直线距离,在地理上都是球面距离,也就是数学上弧长...POI在数据模型除了坐标以外,还有其他附加属性,比如国家、城市、行政区域、甚至在哪条路等信息,就是为了缩小检索范围从而减轻计算量。...但地图数据本身是一个个坐标值并不是图片,之所以瓦片保存为图片格式是因为早期浏览器没有能够绘制海量数据图形技术,也就是大家熟知 WebGL。...基于上面的几个核心概念,WebGL 执行渲染API调用流程是:分别创建两种shader -> 创建一个program -> program与两个shader绑定 -> 链接(link)program

    1.9K20

    前端-动画大乱炖

    在保证性能同时,我们通常会给页面一些动态效果,以增强页面的表现力并提升页面的交互体验。故前端实现动效几种常用方式整理成此篇小结,以求温故而知新。 ?...DEMO传送门:https://jsfiddle.net/gaogy/wwaejvLn/ Transition CSS transition 属性允许块级元素属性在指定时间内平滑改变,简单看下其语法规则...SVG   用来创建一个圆。cx 和 cy 属性定义圆中心 x 和 y 坐标。如果忽略这两个属性,那么圆点会被设置为 (0, 0)。r属性定义圆半径。...WebGL 程序由JavaScript控制代码,和在计算机图形处理单元(GPU)执行特效代码(shader code,渲染代码) 组成。...WebGL.png WebGL 本质上是基于光栅化 API,而不是基于 3D API。WebGL 只关注两个方面,即投影矩阵坐标和投影矩阵颜色。

    89720

    实用 WebGL 图像处理入门

    三角形有 3 个顶点,每个顶点有两个属性 (attribute),即 position 和 color,每个属性都对应于一个独立 Buffer。...顶点 (vertex) 不仅可以包含一个点坐标属性,还可以包含法向量、颜色等其它属性。这些属性都可以输入顶点着色器来做计算。...我们可以定义这份数据一个子集或者超集来用于实际渲染,以便于减少数据冗余并复用更多顶点。为此我们需要引入 WebGL IndexBuffer 概念,它指定了渲染时用到顶点下标。...这里 position 和 color 这两个 attribute 变量,和前面 vertexBuffers key 相对应。这也是 Beam 隐式约定。...相信大家应该见过一些图片爆炸散开成为粒子效果,这实际上就是图片拆解为了一堆形状。这时不妨假设图像位于单位坐标系上,图像拆分为许多爆破粒子,每个粒子都是由两个三角形组成小矩形。

    3.2K40

    前端动画大乱炖

    作为一只前端狗,我们使命就是在满足产品需求、实现交互设计基础上,最好体验呈现给用户爸爸们。在保证性能同时,我们通常会给页面一些动态效果,以增强页面的表现力并提升页面的交互体验。...故前端实现动效几种常用方式整理成此篇小结,以求温故而知新,如有不当还望多多指正。 ?...DEMO传送门 Transition CSS transition 属性允许块级元素属性在指定时间内平滑改变,简单看下其语法规则: transition: property duration...SVG 用来创建一个圆。cx 和 cy 属性定义圆中心 x 和 y 坐标。如果忽略这两个属性,那么圆点会被设置为 (0, 0)。r属性定义圆半径。...WebGL.png WebGL 本质上是基于光栅化 API,而不是基于 3D API。WebGL 只关注两个方面,即投影矩阵坐标和投影矩阵颜色。

    1.1K20

    移动端 Web 渲染解决方案

    根据 MSDN 解释,SVG 和 Canvas 能够实现几乎相同效果,在不同应用场景下 SVG 和 Canvas 优势差距会很大。...一般情况下,随着屏幕大小增大,画布开始降级,因为需要绘制更多像素。随着屏幕上对象数目增多,SVG 开始降级,因为我们正不断这些对象添加到 DOM 。...由于 SVG 要加载到 DOM ,或者创建图像前至少要进行解析,所以性能会稍微有所下降,但相比于呈现网页成本(大约几毫秒),这种下降是极其微小。...GPU 绘图渲染大部分在 GPU 上进行,对浏览器压力减小,性能几个量级地提高,使 WebGL 成为浏览器内3D渲染、大数据可视化唯一选择。...如果想使用 WebGL,Baur 还推荐了两个库 pixie.js (2D webGL renderer with canvas fallback), three.js (3D)。

    3.5K40

    WebGL: 从 2D 开始

    同时,为了加快数组访问速度和减少内存消耗,浏览器专门为WebGL引入了缓冲数组(Array Buffer)这个新数据类型。最后缓冲数组写入到WebGL缓冲对象。...vertexAttribPointer方法从缓冲取出数据并写入向程序对象属性,参数分别表示指定属性索引值,指定每一个属性长度,数据类型,是否归一化,指定属性字节长度步幅,偏移值,gl.vertexAttribPointer...在上面的代码,通过调用多个API把模型绘制信息都传递给webgl后,webgl此时已经拥有了两个可编程着色器,模型如何绘制信息(位置,尺寸等)。...在WebGL中有两个方法绘制缓冲数据: drawArrays 要使用drawArrays方法,需要将buffer对象(由createBuffer方法创建)绑定到ARRAY_BUFFER上,然后把数据写入到...varying 与uniform一样,varying也只能被声明为全局变量,它是顶点着色器数据传递给片段着色器,只需要在两种着色器中都声明同名,同类型变量。

    4.9K10

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

    两个着色器片段会保存到 Shader 实例,放到 app.render.shader 下。...[i].render(renderer); } } } 对于前文示例代码,会分析矩形属性,构建顶点和片元数据,然后执行 WebGL 绘制 API。...下面是填充色对应数据: 批量渲染 这里产生了两个 batch 对象(对应填充和描边),然后遍历传给 BatchRender 类 render 方法。...说是 render 方法,其实并不立即 render,而是 batch 对象数据解读和保存起来,之后 flush 时才正式数据加到 WebGL 里。 这些属性会组合拼装在一个类型数组里。...绘制时会根据图形属性信息进行三角化,最后所有的信息组合起来,一次性提供给 WebGL。 这篇文章其实断断续续写了好久,PixiJS 里弯弯道道挺多,经常调试了半天就是找不着北了,一度搁置。

    47240

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

    渲染管线 「Webgl渲染依赖底层「GPU」渲染能力。所以「WEBGL」 渲染流程和 「GPU」 内部渲染管线是相符。 「渲染管线作用是3D模型转换为2维图像。」...attributes 属性(从缓冲读取数据) uniforms 全局变量 (一般用来对物体做整体变化、 旋转、缩放) textures 纹理(从像素或者纹理获得数据) varyings 变量 (顶点着色器变量...数据存入缓冲区 有了着色器,现在我们差就是数据了对吧。 上文在写顶点着色器时候用到了Attributes属性,说明是「这个变量要从缓冲读取数据」,下面我们就来把数据存入缓冲。...const aposlocation = gl.getAttribLocation(program, 'a_position') 接下来我们需要告诉「WebGL」怎么从我们之前准备缓冲获取数据给着色器属性...表示是否应该整数数值归一化到特定范围,对于类型gl.FLOAT此参数无效。 表示每次取数据与上次隔了多少位,0表示每次取数据连续紧挨上次数据位置,WebGL会自己计算之间间隔。

    1.4K21

    # threejs 基础知识点汇总

    Three.js 深度冲突 什么是深度冲突,下面创建两个平面,都默认加载到坐标原点: // 创建平面 const plantGeometry = new THREE.PlaneGeometry(80,...: true // 设置深度缓冲区 }); 有一点要注意,当两个面间隙过小,或者重合,你设置webgl渲染器深度缓冲区也是无效,这种方式也是对深度冲突优化,不是解决。...但是注意一点,就是他只支持100%浏览器缩放比例正常运行。在此过程,需要将两个库导入一下:CSS2DRenderer、 CSS2DObject。...这也就解释了为什么设置他 postition 等属性。 因为案例三维场景占据整个屏幕,所以在这里直接挂载到了dom上面了。...Three.js CSS 3D渲染器 CSS3DRenderer CSS3DRenderer 是 Three.js 库一个组件,用于在 WebGL 场景渲染 HTML 元素。

    30110

    WebGL】初探WebGL,我了解到这些

    片元着色器:确定渲染图像每个像素(片元)颜色。 纹理:图像应用到3D表面上。 缓冲区:在GPU上存储和管理数据,如顶点、颜色和纹理。...在这里,我们编写我们WebGL代码。...顶点着色器和片元着色器附加到着色器程序对象上。 链接着色器程序,顶点着色器和片元着色器连接为一个完整 WebGL 着色器程序。...创建并绑定一个缓冲区 vertexBuffer,顶点数据 vertices 存储到缓冲区。 获取顶点着色器定义 a_position 属性位置,并启用该属性。...指定顶点属性数据格式,并将缓冲区数据关联到顶点着色器 a_position 属性。 设置画布清空颜色为黑色,并使用 gl.clear 方法来清空画布。

    38321

    最简WebGL教程,仅需 75 行代码

    此处着色器源代码被存储在字符串,但是也可以从其他位置加载。最终,该字符串被发送到 WebGL API。...接下来,我们用片段着色器执行相同操作,将其编译并发送到 GPU。注意,片段着色器现在可以读取顶点着色器 color 变量。...所以剩下事情就是创建输入,并让 GPU 在这些输入上进行运算。 输入数据发送到 GPU 输入数据将会存储在 GPU 内存,并从那里进行处理。...如果我们两个功能分开(例如一次性创建所有 VBO,然后将它们与各个属性相关联),则需要在每个 VBO 与对应属性相关联之前调用 gl.bindBuffer(...)。 绘制!...在任何实际应用,我们都会以结构化方式存储数据,在数据发生变化时将其发送到 GPU,并在每一帧进行绘制。 ---- 所有内容放在一起,下图显示了在屏幕上显示第一个三角形最小概念集。

    1.9K31

    虚拟仿真教学系统网页化Web技术路线分析

    所谓虚拟仿真系统是指,以计算机方式教学不易呈现教学内容、实操实验等,通过三维立体模型方式更直观地展示。...最早方式,通常是直接课件exe程序发送给学生安装,或者在专门教室中使用专门电脑提前安装好,学生通过电脑直接打开。...简单来说webgl是网页上3D绘图标准,从其技术特点可以看出,其渲染和场景模型展示需要借助电脑硬件本身显卡,并且需要内容下载到电脑本地完成操作指令。...因此对电脑性能有一定要求是其技术特点决定,这对于用户在使用来说,体现是打开运用了这种技术虚拟仿真教学系统,加载时间比较长(需要所有内容都下载到本地),而且如果电脑硬件参数不够的话,会出现卡顿或者渲染时间长等问题...对于内容提供者来说,webgl需要把内容下载到用户本地,内容被盗用、破解、非法传输风险会增加。

    1.1K30

    Threejs入门之十一:创建旋转地球

    .拷贝资源,Threejs源码three.module.js拷贝到js文件夹,地图贴图文件拷贝到images文件夹 3.用vscode打开earth文件夹,在根目录下新建index.html文件...,在index.html引入three.module.js,在index.html创建一个id为webgldiv<script type="importmap...,设置div水平居中* { margin: 0; padding: 0;}#<em>webgl</em> { margin: 0 auto;}5.在根目录下新建index.js文件,并在index.html<em>中</em>引入<...)创建渲染器// 创建渲染器const renderer = new THREE.WebGLRenderer()renderer.setSize(width,height)<em>将</em>渲染器挂<em>载到</em>div上// 挂<em>载到</em>...)// 创建渲染器const renderer = new THREE.WebGLRenderer()renderer.setSize(width, height)// 挂<em>载到</em>id为<em>webgl</em><em>的</em>divdocument.getElementById

    1.6K10
    领券