当前位置: 首页 > news >正文

WebGL笔记:矩阵缩放的数学原理和实现

矩阵缩放的数学原理

  • 和平移一样,以同样的原理,也可以理解缩放矩阵
  • 让向量OA基于原点进行缩放
    • x方向上缩放:sx
    • y方向上缩放:sy
    • z方向上缩放:sz
  • 最终得到向量OB


矩阵缩放的应用

  • 比如我要让顶点在x轴向缩放2,y轴向缩放3,轴向缩放4

1 )顶点着色器的核心代码

<script id="vertexShader" type="x-shader/x-vertex">attribute vec4 a_Position;// 列主序mat4 m4 = mat4(2.0, 0.0, 0.0, 0.0,0.0, 3.0, 0.0, 0.0,0.0, 0.0, 4.0, 0.0,0.0, 0.0, 0.0, 1.0);void main() {gl_Position = m4 * a_Position;}
</script>

2 )完整代码

<canvas id="canvas"></canvas>
<script id="vertexShader" type="x-shader/x-vertex">attribute vec4 a_Position;float sx = 2.0;float sy = 3.0;float sz = 4.0;// 列主序mat4 m4 = mat4(sx,  0.0, 0.0, 0.0,0.0, sy,  0.0, 0.0,0.0, 0.0, sz,  0.0,0.0, 0.0, 0.0, 1.0);void main() {gl_Position = m4 * a_Position;}
</script>
<script id="fragmentShader" type="x-shader/x-fragment">void main() {gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0);}
</script>
<script type="module">import { initShaders } from './utils.js';const canvas = document.getElementById('canvas');canvas.width = window.innerWidth;canvas.height = window.innerHeight;const gl = canvas.getContext('webgl');const vsSource = document.getElementById('vertexShader').innerText;const fsSource = document.getElementById('fragmentShader').innerText;initShaders(gl, vsSource, fsSource);const vertices = new Float32Array([0.0, 0.1,-0.1, -0.1,0.1, -0.1])const vertexBuffer = gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer);gl.bufferData(gl.ARRAY_BUFFER, vertices, gl.STATIC_DRAW);const a_Position = gl.getAttribLocation(gl.program, 'a_Position');gl.vertexAttribPointer(a_Position, 2, gl.FLOAT, false, 0, 0);gl.enableVertexAttribArray(a_Position);gl.clearColor(0.0, 0.0, 0.0, 1.0);gl.clear(gl.COLOR_BUFFER_BIT);gl.drawArrays(gl.TRIANGLES, 0, 3);
</script>
  • 使用 js 建立矩阵对象,并传递给着色器的方法参考之前博文,此处不再赘述
http://www.lryc.cn/news/254887.html

相关文章:

  • 处理器中的TrustZone之安全状态
  • 开发一款短剧视频小程序软件多少钱?
  • 『PyTorch学习笔记』分布式深度学习训练中的数据并行(DP/DDP) VS 模型并行
  • 揭秘C语言结构体:通往内存对齐的视觉之旅
  • java中可重入锁的作用是什么?
  • 适合炎热天气的最佳葡萄酒有哪些?
  • 软件工程 课后题 选择 查缺补漏
  • PyQt基础_011_对话框类控件QMessage
  • SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队
  • [LeetCode] 12. 整数转罗马数字
  • 深入了解Java Period类,对时间段的精确控制
  • 企业软件的分类有哪些|app小程序定制开发
  • 选择更好的Notes索引附件方式
  • Vue混淆与还原
  • R语言单因素方差分析+差异显著字母法标注+逐行详细解释
  • linux 消息队列apache-activemq服务的安装
  • 前端数据加密相关问题
  • Vue3中reactive和ref对比
  • 【尘缘送书第五期】Java程序员:学习与使用多线程
  • Linux C语言 34-库封装操作
  • JavaWeb-Tomcat
  • k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)
  • Spark低版本适配Celeborn
  • idea报错:Error:java: 不允许在使用 -release 时从系统模块 java.xml 导出程序包?
  • Vector Quantized Diffusion Model for Text-to-Image Synthesis
  • solidity实现ERC1155多代币标准
  • 10、外观模式(Facade Pattern,不常用)
  • <软考>软件设计师-3程序设计语言基础(总结)
  • C/C++---------------LeetCode第278. 第一个错误的版本
  • C语言三种循环输出9*9乘法表