WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:js控制绘制点位

WebGL与WebGPU核心技术对比与68个案例实践指南 WebGL作为浏览器端实现3D图形渲染的核心技术,通过提供OpenGL ES的JavaScript绑定,使开发者能够利用GPU进行硬件加速渲染。其基于状态机的编程模型,要求开发者通过一系列API调用设置渲染状态并提交绘制指令,广泛应用于数据可视化、游戏和交互式媒体等领域。然而,随着应用复杂度的提升,WebGL在性能开销、并行计算支持和开发体验上的局限性逐渐显现。为此,下一代Web图形标准WebGPU应运而生,它借鉴了Vulkan、Metal等现代API的设计,采用显式的命令录制与流水线机制,显著降低了CPU 阅读详情

js改变点位,动态传值

  <canvas id="canvas"></canvas>

  <!-- 顶点着色器 -->
  <script id="vertexShader" type="x-shader/x-vertex">
      attribute vec4 a_Position;
      void main() {
          // 点位
          gl_Position = a_Position;
          // 尺寸
          gl_PointSize = 50.0;
      }
    </script>

  <!-- 片元着色器 -->
  <script id="fragmentShader" type="x-shader/x-fragment">
    void main() {
        gl_FragColor = vec4(1, 1, 0, 1);
    }
  </script>

  <script type="module">
    import { initShaders } from "./utils.js";

    const canvas = document.querySelector("#canvas");
    canvas.width = 200;
    canvas.height = 200;

    // 获取着色器文本
    const vsSource = document.querySelector("#vertexShader").innerText;
    const fsSource = document.querySelector("#fragmentShader").innerText;

    // 三维画笔
    const gl = canvas.getContext("webgl");

    // 初始化着色器
    initShaders(gl, vsSource, fsSource);

    // 声明颜色 rgba
    gl.clearColor(0, 0, 0, 1);
    // 刷底色
    gl.clear(gl.COLOR_BUFFER_BIT);

    // 设置attribute 变量
    // a_Position=vec4(1,0,0,1)
    const a_Position = gl.getAttribLocation(gl.program, "a_Position");

    // 修改attribute 变量
    // gl.vertexAttrib3f(a_Position, 0, 1, 0);
    // gl.vertexAttrib2f(a_Position, 0.5, 0.5);
    gl.vertexAttrib1f(a_Position, 0.1);

    // 绘制顶点
    gl.drawArrays(gl.POINTS, 0, 1);

utils.js

export function initShaders(gl, vsSource, fsSource) {
  // 创建程序对象
  const program = gl.createProgram();
  // 建立着色对象
  const vertexShader = loadShader(gl, gl.VERTEX_SHADER, vsSource);
  const fragmentShader = loadShader(gl, gl.FRAGMENT_SHADER, fsSource);
  // 把顶点着色对象装进程序对象中
  gl.attachShader(program, vertexShader);
  // 把片元着色对象装进程序对象中
  gl.attachShader(program, fragmentShader);
  // 连接webgl上下文对象和程序对象
  gl.linkProgram(program);
  // 启动程序对象
  gl.useProgram(program);
  // 将程序对象挂到上下文对象上
  gl.program = program;
  return true;
}

function loadShader(gl, type, source) {
  // 根据着色类型,建立着色器对象
  const shader = gl.createShader(type);
  // 将着色器源文件传入着色器对象中
  gl.shaderSource(shader, source);
  // 编译着色器对象
  gl.compileShader(shader);
  // 返回着色器对象
  return shader;
}
  • 关于 attribute

    • 是存储限定符,是专门用于向外部导出与点位相关的对象的,这类似于es6模板语法中export
    • attribute变量只有顶点着色器才能使用
    • js可以通过attribute变量向顶点着色器传递与顶点相关的数据
    • 不能使用js语法来修改attribute变量的值,需要使用特定方法改变,如:vertexAttrib1f,vertexAttrib2f,vertexAttrib3f
      • gl.vertexAttrib3f() 方法的参数中:
        • a_Position 就是咱们之前获取的着色器变量
        • 后面的3个参数是顶点的x、y、z位置
  • 关于 gl.getAttribLocation

    • 是获取着色器中attribute变量的方法
    • getAttribLocation() 方法的参数中:
      • gl.program 是初始化着色器时,在上下文对象上挂载的程序对象
      • ‘a_Position’ 是着色器暴露出的变量名
  • 关于 vertexAttrib3f() 同族函数命名规律

    • 同族函数是一系列修改着色器中的 attribute 变量的方法之一
    • vertexAttrib1f(location, v0)
    • vertexAttrib2f(location, v0, v1)
    • vertexAttrib3f(location, v0, v1, v2)
    • vertexAttrib4f(location, v0, v1, v2, v3)
      • 备注
        • 1,2,3是参数个数
        • f是浮点的意思
