WebGL uniform变量、gl.getUniformLocation、gl.uniform4f及其同族函数相关介绍

news2024/12/24 9:31:23

目录

uniform变量命名规范

获取 uniform 变量的存储地址 gl.getUniformLocation

向uniform变量赋值 gl.uniform4f

​编辑 gl.uniform4f()的同族函数

demo:点击webgl坐标系的四个象限绘制各自不同颜色的点


uniform变量命名规范

var FSHADER_SOURCE =
  'uniform vec4 u_FragColor;\n' + 
  'void main() {\n' +
  '  gl_FragColor = u_FragColor;\n' +
  '}\n';

着色器将 uniform 变量 u_FragColor 赋值给 gl_FragColor,后者直接决定点的颜色,向 uniform 变量传数据的方式与向 attribute 变量传数据相似:首先获取变量的存储地址,然后在JS程序中按照地址将数据传递过去

获取 uniform 变量的存储地址 gl.getUniformLocation

可以使用以下方法来获取uniform变量的存储地址。

 var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
  if (!u_FragColor) {
    console.log('Failed to get the storage location of u_FragColor');
    return;
  }

这个函数的功能和参数与 gl.getAttribLocation() 一样,但是如果uniform变量不存在或者其命名使用了保留字前缀,那么函数的返回值将是null而不是-1(gl.getAttribLocation()在此情况下返回-1)。因此,在获取uniform变量的存储地址后,需要检查其是否为null

向uniform变量赋值 gl.uniform4f

有了uniform变量的存储地址,就可以使用WebGL函数 gl.uniform4f() 向变量中写入数据,该函数的功能和参数与 gl.vertexAttrib[1234]f() 类似

gl.uniform4f(u_FragColor, r, g, b, a);

 gl.uniform4f()的同族函数

gl.uniform4f()也有一系列同族函数。gl.uniform1f()函数用来传输1个值(v0),gl.uniform2f()传输2个值(v0和v1),gl.uniform3f()传输3个值(v0,v1和v2)。

demo:点击webgl坐标系的四个象限绘制各自不同颜色的点

var VSHADER_SOURCE =
  'attribute vec4 a_Position;\n' +
  'void main() {\n' +
  '  gl_Position = a_Position;\n' +
  '  gl_PointSize = 10.0;\n' +
  '}\n';

var FSHADER_SOURCE =
  'precision mediump float;\n' +
  'uniform vec4 u_FragColor;\n' + 
  'void main() {\n' +
  '  gl_FragColor = u_FragColor;\n' +
  '}\n';

function main() {
  var canvas = document.getElementById('webgl');

  var gl = getWebGLContext(canvas);
  if (!gl) {
    console.log('Failed to get the rendering context for WebGL');
    return;
  }

  if (!initShaders(gl, VSHADER_SOURCE, FSHADER_SOURCE)) {
    console.log('Failed to intialize shaders.');
    return;
  }

  var a_Position = gl.getAttribLocation(gl.program, 'a_Position');
  if (a_Position < 0) {
    console.log('Failed to get the storage location of a_Position');
    return;
  }

  var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
  if (!u_FragColor) {
    console.log('Failed to get the storage location of u_FragColor');
    return;
  }

  // 注册点击事件
  canvas.onmousedown = function(ev){ click(ev, gl, canvas, a_Position, u_FragColor) };

  gl.clearColor(0.0, 0.0, 0.0, 1.0);

  // Clear <canvas>
  gl.clear(gl.COLOR_BUFFER_BIT);
}

