WebGL系列 - 裁剪空间矩阵优化

2023-11-14

该系列仅为记录自己的学习相关知识。

以 2d 的顶点着色器为例

  <script  id="vertex-shader-2d" type="notjs">

  // an attribute will receive data from a buffer
  attribute vec4 a_position;

  // all shaders have a main function
  void main() {

    // gl_Position is a special variable a vertex shader
    // is responsible for setting
    gl_Position = a_position;
  }

</script>

我们知道,定义一个定点着色器,我们为了能够让我们定义的数据能够渲染到屏幕上,我们需要将屏幕中的点转化到裁剪空间中,以下是对应关系。

 裁剪空间            屏幕空间
   0, 0       ->   200, 150
   0, 0.5     ->   200, 225
 0.7, 0       ->   340, 150

会渲染出以下的图形

image-20211009005125727

我们会发现这个三角形是从中间开始,并且是朝向右上方的,是因为裁剪空间的x坐标范围是 -1 到 +1,而 (0,0) 在中心。

对于二维空间中的物体,我们更希望得到的是屏幕像素坐标而不是裁剪空间坐标。

<script id="vertex-shader-2d" type="x-shader/x-vertex">
        attribute vec2 a_position;
        
        uniform vec2 u_resolution;
        uniform mat3 u_matrix;
        
        void main() {
        
          // 从像素坐标转换到 0.0 到 1.0
          vec2 zeroToOne = position / u_resolution;
        
          // 再把 0->1 转换 0->2
          vec2 zeroToTwo = zeroToOne * 2.0;
        
          // 把 0->2 转换到 -1->+1 (裁剪空间)
          vec2 clipSpace = zeroToTwo - 1.0;
        
          gl_Position = vec4(clipSpace, 0, 1);
        }
</script>

因此对于输入的坐标点 (200, 150)( 200, 225)( 340, 150),我们可以渲染成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PnvdtZU3-1633759639041)(/Users/huayifeng/Downloads/image-20211009010603385.png)]

而WebGL默认为左下角为 (0,0)想要像传统 API 一样右上角为 (0,0),我们只需要将 Y 轴反转gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);

<script id="vertex-shader-2d" type="notjs">

      // an attribute will receive data from a buffer
      attribute vec2 a_position;
 
      uniform vec2 u_resolution;
    
      // all shaders have a main function
      void main() {
        // 从像素坐标转换到 0.0 到 1.0
        vec2 zeroToOne = a_position / u_resolution;
     
        // 再把 0->1 转换 0->2
        vec2 zeroToTwo = zeroToOne * 2.0;
     
        // 把 0->2 转换到 -1->+1 (裁剪空间)
        vec2 clipSpace = zeroToTwo - 1.0;
     
        gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);
      }
</script>

1633713038492

而为了能够更加简洁地描述,我们可以使用矩阵来进行描述

<script id="vertex-shader-2d" type="x-shader/x-vertex">
        attribute vec2 a_position;
         
        uniform mat3 u_matrix;
         
        void main() {
          // 使位置和矩阵相乘
          gl_Position = vec4((u_matrix * vec3(a_position, 1)).xy, 0, 1);
        }
</script>
var matrixLocation = gl.getUniformLocation(program, "u_matrix");

var m3 = {
  projection: function (width, height) {
    return [
      2 / width, 0, 0,
      0, -2 / height, 0,
      -1, 1, 1
    ];
  },
}

var matrix = m3.projection(gl.canvas.clientWidth, gl.canvas.clientHeight);

gl.uniformMatrix3fv(matrixLocation, false, matrix);

下面谈谈,关于以下式子的推导:
在这里插入图片描述

等价于以下式子,由于矩阵变化为从右到左。依次为

1.缩放到 [-1, 1]范围

2.放大2倍

3.x,y平移 -1

4.y轴反转
在这里插入图片描述

