WebGL笔记:WebGL中的顶点着色器尺寸,颜色的修改

WebGL编程指南笔记-第二章 WebGL入门 阅读详情

顶点着色器尺寸修改

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

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

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

<script type="module">
    // 这里的 utils.js 参考之前博文,不做重复阐述
	  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);
	
	  // 在 js 中 获取 attribute 变量
	  const a_Position = gl.getAttribLocation(gl.program, "a_Position");
      const a_PointSize = gl.getAttribLocation(gl.program, "a_PointSize");

	  // 存储顶点数据的数组
	  const a_points = [
	    { x: 0, y: 0, size: 10 },
	  ];
	
	  render();  
	
	  // 渲染方法
	  function render() {
	    gl.clearColor(0, 0, 0, 1); // 声明颜色 rgba
	    gl.clear(gl.COLOR_BUFFER_BIT); // 刷底色
	    a_points.forEach(({ x, y, size }) => {
	      gl.vertexAttrib2f(a_Position, x, y); 
	      gl.vertexAttrib1f(a_PointSize, size); // 这里修改尺寸大小
	      gl.drawArrays(gl.POINTS, 0, 1);
	    });
	  }

    // 鼠标点击事件
    canvas.addEventListener("click", ({ clientX, clientY }) => {
      const { left, top, width, height } = canvas.getBoundingClientRect();
      const [cssX, cssY] = [clientX - left, clientY - top];
      // 解决坐标原点位置的差异
      const [halfWidth, halfHeight] = [width / 2, height / 2];
      const [xBaseCenter, yBaseCenter] = [
        cssX - halfWidth,
        cssY - halfHeight,
      ];
      // 解决y方向的差异
      const yBaseCenterTop = -yBaseCenter;
      // 解决坐标基底的差异
      const [x, y] = [xBaseCenter / halfWidth, yBaseCenterTop / halfHeight];
      const size = Math.random() * 50 + 10;
      a_points.push({ x, y, size });
      render();
    });
	</script>
  • 这个和顶点位置的修改是类似的,上面的a_PointSize 是一个浮点类型的变量
  • 在上面的案例中,无论是控制点位的尺寸,还是控制点位的位置,实际上都是对attribute变量的操控
  • 那我们如果想要再改变顶点的颜色呢?那就不能再用attribute限定符了,因为attribute限定符限定的就是顶点相关的数据

顶点着色器颜色改变

  • 首先,限定颜色变量的限定符叫uniform
  • 基于上述代码结构,下面只添加或修改关键部分代码

1 )在片元着色器脚本中定义相关代码

<script id="fragmentShader" type="x-shader/x-fragment">
    precision mediump float;
    uniform vec4 u_FragColor;
    void main() {
        gl_FragColor = u_FragColor;
    }
</script>
  • 在片元着色器里把控制顶点颜色的变量暴露出来
  • 第一行的precision mediump float 是对浮点数精度的定义,mediump 是中等精度的意思,这个必须要有,不然画不出东西来
  • 上面的uniform就是咱们刚才说过的限定符,vec4是4维的变量类型,u_FragColor就是变量名

2 )在js中获取片元着色器暴露出的uniform变量

<script type="module">
  const u_FragColor = gl.getUniformLocation(gl.program,'u_FragColor'); // 关键代码
</script>
  • 上面的 getUniformLocation() 方法就是用于获取片元着色器暴露出的 uniform 变量的
  • 其第一个参数是程序对象,第二个参数是变量名
  • 这里的参数结构和获取attribute变量的 getAttributeLocation() 方法是一样的

3 )修改uniform 变量

// 设置随机颜色
const color = new Float32Array([
    Math.random(),
    Math.random(),
    Math.random(),
    1.0
]);