OpenGL共享对象和多上下文 Shared Objects and Multiple Contexts 阅读详情

相关推荐

最新推荐-2026年固态电池+锂电正极+硅基负极等关键技术实践PPT合集(55份).zip

2026年最新固态电池+锂电正极+硅基负极等关键技术实践PPT合集,共55份。供大家查阅。 一、固态电池 1.全固态电池用硅基负极材料研究进展 2.全固态电池硅基负极的开发思考 3.功能型固态电解质设计及界面调控 4.固态电池及关键材料研发与产业化进展 5.固态电池的产业化应用探索 6.固态锂电池开发现状及未来展望 7.固态锂离子电池正极结构设计与材料选择 8.固态锂金属电池设计与应用 9.硫化物全固态电池石墨和硅负极性能调控技术 10.硫化物固态电解质行业应用 11.聚合物基固态电解质与固态电池的关键技术 12.蜂鸟声共振技术-固态电池产业化的革命性创新 13.长安汽车固态电池应用探索 14.高安全性固态电池技术发展趋势 15.高性能硫化物全固态锂电池解决方案 16.高硅体系的膨胀解决方案 二、硅基负极 1.化学气相沉积碳包覆技术在硅基负极材料中的应用 2.新型粘结剂解决 硅基负极膨胀问题 3.氧化亚硅负极材料化学预锂化与界面设计 4.流化床法生产磷酸铁锂及硅负极材料研究 5.石墨烯包覆硅碳负极 6.硅基材料的发展现状及展望 7.硅基负极与固态电解质 8.硅基负极技术与进展 9.硅基负极材料体积膨胀解决策略 10.硅基负极材料及其结构设计 11.硅基负极材料的冶金法制备 12.硅基负极材料的发展与应用 13.硅基负极材料研究进展 14.硅基负极材料:从基础研究到产业应用 15.硅基负极析锂行为及调制研究 16.硅碳负极低成本制造技术报告 17.硅碳负极制备用多孔碳的开发 18.硅碳负极挑战和进展 19.硅碳负极新路线及关键材料制备 20.硅碳负极锂离子电池应力特性研究 21.锂电石墨负极材料工程化技术进步 22.锂离子电池负极材料 23.高容量石墨烯-硅基复合负极材料的研究进展 三、锂电正极 1.基于AI和图论结构化学的锂电池的材料基因探索 2.废旧磷酸铁锂电池梯次及再生利用进展 3.电动汽车大功率充电标准体系与检测认证实践 4.磷酸铁及磷酸铁锂异物防控管理 5.磷酸铁锂正极材料:液相法合成及产业化应用研究 6.磷酸锰铁锂正极材料的研究现状 7.车用动力电池安全标准化工作进展及未来展望 8.锂电层状氧化物正极材料的原子尺度失效机制 9.锂电正极材料工厂异物防控管理图册 10.锂离子电池高熵正极材料成分设计及储锂机制研究 11.高压实磷酸铁锂正极材料生产工艺配方.docx 12.高安全正极材料添加剂提升三元锂电安全性 13.高比能富锂锰基电池关键技术 14.高能量密度锂离子电池正极材料及应用研究 15.高镍单晶三元正极材料研究 16.三元高电压单晶正极材料

(转)【GLSL教程】(三)在OpenGL…

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <div id="content" class= "content mod-cs-content text-content clearfix"> 引言 一个Op

woashizhangsi的专栏 665

Vector CANoe VT2516A实战:从硬件连接到CAPL脚本的完整配置指南

本文详细介绍了Vector CANoe VT2516A板卡从硬件连接到CAPL脚本编写的完整配置指南。涵盖硬件接线原则、VT System配置避坑技巧、系统变量创建规范、可视化Panel设计、CAPL脚本调试及典型故障排查案例,帮助工程师快速掌握VT2516A板卡的应用实践,提升汽车电子测试效率。

weixin_30608503的博客 255

Babylon.js着色器简明简称【Shader】

推荐:用快速搭建可编程3D场景为了生成 BabylonJS 场景,需要用 Javascript 编写代码,BabylonJS 引擎会处理该代码并将结果显示在屏幕上。场景可以通过改变网格、灯光或摄像机位置来改变。为了及时显示可能的变化,屏幕显示(帧)以每秒 60 帧的速度重新绘制。简化一下,流程就是并将其转换为顶点数据,包括位置、颜色和法线BabylonJS 引擎为此数据创建着色器代码并传递到 GPU。不仅仅是这个以及场景代码,你还可以编写自己的用户着色器代码,该过程变得。

新缸中之脑 767

【环境搭建】使用openSfM+MVSNet重建稠密点云

本帖详细介绍了如何使用openSfM+MVSNet对真实采集的数据进行稀疏重建与稠密重建,并针对一些真实场景下可能遇到的问题进行了整理。