参考资料:GAMES101-现代计算机图形学入门-闫令琪

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WebGL系列 - 裁剪空间矩阵优化 的相关文章

  • Web自动化测试 —— cookie复用

    一 cookie简介 cookie是一些数据 存储于用户电脑的文本文件中 当web服务器想浏览器发送web页面时 在链接关闭后 服务端不会记录用户信息 二 为什么要使用Cookie自动化登录 复用浏览器仍然在每次用例开始都需要人为介入 若用
  • 考虑光伏出力利用率的电动汽车充电站能量调度策略研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据
  • 每天10个前端小知识 <Day 14>

    前端面试基础知识题 1 CSSOM树和DOM树是同时解析的吗 浏览器会下载HTML解析页面生成DOM树 遇到CSS标签就开始解析CSS 这个过程不会阻塞 但是如果遇到了JS脚本 此时假如CSSOM还没有构建完 需要等待CSSOM构建完 再去
  • Vue中下载不同文件常用的方式

    1 使用window open方法下载文件
  • 深入解析 YAML 配置文件:从语法到最佳实践

    一 认识YAML YAML YAML Ain t Markup Language 是一种人类可读的数据序列化语言 它的设计目标是使数据在不同编程语言之间交换和共享变得简单 YAML采用了一种简洁 直观的语法 以易于阅读和编写的方式表示数据结
  • 【前端】canvas图片加文字

    注释标记了操作步骤 import React Component createRef from react class CertifyImgRender extends Component bgRef createRef
  • webGL 中的平面着色

    我正在尝试在 webgl 中实现平面着色 我知道varying顶点着色器中的关键字将对该值进行插值并将其传递给片段着色器 我正在尝试禁用插值 我发现flat关键字可以做到这一点 但似乎不能在 webgl 中使用 flat varying v
  • 用于渲染视频的 2d 上下文与 WebGL

    我目前正在使用CanvasRenderingContext2D drawImage 将来自 RTC 媒体流的视频绘制到画布上 不幸的是 这会占用大量的 CPU 资源 使用以下方法执行此操作会性能更高吗WebGLRenderingContex
  • WebGL 中的透明纹理行为

    环境 WebGL Chrome 当使用透明 png 作为模型纹理时 我有以下行为 图像 A 树将建筑物隐藏在其后面 我看到了世界框纹理 它也隐藏自己 后面的分支不可见 同时 图像 B 工作正常 窗口是透明的 我可以看到后面的内容 A B 两
  • 如何检测用户是否在浏览器中启用了全屏

    当用户在 Chrome 或 FireFox 中启用全屏时 是否会触发一些 JavaScript 事件 我有 WebGL 应用程序 画布宽度和高度设置为一定大小 当用户启用全屏时 我想调整其大小 如果没有这样的事件 我是否应该开始研究用画布填
  • 未捕获的类型错误:无法解析模块说明符“三/示例/jsm/loaders/GLTFLoader.js”

    我很难理解为什么我的程序由于这个错误而崩溃 未捕获的类型错误 无法解析模块说明符 三 示例 jsm loaders GLTFLoader js 相对引用必须以 或 开头 我正在尝试使我的 html 文件与我创建的 serial js 文件进
  • 2D 缩放到 webgl 中的点

    我正在尝试使用 WebGL 更具体地说 是 regl 创建 2D 图形可视化 通过我当前的实现 我已经可以看到力布局应用于每个节点 这很好 当我尝试相对于当前鼠标位置进行缩放时 问题就出现了 根据我的研究 要实现这种行为 需要按以下顺序应用
  • 在 Three.js 中使用 CanvasRenderer 绘制线条比 WebGLRenderer 更平滑

    我一直遇到一个问题 即 Three js 的 CanvasRenderer 渲染线比 WebGLRenderer 平滑得多 WebGLRenderer 似乎没有应用抗锯齿功能 当我从 中获取 Three js 画布 线条 随机示例时http
  • WebGL 渲染抗锯齿

    我正在使用 webgl 和 javascript 有没有一种方法可以在不使用抗锯齿的情况下进行渲染 我需要每个像素都是纯色的 我当前的片段着色器非常简单 precision mediump float varying highp vec3
  • Three.js - 在自定义几何体上平滑兰伯特材质着色的问题

    我在 Three js 中创建了一个自定义几何体 现在 我想创建一个使用平滑阴影兰伯特材质的网格 使用循环 我创建了顶点数组 然后创建了面 然后我调用了 geometry computeCentroids geometry computeF
  • WebGL:Android 上对 OES_texture_float 的支持下降

    有谁知道减少对 WebGL 扩展的支持是怎么回事OES texture float多年来在Android上 https webglstats com webgl extension OES texture float platforms 0
  • 如何在 WebGL 中创建合适的圆角矩形?

    我试图实现答案这个问题 https stackoverflow com questions 43970170 bordered rounded rectangle in glsl但似乎有点问题 如果您打开他们的 ShaderToys 并尝试
  • Hello world WebGL 并行性示例

    围绕 WebGL 似乎有许多用于运行并行处理的抽象 例如 https github com MaiaVictor WebMonkeys https github com MaiaVictor WebMonkeys https github
  • WebGL - 如何传递无符号字节顶点属性颜色值?

    我的顶点由具有以下结构的数组组成 Position colour float float float byte byte byte byte 传递顶点位置没有问题 gl bindBuffer gl ARRAY BUFFER this vbo
  • 在每一帧上更新整个 VBO 是绘制许多变化的独特三角形的最有效方法吗?

    答复我之前的问题 https stackoverflow com questions 24592099 drawing many unique triangles with a single draw call for better per