gl.uniform4fv(u_FragColor, color); // 在合适的地方进行修改:render方法中的 arr.forEach 循环中处理
  • 在上面我们使用 uniform4fv() 方法修改的顶点颜色,也可以用 uniform4f() 方法一个个的写参数
  • uniform4f 中,4 是有4个数据,f 是float 浮点类型,就是r、g、b、a 这四个颜色数据, 如:gl.uniform4f(u_FragColor,1.0,1.0,0.0,1.0);
  • uniform4fv 中,4f 的意思和上面一样,v 是vector 矢量的意思,这在数学里就是向量的意思。由之前的4f可知,这个向量由4个浮点类型的分量构成
  • 在修改uniform变量的时候,这两种写法是一样的
    gl.uniform4f(u_FragColor,1.0,1.0,0.0,1.0);
    //等同于
    const color=new Float32Array([1.0,1.0,0.0,1.0]);
    gl.uniform4fv(u_FragColor,color);
    
    • uniform4f() 和uniform4fv() 也有着自己的同族方法,其中的4 可以变成1|2|3
    • uniform4fv() 方法的第二个参数必须是Float32Array 数组,不要使用普通的 Array 对象
    • Float32Array 是一种32 位的浮点型数组,它在浏览器中的运行效率要比普通的 Array 高很多
