webgl入门实例-向量在图形学中的核心作用

在图形学中,向量是描述几何、光照、运动等核心概念的基础工具。以下是向量在图形学中的关键应用和深入解析:


1. 向量的核心作用

  • 几何表示:描述点、方向、法线、切线等。
  • 空间变换:平移、旋转、缩放等操作依赖向量运算。
  • 光照计算:光线方向、反射向量、点积用于漫反射和镜面高光。
  • 物理模拟:速度、加速度、力的合成与分解。

2. 图形学中的向量运算

(1) 点积(Dot Product)的应用
  • 光照模型:计算光线与表面法线的夹角(Lambert漫反射):
    I = max ⁡ ( 0 , L ⋅ N ) ⋅ I light I = \max(0, \mathbf{L} \cdot \mathbf{N}) \cdot I_{\text{light}} I=max(0,LN)Ilight
    L 为光线方向 \ {L}为光线方向  L为光线方向 N 为法线 \ {N}为法线  N为法线 I light 为光强 I_{\text{light}}为光强 Ilight为光强
  • 背面剔除:若视线向量(\mathbf{V})与法线(\mathbf{N})的点积(\mathbf{V} \cdot \mathbf{N} > 0),则表面不可见。
  • 投影计算:将向量投影到另一向量(如阴影生成)。
(2) 叉积(Cross Product)的应用
  • 法向量计算:通过三角形两边的叉积求法线:
    N = ( v 1 − v 0 ) × ( v 2 − v 0 ) \mathbf{N} = (\mathbf{v}_1 - \mathbf{v}_0) \times (\mathbf{v}_2 - \mathbf{v}_0) N=(v1v0)×(v2v0)
  • 坐标系构建:生成切线空间(TBN矩阵)用于法线贴图:
    T = 切线 , B = N × T \mathbf{T} = \text{切线}, \quad \mathbf{B} = \mathbf{N} \times \mathbf{T} T=切线,B=N×T
(3) 归一化(Normalization)
  • 将向量转换为单位向量,确保方向计算不受长度影响:
    v ^ = v ∣ v ∣ \hat{\mathbf{v}} = \frac{\mathbf{v}}{|\mathbf{v}|} v^=vv
    (关键用于光线方向、法线等)

3. 向量在图形流水线中的角色

(1) 顶点处理
  • 模型变换:通过矩阵乘法(如MVP矩阵)将顶点从模型空间转换到裁剪空间:
    v clip = M V P ⋅ v model \mathbf{v}_{\text{clip}} = \mathbf{MVP} \cdot \mathbf{v}_{\text{model}} vclip=MVPvmodel
  • 法线变换:法线需用模型矩阵的逆转置矩阵变换,以保持垂直性:
    N world = ( M − 1 ) ⊤ ⋅ N model \mathbf{N}_{\text{world}} = (\mathbf{M}^{-1})^\top \cdot \mathbf{N}_{\text{model}} Nworld=(M1)Nmodel
(2) 光照与着色
  • Phong模型:结合环境光、漫反射(点积)、镜面反射(反射向量计算):
    R = 2 ( L ⋅ N ) N − L \mathbf{R} = 2(\mathbf{L} \cdot \mathbf{N})\mathbf{N} - \mathbf{L} R=2(LN)NL
  • 半程向量(Blinn-Phong):优化镜面高光计算:
    H = L + V ∣ L + V ∣ \mathbf{H} = \frac{\mathbf{L} + \mathbf{V}}{|\mathbf{L} + \mathbf{V}|} H=L+VL+V