随机推荐

  • KVM内核加载配置及技巧

    KVM 配置及技巧 加载KVM模块 1 检查加载状态 lsmod grep kvm若什么也没显示 说明还未加载 2 显示有哪些可加载模块 find lib modules name kvm 显示如下 lib modules 2 6 32 2
  • 宝塔面板linux在终端使用命令开启服务保持服务不关闭

    我们经常在宝塔面板终端开启服务 比如socket等服务时 如果关闭面板标签页或者关闭终端 服务也随之关闭了 要保持服务一直运行 就需要把终端进程放在linux后台执行 方法如下 1 先Ctrl z 将命令保持挂载 并且能够继续在终端输入其他
  • C语言经典100例题(42)--学习使用auto定义变量的用法

    目录 题目 问题分析 代码 运行结果 题目 学习使用auto定义变量的用法 问题分析 auto存储类型只对属于块的变量有效 auto变量具有自动存储期限 块作用域 并且无连接 auto存储类型几乎从来不用明确地指明 因为对于在块内部声明的变
  • 关于排水管道沉积模拟建模的想法

    首先管道沉积是一个较为复杂的过程 对其分析主要考虑了无机盐所造成的影响 在立项书中 已经给出了各种元素的占比 据此可推理出对沉积起着主导作用的化学反应 在排水管中原本的污水 所以考虑的重点方向就是在特定温度 特定流速下 无机盐的沉积量随时间
  • Shell脚本中字符串截取功能

    在Shell脚本编写中 有几个地方都是要用到字符串截取的功能 那将这块的内容进行下记录 1 字符串变量的截取操作 对字符串变量的截取操作一般都是通过 操作符 的方式进行 1 从指定位置index截取固定长度 格式 string start
  • Oracle中的锁

    Oracle数据库支持多个用户同时与数据库进行交互 每个用户都可以同时运行自己的事务 从而也需要对并发访问进行控制 Oracle也是用 锁 的机制来防止各个事务之间的相互影响 对并发访问进行控制的 保证数据的一致性和完整性 当一个事务或操作
  • 【工具】python代码编辑器--PyCharm下载安装和介绍

    PyCharm是一种Python IDE 集成开发环境 由JetBrains打造 它带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具 比如调试 语法高亮 项目管理 代码跳转 智能提示 自动完成 单元测试 版本控制等 此外
  • 【华为OD】

    华为OD试题注意事项 使用合适的编程语言 在华为OD机试中多数情况下使用C 或Java 按照题目要求进行编码 仔细阅读题目描述并理解要求 在编码前可以进行伪代码编写或画流程图有助于理解和排除逻辑错误 注意代码的规范性 注重代码的可读性和可维
  • Python有趣小程序代码

    1 打印心形 print n join join Love x y 4 if x 0 05 2 y 0 1 2 1 3 x 0 05 2 y 0 1 3 lt 0 else for x in range 30 30 for y in ran
  • Socket传输文件/传输图片(Windows)

    利用UDP socket 来传输文件与图片 流程图如下 主要流程 1 client端发送command请求 上传数据或者下载数据 选择文件路径 2 server端应答 start代表开始传输 no代表拒绝 3 fopen打开文件进行读取 f
  • ubuntu20使用Systemback克隆系统

    一 使用的工具 SystemBack 克隆系统 cdrtools 3 02 将systemback生成文件转换为iso Ventoy iso文件写入u盘 作为安装盘 文末有相关工具下载链接 二 SystemBak克隆系统步骤 1 安装Sys
  • 关于html中,刷新页面后<input>输入框内容不会被刷新的问题

    只需要在
  • 构建测试的体系化思维(高级篇)

    本文首发于个人网站 BY林子 转载请参考版权声明 00 引言 1 三个层次聊测试体系 测试人员缺乏体系化思维 新建产品团队或者新启项目 如何系统化地测试 组织级如何构建统一的测试体系 大家都接触过不计其数的测试 质量方面的文章或者培训课程
  • C++ Template

    引言 模板 Template 指C 程序设计设计语言中采用类型作为参数的程序设计 支持通用程序设计 C 的标准库提供许多有用的函数大多结合了模板的观念 如STL以及IO Stream 函数模板 在c 入门中 很多人会接触swap int i
  • android 手势检测(左右滑动、上下滑动)

    开发十年 就只剩下这套Java开发体系了 gt gt gt GestureDetector类可以让我们快速的处理手势事件 如点击 滑动等 使用GestureDetector分三步 1 定义GestureDetector类 2 初始化手势类
  • 共轭方式怎么判断_怎么判断共轭效应是吸电子共轭效应还是给电子共轭效应?吸电子基和给电子基是根据什么判断的?...

    谢邀 我想按照我的思路给你解答解答 我要祭出我的高等有机化学笔记了 先说一句 要笔记的 在老家放着 没法卖给你们 而且说实话不好好看书的人 给你笔记你也不会 共轭效应只是众多电子效应中的一种 先从共轭效应开始讲起吧 共轭效应是由于共轭体系的
  • 滤波器相位补偿

    概要 滤波器使用的过程中都会产生相位的改变 有时 相位的改变并不是我们想要的 例如 笔者在做Dolby Atmos的bass management的时候 希望将顶置的低频成分分割到左右通道或环绕通道 因为相位的缘故 叠加之前 左右通道或环绕
  • windows

    1 准备工作 准备U盘 格式化U盘 注意选择格式化的文件系统 可以鼠标右键C盘查看 然后将U盘格式化 好像是跟电脑引导模式相关UEFI gt NTFS 如果格式化的时候没有选对文件系统 那么在BIOS界面可能无法识别到U盘 进入官网下载制作
  • 04_kibana 7.4.2 安装和配置指南

    本文大纲 1 Kibana 的下载方式 1 官网直接下载 2 Linux 服务器直接下载 需要能够访问互联网的服务器 2 修改配置 3 kibana 的关闭和重启 首先 值得高兴的是kibana7 x 已经有官方中文的啦 更加方便我们的开发
  • WebGL系列 - 裁剪空间矩阵优化

    该系列仅为记录自己的学习相关知识 以 2d 的顶点着色器为例