Xilinx IP核 Block Memory Generator v8.4 的使用 本文主要介绍如何使用并初始化 Xilinx 提供的IP核 Block Memory Generator v8.4`,为了确保成功初始化,还对其进行了一个简单的仿真,更多细节请参考官方手册。 阅读详情

相关推荐

机器学习——径向基函数(RBF)神经网络

目录 一、什么是基函数 二、什么是径向基函数 三、为什么RBF神经网络使用一个径向基函数作为隐含层的激活函数 四、参数训练 五、RBF网络vs BP网络和 SVM 一、什么是基函数 著名的傅里叶变换是指:n个有参(权值)的正、余弦三角函数基的和式可以等价的表示任意一个周期函数,这里的“基”和我们数学中说的坐标基或向量基含义相同,即坐标空间中任意一个向量都可以用基向量的线性和表示出来。 因此,我们引入函数空间的概念,函数空间中的每个连续函数可以表示为基函数的线性组合,就像向量空间中的每..

CHWB2580的博客 6273

WEBGL(4):动态绘制点并根据详细自定义颜色

根据鼠标点击的坐标,实现方块颜色进行变化。

u013938578的博客 524

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

【愚公系列】2023年12月 WEBGL专题-着色器

着色器(Shader)是一种编程语言,用于描述如何对场景中的对象进行渲染。它们被用于计算每个像素的颜色、亮度、反射、阴影、透明度等可视化效果。着色器可以被应用于3D模型、2D图形和视频动画中,以创建各种不同的效果和动画。着色器可以被绑定到渲染管道中的不同阶段,如顶点着色器、像素着色器、几何着色器等,以产生各种不同的效果。它们通常使用专门的编程语言,如OpenGL Shading Language(GLSL)或高级着色语言(HLSL)。

愚公智库 56万+

金融波动预测:GARCH模型实战解析与ARIMA对比

本文深入解析GARCH模型在金融波动预测中的实战应用,并与传统ARIMA模型进行对比。通过沪深300指数日收益率数据的案例分析,展示GARCH模型如何有效捕捉波动聚集效应,提升极端波动预测准确率。文章包含Python代码实现、参数解读及模型选择指南,为量化交易者提供实用的波动率建模解决方案。

weixin_29098367的博客 192

【一步到位】Android Studio 实现安卓连接阿里云物联网云平台

最新版本目前是Android Studio Iguana | 2024.1.2,你可以到官网上去找之前的版本,手上有工作项目的不要去轻易尝试,说不定你就编译失败了,失败了也不要担心,解决就可以了。

m0_73799445的博客 1万+

WebGL - 着色器扫盲

全文都是知识点归纳和摘抄,没有个人理解!

奇怪的人类 1161

汇川伺服驱动器参数优化实战指南

本文详细介绍了汇川伺服驱动器参数优化的实战技巧,涵盖控制模式选择、电子齿轮比调整、刚性匹配与振动抑制等关键内容。通过实际案例和实用技巧,帮助工程师快速掌握伺服驱动器参数调校方法,提升设备运行精度和稳定性。特别针对高精度定位和高速响应场景提供了专业指导。

weixin_29070721的博客 738

大白话解释前端的引擎、合批和shader等概念

偶尔听到客户端聊到这些技术方案、优化问题的时候,如果不是非常了解客户端的技术,会被绕进去而停留在一个名词阶段而不甚理解。比如只知道小图片打成图集有利于优化,却不知道为什么。其实抛开比较具体的技术细节,这个过程是可以用比较纯逻辑的流程来描述的。这样的描述可能在专业的前端眼里看来很浅显,但对没有长时间前端经验却有程序经验的人来说是一个很好的理解 “纲领”。写下来也是为了以后自己能时不时翻开想起。因为也是自己的笔记,所以就想到哪写到哪了。至此对标题的大概介绍完毕,内容基于本人的粗浅了解,欢迎指正。

weixin_42445065的博客 1130

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1670

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1549

threeJs着色器ShaderMaterial以及统一着色语言GLSL语法基本介绍

好啦,到这里我们详细介绍了three.js库中的着色器ShaderMaterial和统一着色语言GLSL的基本语法。首先介绍了ShaderMaterial在three.js中的地位以及功用。它是一种特殊的材质书写方式,让你可以编写自定义着色器。ShaderMaterial给予了我们底层的、未过滤的访问权,让我们可以编写自己的顶点(vertex)和片段(fragment)着色器程序。接着深入解析了统一着色语言GLSL(OpenGL Shading Language)的语法基础。

jieyucx的博客 3365

等保测评-瀚高数据库

一般适用于等保测评

m0_54146694的博客 1634

WebGL简介

大家好,我是南木元元,热衷分享有趣实用的文章。HTML的元素为JavaScript提供了动态创建图形的API。第一种是Canvas,一般只能做2d操作,用canvas.getContext(“2d”)来建立一个CanvasRenderingContext2D二维渲染上下文。第二种是WebGL,通过canvas.getContext(‘webgl’)就能获取WebGL的3d上下文,进行3D的渲染。这两种都是常用的可视化方式,本文主要来介绍一下WebGL的使用。

~~~ 8832

SAP B1中文培訓教材_SDK

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

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WebGL - 颜色和纹理

首先,将顶点坐标传入着色器,需要遵循以下几步 1、创建缓冲区对象; 2、将缓冲区对象绑定到target上; 3、将顶点坐标数据写入缓冲区对象; 4、将缓冲区对象分配给对应得 attribute变量; 5、开启 attribute变量; 1、非坐标数据传入顶点着色器 所以将多个顶点相关得数据通过传冲去对象传入顶点着色器,其实只需要每种数据重复以上步骤即可; 首先,需要再顶点着色器中定义可以接收顶...

ithanmang 920

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【笔记】WebGL编程指南学习(4)

WebGL编程指南学习(4) 4. 最后一块拼图 在学会处理顶点,包括处理顶点的坐标、Javascript和WebGL管线的数据通信、坐标变换之后,还需要处理顶点的其他数据——如颜色等。此外,还需要处理将图像(或纹理)映射到图形或三维对象表面上。这就是WebGL的最后一块拼图。 将顶点的其他(非坐标)数据(如颜色)传入顶点着色器 发生在顶点着色器和片元着色器之间的从图形到片元的转化,又称为图元光栅化 将图像(或称纹理)映射到图形或三维对象的表面上 4.1 将非坐标数据传入顶点着色器 4.1.1 第一个例

饮冰室 1479

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

09 WebGL通过uniform变量修改点的颜色

上一节通过点击绘制点,这一节接着上一节来修改颜色,到这一节关于点的就写完了。案例查看地址:点击这里&lt;!doctype html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset="UTF-8"&gt; &lt;meta name="viewport" content="width=device-widt

现在学习也不晚 5423

WebGL初识

WebGL,是一项用来在网页上绘制和渲染复杂三维图形,并允许用户与之进行交互的技术。WebGL通过JavaScript操作OpenGL接口的标准,把三维空间图像显示在二维的屏幕上。

gghhb12的博客 1828

webgl第22课-颜色与纹理中-将非坐标数据传入顶点着色器

需要电子档书籍可以Q群:828202939   希望可以和大家一起学习、一起进步!!纯手打!! 所有的课程源代码在我上传的资源里面,本来想设置开源,好像不行!博客和专栏同步! 如有错别字或有理解不到位的地方,可以留言或者加微信15250969798,在下会及时修改!!!!! 上一节课我们学习了复合变换动画的基础上,使用按钮来控制三角形的旋转速度 这一节课我们将学习新的章节颜色与纹理中-将非...

谷子的博客 3006

WebGL笔记(七):贴图(笔记终结)

上篇提到过关于贴图的两个限制: 1、跨域安全限制 跟AJAX之类差不多,但是没有测试根目录下具有安全配置文件(一些xml)的情况。当然,不出意外,本地浏览(file协议)调用相对路径图片也是不可以的。所以,连测试只能在一个web平台下进行。 2、图片格式问题 MDN上有个提示: https://developer.mozilla.org/en/WebGL/Using_textures_i...

weixin_30470643的博客 320

WebGL笔记:WebGL的基本绘图原理

/ 设置attribute 变量。//修改attribute 变量。// 声明颜色 rgba。// 存储顶点数据的数组。// 获取着色器文本。

Wang的专栏 522

webgl基础:着色器基础

前言:(十分重要) 上节文章中,跟大家分享了一下如何入门 webgl 并在画布上绘制一个点。 诚然,我们看到的流程是十分繁琐的。 这里想说明的一点是,webgl 基础很类似于 JavaScript 基础。 在学习 JavaScript 的时候如果直接上手 jquery、vue、react、angular…… 想必之后的天花板会非常非常低。 因为学习曲线决定了上手难度,而基础决定了天花板高度。 学习 webgl 可能在前期会比较麻烦,也会有很多难以理解的知识点。像:光线、3d坐标、矩阵变换、矩阵处理(乘积、点

YancyCathy的博客 554

WEBGL看完你就会了(14)---绘制彩色三角形

WebGL顶点属性缓存与彩色图形绘制

简单Cere 1576

webgl第23课-颜色与纹理中-将非坐标数据传入顶点着色器(二)

需要电子档书籍可以Q群:828202939   希望可以和大家一起学习、一起进步!!纯手打!! 上一节课我们学习了   颜色与纹理中-将非坐标数据传入顶点着色器 这一节课我们将学习  颜色与纹理中-将非坐标数据传...

谷子的博客 1543

WEBGL入门

gl.clear(g.COLOR_BUFFRE_BIT),清理绘图区域实际上在清理颜色缓冲区(color buffer),传递的gl.COLOR_BUFFER_BIT就是在告诉WebGL清理颜色缓冲区。另外还有一个方法texture2D,第一个参数是纹理数据,第二个参数是纹理坐标,这个方法就是在纹理数据中取出当前片段对应在纹理数据中位置上的数据颜色。必须注意的是,如果WebGL需要的参数是浮点类型,例如10.0。一般用attribute变量来表示一些顶点的数据,如:顶点坐标,法线,纹理坐标,顶点颜色等。

Kerryliuyue的博客 1878

WebGL 纹理——在矩形表面贴上图像

WebGL要进行纹理映射,需遵循以下四步: 1. 准备好映射到几何图形上的纹理图像。 2.为几何图形配置纹理映射方式。 3.加载纹理图像,对其进行一些配置,以在WebGL中使用它。 4.在片元着色器中将相应的纹素从纹理中抽取出来,并将纹素的颜色赋给片元。接下来,我们来仔细研究上述第1步到第4步。第1步中准备的纹理图像,可以是浏览器支持的任意格式的图像。你可以使用任何照片第2步指定映射方式,就是确定“几何图形的某个片元”的颜色如何取决于“纹理图像中哪个(或哪几个)像素”的问题(即前者到后者的映

求上得中,求中得下 999
上一篇: 数据结构与算法之字典: LeetCode 1. 两数之和 (Ts, Py, Go版)
下一篇: WebGL笔记:WebGL中绘制圆点,设定透明度,渲染动画
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、付费专栏及课程。

余额充值