YuhsiHu的博客 1973

基于PLC的图书馆机器人设计与仿真

本文设计了一种基于PLC的图书馆机器人系统,该系统能提升图书馆自动化管理水平,选用西门子S7-1200系列PLC作为核心控制单元,结合电机驱动、传感器采集以及超声波避障等技术,设计出机器人行走、图书识别与分拣的功能模块,系统借助条形码扫描模块获取图书信息,将其分析后与设定的存放位置做对比,精准达成图书的存取和归还。仿真结果显示,机器人执行任务时运动控制响应时间是0.35秒,避障成功率为98.3%,图书识别准确率高达99.4%,在控制系统方面,运用STEP7-MICRO/WIN软件编程,结合WINCC设计组态

weixin_44553616的博客 1926

js与shader通信

webgl开发中,很多功能效果呀还是必须得要shader才能实现,shader我这边用的glsl写的,webgl三维框架用的three,既然GPU编程肯定要与CPU通信,这边我自己研究出了比较好用的通讯方式 1.一般类似传值 一.js传值: let tempIndex=1; const hzbb =shader.uniformLocati...

u013172864的博客 719

态路小课堂丨三款800G光模块方案介绍—SR8/DR8/2FR4

800G QSFP-DD 2FR4光模块使用CWDM4波长(1271/1291/1311/1331nm),单通道速率为100G,通过MUX减小光纤的数目,其光学接口采用CS接口或双芯LC接口。

poposu的博客 2390

Cesium 与 Babylon.js 可视化 glsl 特效篇(二十八)

cesium

haibalai2009的博客 209

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

锂电池SOH预测 | 基于BP神经网络的锂电池SOH预测(附matlab完整源码)

天天酷科研的博客 1114

HyperLynx(十五)多板仿真

在对话框的“Design file#1”下拉列表中选择“B00,Mainboard”,在其下方的“Reference designators”列表中选择元器件“J1”,然后在“Designfile#2”下拉列表中选择“BO1、RAM1”,在其下方的“Refer ence designators”列表中选择元器件“J1”,单击“Insert”按钮,为这两个元器件建立互连映射。在“Assign Models”对话框中,选择“B00 Motherboard”,将“U16.B12”设置为输出。

小幽余生不加糖 5062

Cesium 与 Babylon.js 可视化 glsl 特效篇(四)

cesium

haibalai2009的博客 285

新手必读!2025最全AI智能体入门手册,50个问题全讲透

感知(Perception):能读取环境,比如读取网页数据、识别用户输入、接入 API;思考(Reasoning/Planning):理解任务目标,规划出行动步骤;行动(Action):调工具、查资料、发消息、写入数据库……直接执行任务。有了这三步,智能体才不是“一个会说话的大模型”,而是真正的“能落地执行的工作代理人”。多个 Agent 分工协作,每个智能体负责一个角色或任务节点,像一个“虚拟团队”。一个爬数据的 Agent,一个提炼要点的 Agent,一个撰写报告的 Agent,

互联网架构师笔记 1974

WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:用鼠标控制点位

/ 设置attribute 变量。//解决坐标原点位置的差异。// 声明颜色 rgba。// 解决y 方向的差异。// 解决坐标基底的差异。// 获取着色器文本。

Wang的专栏 510

【C++】【STL算法】数据窄化及代码安全性

本文系统探讨了C++工程中数据窄化(narrowing conversion)的隐患与解决方案。数据窄化指将高精度/大范围类型转换为低精度/小范围类型,虽语法合法但会导致静默精度损失。其危险性体现在:错误隐蔽、STL会放大问题、数值错误具有传播性。现代C++要求窄化必须显式声明,文中提出四种工程解决方案:显式转换、边界统一转换、范围检查转换和使用GSL工具。建议在系统边界集中处理窄化,保持计算链路类型一致性,并通过分层策略(建模用double,控制用float)确保数值稳定性。核心思想是让窄化成为清晰可控的

Double Galaxy 80

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Kotlin/Wasm动画开发:WebGL集成与性能优化

Kotlin/Wasm(WebAssembly)是Kotlin生态系统中新兴的跨平台解决方案,它允许开发者将Kotlin代码编译为WebAssembly格式,在浏览器中高效运行。WebGL(Web图形库)作为基于OpenGL ES的Web标准,为网页提供硬件加速的3D和2D图形渲染能力。本文将详细介绍如何在Kotlin/Wasm项目中集成WebGL实现高性能动画,并提供实用的性能优化策略。 ##...

gitblog_00131的博客 900

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

基于Qt与WebAssembly的医学影像Web端三维可视化实践

