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

2023-09-21 22:58:02

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是浮点的意思
更多推荐

数据结构和算法(8):搜索树(二叉搜索树和AVL树)

查找所谓的查找或搜索,指从一组数据对象中找出符合特定条件者,这是构建算法的一种基本而重要的操作。其中的数据对象,统一地表示和实现为词条(entry)的形式;不同词条之间,依照各自的关键码(key)彼此区分。循关键码访问:查找的过程与结果,仅仅取决于目标对象的关键码。词条template<typenameK,typena

【MongoDB】docker部署社区版(一)

0、背景介绍项目中使用MongoDB了,服务器挂掉,自己在本地搭一个试试。1、版本选择首先有社区版和和商业版。我选的是社区版。链接:https://hub.docker.com/r/mongodb/mongodb-community-server/tags1.1、标签选择看到标签有两个大类,一个是Ubuntu一个是ub

Spring MongoDB

为什么选择MongoDB,而不是其它的数据库。在SQL和NoSQL之间有一个大的争论。在SQL中,创建Tables。在NoSQL中,我们不维持这个结构。为什么这样重要。因为SQL在19世纪70年代变得流行的时候,在那时存储是昂贵的。我们需要确保使用最小的存储,这样我们可以存储最大量的数据。这是SQL类型表的意义。在当前

网络编程day04(网络属性函数、广播、组播、TCP并发)

今日任务对于newfd的话,最好是另存然后传入给分支线程,避免父子线程操作同一个文件描述符1.广播:接收端代码:#include<stdio.h>#include<string.h>#include<stdlib.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socke

如何通过一键导出导入数据实现批量重命名文件名称

在日常办公中,我们经常需要对大量的文件进行重命名,以便更好地管理和查找文件。而且,有时候我们还需要将文件名称翻译成其他语言,以适应不同的工作需求。如何高效地完成这项任务呢?接下来,我将介绍一种方法,让你事半功倍。首先,你需要下载并安装一个名为“固乔文件管家”的软件。这是一款功能强大的文件管理工具,可以帮助你批量改名文件

山洪灾害预警方案(山洪预警解决方案的组成)

​随着气候变化的不断加剧,山洪灾害在许多地区成为了极具威胁性的自然灾害之一。为了帮助地方政府和居民更好地预防和应对山洪灾害,我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案,并成功在某地区进行了部署。案例背景:我们选择了某山区作为实际部署的案例。这个地区常年受山洪的威胁,由于地处偏远,传

使用 Verilator 进行 Verilog Lint

FPGA设计是无情的,所以我们需要利用能获得的任何软件进行检查。Verilator是一个Verilog仿真器,还支持linting:静态分析设计中的问题。Verilator不仅可以发现综合工具可能忽略的问题,而且运行速度也很快。Verilator也非常适合使用SDL进行图形仿真。安装VerilatorLinuxVeri

C++ Primer Plus 第七章笔记

目录函数基本知识没有返回值的函数:void函数有返回值的函数:函数原型1.为什么需要函数原型?2.函数原型的语法3.函数原型的功能按值传递函数参数形参和实参局部变量参数问题使用const指针参数调用自身的函数(递归)指向函数的指针1.获取函数的地址2.声明函数指针3.使用函数指针来调用函数函数基本知识要使用C++函数必

分布式协议与算法——Raft算法

目录Raft算法领导者选举有哪些成员身份?领导者选举流程选举细节节点之间如何通信什么是任期选举有哪写规则随机超时时间是什么小结日志复制如何理解日志如何复制日志如何实现日志的一致小结节点成员变更成员变更的问题如何通过单节点变更解决成员变更的问题小结Raft小结Raft算法Raft算法属于Multi-Paxos算法,它是在

2023年贵州省职业院校技能大赛高职组信息安全管理与评估竞赛试题

2023年贵州省职业院校技能大赛高职组信息安全管理与评估竞赛试题第一阶段竞赛项目试题根据信息安全管理与评估技术文件要求,第一阶段为网络平台搭建与网络安全设备配置与防护。本文件为信息安全管理与评估项目竞赛-第一阶段试题。介绍竞赛阶段任务阶段竞赛任务第一阶段平台搭建与安全设备配置防护任务1网络平台搭建任务2网络安全设备配置

【SQL】MySQL中的窗口函数(开窗函数)

窗口函数是MYSQL8.0新增的聚合函数:多行变一行,常见的sum,count,max,min窗口函数:行数不变,常见的row_number,rank语法格式:窗口函数(表达式)over(partitionby…orderby…frame_clause)partitionby是分区,类似于groupby,如去掉相当于对

热文推荐