(3) 屏幕空间操作
  • 视口变换:将NDC坐标映射到屏幕像素坐标:
    { x screen = ( x ndc + 1 ) ⋅ width 2 y screen = ( 1 − y ndc ) ⋅ height 2 \begin{cases} x_{\text{screen}} = (x_{\text{ndc}} + 1) \cdot \frac{\text{width}}{2} \\ y_{\text{screen}} = (1 - y_{\text{ndc}}) \cdot \frac{\text{height}}{2} \end{cases} {xscreen=(xndc+1)2widthyscreen=(1yndc)2height

4. 图形学特有问题与优化

(1) 精度问题
  • 浮点误差:使用高精度浮点(如double)或误差容忍比较(如glm::epsilonEqual)。
  • 归一化失效:零向量或极小向量的保护性处理:
    if (length(v) < 1e-6) discard;
    
(2) 向量插值
  • 重心坐标插值:在三角形内插值顶点属性(颜色、UV、法线):
    p = α v 0 + β v 1 + γ v 2 \mathbf{p} = \alpha \mathbf{v}_0 + \beta \mathbf{v}_1 + \gamma \mathbf{v}_2 p=αv0+βv1+γv2
  • 透视校正插值:在投影空间中需除以深度(w分量)保证正确性。
(3) 性能优化
  • SIMD指令:使用SSE/AVX加速向量运算(如Unity的Burst编译器)。
  • 预计算向量:如预生成环境贴图的辐照度向量。

5. 实际代码示例(GLSL/HLSL)

(1) 法线贴图解码
vec3 normal = texture(normalMap, uv).xyz * 2.0 - 1.0; // 从[0,1]映射到[-1,1]
normal = normalize(TBN * normal); // TBN为切线空间矩阵
(2) 反射光线计算
vec3 reflectDir = reflect(-lightDir, normal);
float specular = pow(max(dot(viewDir, reflectDir), 0.0), 32.0);
(3) 屏幕空间UV计算
vec2 screenUV = gl_FragCoord.xy / resolution;

6. 扩展:向量在高级图形技术中的应用

  • 光线追踪:光线方向向量与场景求交(如rayDir = normalize(target - origin))。
  • SDF(符号距离场):利用向量计算点到表面的最短距离。
  • 流体模拟:速度场(向量场)的平流与扩散。

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

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

相关文章

Redis 是如何保证线程安全的?

Redis 是如何保证线程安全的&#xff1f; Redis 是一个高性能的键值数据库&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。由于其性能优势&#xff0c;Redis 已经成为许多系统的核心组件之一。然而&#xff0c;很多开发者在使用 Redis 时&#xff0c;常常会问&#x…

Img2img-turbo 在2080Ti上的测试笔记

1. 介绍 [img2img-turbo]是[pytorch-CycleGAN-and-pix2pix]推荐的更新的图像变换的代码实现&#xff1b; 2. 配置信息 Conda环境名称&#xff1a;img2img-turbo 3. 问题描述 当前在我们尝试使用了官方推荐的训练命令在2080Ti上进行训练&#xff0c; 3.1 出现了 CUDA out …

代码随想录算法训练营第三十五天|416. 分割等和子集、698.划分为k个相等的子集、473.火柴拼正方形

今日题目 416. 分割等和子集 题目链接&#xff1a;416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 思考&#xff1a;本题要将数组分为两个子数组&#xff0c;且两个子数组和相等&#xff0c;因此首先可以想到的条件就是数组可分为两个&#xff0c;这要求数组元素数…

纯CSS实现自动滚动到底部

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>自动滚动到底部</title><style>*…

【新人系列】Golang 入门(十五):类型断言

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12898955.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Golang 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

AI大模型发展现状与MCP协议诞生的技术演进

1. 大模型能力边界与用户痛点&#xff08;2023年&#xff09; 代表模型&#xff1a;GPT-4&#xff08;OpenAI&#xff09;、Claude 3&#xff08;Anthropic&#xff09;、通义千问&#xff08;阿里云&#xff09;等展现出强大的生成能力&#xff0c;但存在明显局限&#xff1a…

深入理解Linux中的线程控制:多线程编程的实战技巧

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; POSIX线程&#xff08;Pthreads&#xff09; 是一种在 POSIX 标准下定义的线程库&#xff0c;它为多线程编程提供了统一的接口&#xff0c;主要用于 UNIX 和类 UNIX 系统&#xff08;如 Linux、MacOS 和 BS…

(mac)Grafana监控系统之监控Linux的Redis

Grafana安装-CSDN博客 普罗米修斯Prometheus监控安装&#xff08;mac&#xff09;-CSDN博客 1.Redis_exporter安装 直接下载 wget https://github.com/oliver006/redis_exporter/releases/download/v1.0.3/redis_exporter-v1.0.3.linux-amd64.tar.gz 解压 tar -xvf redis_…

鸿蒙应用元服务开发-Account Kit未成年人模式订阅和处理用户信息变更

一、概述 通过订阅用户信息变更&#xff0c;您可以接收有关用户及其账户的重要更新。当用户取消元服务的授权信息、注销华为账号时&#xff0c;华为账号服务器会发送通知到元服务&#xff0c;元服务可以根据通知消息进行自身业务处理。 二、用户信息变更事件介绍 三、订阅用…

buildroot构建根文件系统报错(已解决大部分问题)

title: buildroot构建根文件系统报错(set FORCE_UNSAFE_CONFIGURE1) author: cbus categories: 小知识 tags:小知识 abbrlink: 53691 date: 2025-04-20 08:03:00 错误1 set FORCE_UNSAFE_CONFIGURE1 在使用buildroot构建根文件系统时&#xff0c;一切按照文档的配置&#xff0…

7.QT-常用控件-QWidget|font|toolTip|focusPolicy|styleSheet(C++)

font API说明font()获取当前widget的字体信息.返回QFont对象.setFont(const QFont& font)设置当前widget的字体信息. 属性说明family字体家族.⽐如"楷体",“宋体”,"微软雅⿊"等.pointSize字体⼤⼩weight字体粗细.以数值⽅式表⽰粗细程度取值范围为[…

通过面向目标的奖励弥合人与机器人的灵活性差距

24年10月来自纽约大学的论文“Bridging the Human to Robot Dexterity Gap through Object-Oriented Rewards”。 直接通过人类视频训练机器人是机器人技术和计算机视觉领域的一个新兴领域。尽管双指机械手在双指夹持器方面取得了显著进展&#xff0c;但以这种方式让多指机械手…

C++入门篇(下)

目录 1、引用 1.1 引用概念 1.2 引用特性 1.3 常引用 1.4 使用场景 1.4.1 引用做参数 1.4.2 引用做返回值 1.5 引用和指针的区别 2、内联函数 2.1 概念 2.2 特性 3、auto关键字 4、基于范围的for循环 5、指针空值nullptr 5.1 C98 中的指针空值处理 5.2 C11 …

Multi-Query Attention (MQA) PyTorch 实现

和多头注意力机制的唯一区别&#xff1a;K、V在不同的head之间实现了复用&#xff0c;而对于不同的头&#xff0c;Q依然不同。 因此这里的代码和标准多头注意力的实现也是几乎完全一样&#xff1a; import torch import torch.nn as nn import torch.nn.functional as Fclass…

visual studio无法跳转到函数定义、变量定义、跳转函数位置不准问题解决

参考&#xff1a;https://blog.csdn.net/snakehacker/article/details/135438353 程序有时会出现大部分函数都不能准确的从头文件中正确定位到函数定位,这是因为数据库错乱造成的,可以通过重构数据库来解决,操作方法如下&#xff1a; 菜单栏&#xff1a;工具——选项 文本编辑…

Java优雅实现判空方法

在 Java 开发中&#xff0c;频繁的 if (obj ! null) 判空代码会导致代码冗余、可读性差&#xff0c;且容易遗漏判空导致 NullPointerException。以下从 语言特性、设计模式、工具类 和 编码规范 四个维度&#xff0c;结合实际案例&#xff0c;详解如何优雅处理空值问题。 一、…

京东百亿补贴杀入外卖市场:一场关乎即时零售未来的攻防战

当美团和饿了么在外卖市场双雄争霸十余年之际&#xff0c;京东突然以"百亿补贴免佣金"的组合拳高调入场。这场看似跨界的外卖大战&#xff0c;实则是互联网巨头对万亿级即时零售市场的生死争夺。 外卖只是表象&#xff0c;即时零售才是终极战场 京东黑板报4月10日官…

UNION和UNION ALL的主要区别

UNION和UNION ALL的主要区别在于处理重复数据和排序的方式。 UNION和UNION ALL都是SQL语言中用于合并两个或多个SELECT语句结果集的关键字。它们的主要区别如下&#xff1a; 1、对重复结果的处理&#xff1a;UNION在进行表链接后会筛选掉重复的记录&#xff0c;而UNION ALL不会…

七段码 路径压缩 并查集 dfs

12.七段码 - 蓝桥云课 将七个二极管映射为 1-7 开一个二维矩阵 为 相邻的边连上线 edge[1][2] edge[1][6] 1;edge[2][1] edge[2][3] edge[2][7] 1;edge[3][2] edge[3][4] edge[3][7] 1;edge[4][3] edge[4][5] 1;edge[5][4] edge[5][6] edge[5][7] 1;edge[6][1…

科技如何改变世界?

技术是我们日常生活中不可或缺的一部分&#xff0c;以至于我们常常忘记了它的重要性。如果你正在科技领域工作&#xff0c;或者希望进入该领域&#xff0c;你可能是众多有使命感的人之一&#xff0c;希望知道自己的日常工作能为社会或地球的长远利益做出贡献。 别再四处寻找了…