WebAssembly(Wasm)作为一种可在现代浏览器中高效运行的低级字节码格式,其核心原理是将C/C++等语言编译成接近原生性能的二进制模块,从而突破了JavaScript在计算密集型任务中的性能瓶颈。这项技术的核心价值在于,它使得开发者能够将成熟的、高性能的本地代码库(如医学影像处理算法)无缝迁移至Web平台,无需用户安装插件或客户端,极大地提升了复杂应用的可访问性和部署便利性。在工程实践中,结合Qt框架的跨平台能力与Emscripten工具链,开发者可以构建出具备桌面级性能的Web应用。其典型应用场

weixin_38166557的博客 352

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

从零构建C语言Web游戏引擎:ECS架构与WebAssembly跨平台实践

游戏引擎是驱动现代电子游戏的核心软件框架,其核心原理在于高效地管理游戏对象、处理资源并驱动渲染循环。在追求极致性能与可控性的场景下,开发者常选择C语言这类贴近硬件的系统级语言,以实现对内存、计算资源的精细掌控。其技术价值在于能够构建轻量、高性能且可深度定制的引擎核心。随着Web技术的演进,WebAssembly(Wasm)作为一种可在浏览器中高效运行的二进制指令格式,为高性能计算密集型应用打开了新的大门。这使得将使用C/C++等语言编写的、依赖特定架构模式(如实体-组件-系统)的复杂游戏逻辑,无需重写即可部

weixin_34126557的博客 417

Cesium 与 Babylon.js 可视化 glsl 特效篇(四十三)

cesium

haibalai2009的博客 239

Cesium 与 Babylon.js 可视化 glsl 特效篇(二)

cesium

haibalai2009的博客 328

如何向GLSL中传入多个纹理

http://blog.youkuaiyun.com/huawenguang/article/details/41245871 如何向GLSL中传入多个纹理 这几天在研究如何实现用GLSL对多个纹理进行融合处理,发现除了第一个纹理之外其它的纹理参数都无法传递到GLSL中去,在网上找了很久终于是发现了问题所在,记录一下供大家参考。 如下程序,我们在GLSL的fragment着色

qhexin的专栏 1293

使用 Babylon.js 在 HTML 页面加载 3D 对象

五一 Windwos Blogs 推了一篇博客, Babylon.js v3.2 发布了。因为一直有想要在自己博客上加载 3D 对象的冲动,这两天正好看到了,就动手研究研究。本人之前也并没有接触过 WebGL ,这方面算是知识盲区,需求完成之后感觉非常炫酷,顺手写篇博客记录下来。不得不说 3D 打印和 VR 慢慢的开始走进平时的生活了,技术的成熟与硬件成本的变低,结合内容跨平台共享与各种...

ahuihun5901的博客 789

WebGL之旅(二)向shader中传递数据(attribute和uniform)

一 绘制鼠标点击过的位置当鼠标点击canvas时,记录点击位置,然后将所有点击过的位置都绘制一个红点。<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>WebGL</title> </head> <body onload="main()"> <canvas id="container"

寒风的技术博客 5289

【qt openGL入门笔记】OSG着色器、纹理、变换

本篇的目的仅是为了展示OSG场景图下也可以单独处理着色器、纹理、变换。

ocy的博客 241

第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算

本文仅保留 CustomShader 通道,用 20 行 GLSL 实现沿建筑高度向上的扫描光带。核心在于着色器完全接管颜色,忽略 material.diffuse,直接以 u_baseColor 为起点重绘。动画时钟由 Cesium 的帧率驱动,故在 30fps 机器上慢一倍、144fps 上快 2.4 倍。诡异现象——加青色光致红分量变暗——源于颜色叠加的线性混合逻辑。本篇代码可调性强,不依赖属性数据,是四篇中最具通用性的风格化实现。

总得学点什么的博客 261

第96篇:三维数据加载-城市建筑白模样式+着色器——让色带按体量上色,最白的那档却涂不上去

本文解析了Cesium中Cesium3DTileStyle与CustomShader在白模上叠加的管线顺序:风格着色(style)在片元着色器中出现两次——首次在materialStage设置初始颜色,第二次在cpuStylingStage执行。由于REPLACE模式下model_colorBlend经ceil后恒为1,导致第二次乘法无效,使最亮色带“纯白”失效。同时,高度渐变仅增不减因着色器逻辑未归一化,且默认参数已过曝。两条通道非简单叠加,而是交错影响,揭示了渲染管线的深层机制。代码开源可复用。

总得学点什么的博客 617
上一篇: WebGL笔记: 2D和WebGL坐标系对比和不同的画图方式, 程序对象通信,顶点着色器,片元着色器
下一篇: WebGL笔记:WebGL中JS与GLSL ES 语言通信,着色器间的数据传输示例:用鼠标控制点位
Wang's Blog
博客等级 码龄12年 7438粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值