var g_points = [];  // The array for the position of a mouse press
var g_colors = [];  // The array to store the color of a point
function click(ev, gl, canvas, a_Position, u_FragColor) {
  var x = ev.clientX; // x coordinate of a mouse pointer
  var y = ev.clientY; // y coordinate of a mouse pointer
  var rect = ev.target.getBoundingClientRect();

  x = ((x - rect.left) - canvas.width/2)/(canvas.width/2);
  y = (canvas.height/2 - (y - rect.top))/(canvas.height/2);

  // 将点存储到g_points数组中
  g_points.push([x, y]);
  // 将点的颜色存储到g_colors数组中
  if (x >= 0.0 && y >= 0.0) {      // 如果点在第一象限
    g_colors.push([1.0, 0.0, 0.0, 1.0]);  // 红色
  } else if (x < 0.0 && y < 0.0) { // 如果点在第三象限
    g_colors.push([0.0, 1.0, 0.0, 1.0]);  // 绿色
  } else {                         // 否则
    g_colors.push([1.0, 1.0, 1.0, 1.0]);  // 白色
  }

  // 每次绘制前必须显示清除
  gl.clear(gl.COLOR_BUFFER_BIT);

  var len = g_points.length;
  for(var i = 0; i < len; i++) {
    var xy = g_points[i];
    var rgba = g_colors[i];

    // 将点的位置传递给a_position变量
    gl.vertexAttrib3f(a_Position, xy[0], xy[1], 0.0);
    // 将点的颜色传递给u_FragColor变量
    gl.uniform4f(u_FragColor, rgba[0], rgba[1], rgba[2], rgba[3]);
    // Draw
    gl.drawArrays(gl.POINTS, 0, 1);
  }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/938068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pandas由入门到精通-数据清洗-扩展数据类型

pandas-02-数据清洗&预处理 扩展数据类型1. 传统数据类型缺点2. 扩展的数据类型3. 如何转换类型文中用S代指Series,用Df代指DataFrame 数据清洗是处理大型复杂情况数据必不可少的步骤,这里总结一些数据清洗的常用方法:包括缺失值、重复值、异常值处理,数据类型统计,分…

深入URP之Shader篇14: GPU Instancing

GPU Instancing 必须是同一个模型&#xff0c;材质也必须相同&#xff0c;但材质的参数可以不同&#xff08;使用MaterialPropertyBlock指定&#xff09;&#xff0c;然后基于一个Instanced Draw Call&#xff0c;一次性绘制多个模型。 参考&#xff1a;https://docs.unity3d.…

整合SSM:Mybatis层

SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架集由Spring、MyBatis两个开源框架整合而成.为了加深记忆学习,也为了后续资源方便使用.所以决定就对SSM做一个整合,首先是Mybatis层。 思路&#xff1a; 1.开发环境 基本环境&#xff1a; IDEA MySQL 8.0.22 Tomcat 9…

java实现生成RSA公私钥、SHA256withRSA加密以及验证工具类

前言&#xff1a; RSA属于非对称加密。所谓非对称加密&#xff0c;需要两个密钥&#xff1a;公钥 (publickey) 和私钥 (privatekey)。公钥和私钥是一对&#xff0c;如果用公钥对数据加密&#xff0c;那么只能用对应的私钥解密。如果用私钥对数据加密&#xff0c;只能用对应的公…

android系统启动流程之zygote(Native)启动分析

zygote有一部分运行在native,有一部分运行在java层&#xff0c;它是第一个进入java层的进程 zygote在启动时&#xff0c;在init.${ro.zygote}.rc脚本中&#xff0c;里面描述了zygote是如何被启动的&#xff0c; 当init进程解析到zygote.rc文件时&#xff0c;将根据解析出来的命…

蓝桥杯数论必考算法------快速幂

快速幂 目录 快速幂一.暴力解法 O(n∗b) 会TLE二.快速幂解法 O(n∗logb)2.1快速幂之迭代版 O(n∗logb)2.2快速幂之递归版 O(n∗logb) 三&#xff1a;快速幂练习(快速幂求逆元) 一.暴力解法 O(n∗b) 会TLE #include<iostream> using namespace std; int main() {int n;cin…

Matlab图像处理-减法运算

减法运算 图像减法也称为差分方法&#xff0c;是一种常用于检测图像变化及运动物体的图像处理方法。常用来检测一系列相同场景图像的差异&#xff0c;其主要的应用在于检测同一场景下两幅图像之间的变化或是混合图像的分离。 差影法 将同一景物在不同时问拍摄的图像或同一景…

飞腾E2000从eMMC或SD启动U-boot和系统

本文讲解了,如何设置uboot环境变量和编译linux内核,实现将uboot和系统同时放置到SD卡或eMMC后,从SD或者eMMC启动uboot,引导系统启动的过程。 同时使用E2000Q-demo,演示了从SD卡启动和从eMMC启动的过程。 1、制作MMC(eMMC/SD卡)启动镜像文件 1.1、重新编译u-boot.bin,…

印花税减半!上次调整A股全部涨停

财政部、税务总局公告&#xff0c;为活跃资本市场、提振投资者信心&#xff0c;自2023年8月28日起&#xff0c;证券交易印花税实施减半征收。 值得一提的是&#xff0c;8月初&#xff0c;证券时报、经济日报、央广网等三大官媒共同发声&#xff0c;为活跃资本市场、提振投资者信…

慢SQL调优第一弹——更新中

基础知识 Explain性能分析 通过explain我们可以获得以下信息&#xff1a; 表的读取顺序 数据读取操作的操作类型 哪些索引可以被使用 哪些索引真正被使用 表的直接引用 每张表的有多少行被优化器查询了 1&#xff09;ID字段说明 select查询的序列号&#xff0c;包含一组数…

Matlab之统计一维数组直方图 bin 计数函数histcounts

一、语法 [N,edges] histcounts(X) [N,edges] histcounts(X,nbins) [N,edges] histcounts(X,edges) 解释&#xff1a; 1.1 [N,edges] histcounts(X) 将 X 的值划分为多个 bin&#xff0c;并返回每个 bin 中的计数以及 bin 边界。histcounts 函数使用自动分 bin 算法&am…

Visual Studio编译出来的程序无法在其它电脑上运行

在其它电脑&#xff08;比如Windows Server 2012&#xff09;上运行Visual Studio编译出来的应用程序&#xff0c;结果报错&#xff1a;“无法启动此程序&#xff0c;因为计算机中丢失VCRUNTIME140.dll。尝试重新安装该程序以解决此问题。” 解决方法&#xff1a; 属性 -> …

python实例方法,类方法和静态方法区别

为python中的装饰器 实例方法 实例方法时直接定义在类中的函数&#xff0c;不需要任何修饰。只能通过类的实例化对象来调用。不能通过类名来调用。 类方法 类方法&#xff0c;是类中使用classmethod修饰的函数。类方法在定义的时候需要有表示类对象的参数(一般命名为cls&#…

春秋云镜 CVE-2019-12422

春秋云镜 CVE-2019-12422 Shiro < 1.4.2 cookie oracle padding漏洞 靶标介绍 Apache Shiro是美国阿帕奇&#xff08;Apache&#xff09;软件基金会的一套用于执行认证、授权、加密和会话管理的Java安全框架。 Apache Shiro 1.4.2之前版本中存在安全漏洞。当Apache Shiro使…

BM80 买卖股票的最好时机(一)

目录 1.题目描述 2.题目分析 3.编写代码 4.总结 这是牛客网上的一道题目 1.题目描述 题目链接&#xff1a;买卖股票的最好时机(一)_牛客题霸_牛客网 (nowcoder.com) 2.题目分析 我们看到这个题目中一个数组表示每一天的股价&#xff0c;那么最大利润怎么算呢&#xff0c…

《入门级-Cocos2dx4.0 塔防游戏开发》---第七课:游戏界面开发(自定义Layer)

目录 一、开发环境 二、开发内容 2.1 添加资源文件 2.2 游戏MenuLayer开发 2.3 GameLayer开发 三、演示效果 四、知识点 4.1 sprite、layer、scene区别 4.2 setAnchorPoint 一、开发环境 操作系统&#xff1a;UOS1060专业版本。 cocos2dx:版本4.0 环境搭建教程&…

【核磁共振成像】部分傅里叶重建

目录 一、部分傅里叶重建二、部分傅里叶重建算法2.1 填零2.2 零差处理 一、部分傅里叶重建 在部分傅里叶采集中&#xff0c;数据并不是绕K空间中心对称收集的&#xff0c;而是K空间的一半是完全填充的&#xff0c;另一半只收集了一小部分数据。   部分傅里叶采集所依据的原理…

bindService的调用流程

使用bindService去调用service&#xff0c;如果有多个客户端调用&#xff0c;onBind方法只会被调用一次&#xff0c;由于bindService嗲处理中&#xff0c;AMS是一个中间商&#xff0c;猜测这个处理也是AMS里进行的&#xff0c;这里我们再看看bindService的调用流程 public clas…

剑指 Offer 19. 正则表达式匹配(C++实现)

剑指 Offer 19. 正则表达式匹配https://leetcode.cn/problems/zheng-ze-biao-da-shi-pi-pei-lcof/ 动态规划&#xff1a;通过dp数组剪枝 只需要对各种情况进行分类处理即可 vector<vector<int>> dp;bool helper(const string& s, const int i, const string&am…

R语言常用数学函数

目录 1. - * / ^ 2.%/%和%% 3.ceiling,floor,round 4.signif,trunc,zapsamll 5.max,min,mean,pmax,pmin 6.range和sum 7.prod 8.cumsum,cumprod,cummax,cummin 9.sort 10. approx 11.approx fun 12.diff 13.sign 14.var和sd 15.median 16.IQR 17.ave 18.five…