法线向量扰动、副法线

2023-10-29

3D数学 学习笔记(9)凹凸映射(bump mapping)和切线空间(tangent space)

凹凸映射和切线空间在图形学中也是用的较多的,下面给大家介绍下凹凸映射和切线空间,并和大家说下凹凸映射和切线空间的区别和优缺点。
在这里插入图片描述
凹凸映射(bump mapping)
用于修改模型表明的发型,可以模拟出模型的“凹凸感”,但不改变顶点位置。
有两种方法:

  1. 高度纹理(高度映射,height map):模拟表面位移(displacement),得到修改后的法线值。
  2. 法线纹理(法线映射,normal map):直接存储表面法线。

高度纹理
使用高度图,表示模型表面的高度,只可以直观看出模型表面的凹凸情况。缺点是计算更复杂了,需要计算像素的灰度值。

法线纹理
存储表面的法线方向。法线方向分量范围在[-1, 1],像素的分量范围在[0, 1],要做一个映射。
在这里插入图片描述

切线空间

每个模型的顶点都有属于自己的切线空间,原点就是顶点本身,z轴为法线方向,x轴为切线方向,y轴就是法线和切线的叉积,也称副切线(bitangent)或副法线。可以理解为每个点法线的扰动方向。

左:模型空间下的法线纹理。右:切线空间下的法线纹理。
在这里插入图片描述

颜色生成原因:

  • 模型空间:每个点存储的法线方向都是不一样的,如果有n(0, 1, 0),经过映射后就对应RGB(0.5, 1,0.5)浅绿色。
  • 切线空间:每个点法线方向都是z轴方向,即(0, 0, 1),对应RGB(0.5, 0.5, 1)浅蓝色。

优缺点对比
模型空间
实现简单,直接可得到法线。生成简单。
可以提供平滑的边界(法线都在同一空间,可以直接插值)。
切线空间
自由度高,可以重用法线纹理。因为模型空间下只能对应创建时的模型,而切线空间法线是指相对与法线的,放在不同网格也可以得到合理的结果。
可进行uv动画(控制纹理的uv坐标)。
可压缩。因为z方向是确定的,可以直接存xy,再推出z方向。

参考

https://gameinstitute.qq.com/community/detail/121062

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

法线向量扰动、副法线 的相关文章

  • glutPostRedisplay 不在循环内工作

    我试图让一个人在 y 轴上跳跃 所以我使用 2 秒的循环 第一秒它应该向下移动并弯曲膝盖 第二秒它应该向上移动 然后在起始位置完成 现在我刚刚开始让这个人在第一秒内跪下并弯曲膝盖 我还没有编写动画的其余部分 问题是 glutPostRedi
  • OpenGL 和加载/读取 AoSoA(混合 SoA)格式的数据

    假设我有以下 AoSoA 格式的简化结构来表示顶点或点 struct VertexData float px 4 position x float py 4 position y 也就是说 每个实例VertexData存储4个顶点 我见过的
  • 为什么我的 FPS 相机一劳永逸地滚动?

    如果我忽略四元数代数的肮脏细节 我想我理解了旋转和平移变换背后的数学 但仍然不明白我做错了什么 为什么我的相机一劳永逸地滚动 更具体地说 我应该如何从相机的方向 旋转矩阵 计算相机视图矩阵 我正在用 Python 编写一个简约的 3d 引擎
  • 不理解 gluOrtho2D 函数

    我不能做什么gluOrtho2D 函数是做什么的 是否将原点固定在 OpenGL 窗口上的某个特定点或其他位置 这是因为gluOrtho2D 1 1 1 1 将原点固定在窗口的中间 如果它在某个时刻没有修复原点 那么有什么方法可以修复原点
  • OpenGL 着色器不与着色器程序链接

    我正在尝试使用 GLFW GLEW 添加着色器 我收到一个错误 指出着色器已加载 但它们没有有效的对象代码 这是我用于加载着色器的代码 class SHADER public void LoadShaders const char vert
  • 使用 GLSL 着色器在同一片段着色器中定义的多个子例程类型无法正常工作

    我正在开发一个使用 GLSL 着色器的程序 我编写了 2 种不同的方法来用 2 种不同的方法计算 ADS 环境光 漫反射 镜面反射 着色 为了正确完成这项工作 我使用子例程来使用一种或另一种方法来计算 ADS 着色 这是片段着色器代码的一部
  • 使用draw()而不是eventloop时的pyglet

    我正在尝试用 pyglet 画一个圆 但当我使用 draw 函数而不是 app run 循环时 它是不可见的 有什么建议我可以做什么吗 谢谢 from math import from pyglet gl import window pyg
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 无法在 WSL2 上运行 OpenGL

    我尝试在 WSL2 上运行 OpenGL 代码 但在尝试运行可执行文件时出现以下错误 GLFW error 65543 GLX Failed to create context GLXBadFBConfig Unable to create
  • Opengl 像素完美 2D 绘图

    我正在研究 2d 引擎 它已经工作得很好 但我不断收到像素错误 例如 我的窗口是 960x540 像素 我从 0 0 到 959 0 画一条线 我希望扫描线 0 上的每个像素都会被设置为一种颜色 但事实并非如此 最右边的像素没有被绘制 当我
  • 在 2D 纹理上绘制的红色矩形在绘制后立即消失

    跟随我的另一个问题 https stackoverflow com questions 18477291 render an outlined red rectangle on top a 2d texture in opengl 1847
  • 使用 GLSL 直接在着色器中从位置计算平移矩阵

    我正在开发 C OpengL 程序以及 GLSL 顶点和片段着色器 我正在创建同一对象的多个实例 我只需要改变实例之间的对象位置 这是我所做的 我正在使用一个统一变量 它是一个变换矩阵数组 每个矩阵代表一个对象实例 MVP 也是一个变换矩阵
  • 使用 pyclutter 进行编程

    我是混乱 和 pyclutter 的新手 我一直在尝试使用 pyclutter 到目前为止我还没有找到任何好的教程 我的意思是没有真正正确解释的内容 我看到了几个示例程序 但是当我尝试使用 pyclutter 时 我没有得到任何好的结果 这
  • 在 OpenGL 中只使用纹理的 Alpha 通道?

    嘿 我正在尝试将恒定颜色绘制到帧缓冲区 并使用 RGBA 纹理中的 Alpha 通道将其混合 我一直在研究 glBlendFunc 和 glBlendColor 但似乎无法找到忽略纹理中的 RGB 值的方法 我想我必须自己提取 alpha
  • 如何在 Visual Studio 2012 中安装 GLUT 和 OpenGL?

    我今天刚安装了Visual Studio 2012 我想知道如何在该平台上安装GLUT和OpenGL OpenGL 应该已经存在 可能会缺少 Freeglut GLUT GLUT 现在已经非常过时并且没有得到积极的支持 所以你当然应该使用
  • wglCreateContextAttribsARB 函数崩溃

    我尝试写下代码 我有InitializeOGL 的代码 bool Ogl InitializeOGL bool vSync cout lt lt Init OpenGL lt
  • 在 Ubuntu 中与未编译的着色器链接

    我需要加载 glsl 来绘制一些东西 我的环境是Ubuntu 13 04 因此它不存在GLuint InitShader GLuint GLuint 这是我的对象创建 预链接步骤和链接的配置 不幸的是 它仍然出现错误 该错误与未编译的着色器
  • 如何在 GLSL 1.3 和 OpenGL 2.1 中使用位运算

    我正在尝试编写一个使用许多位操作的着色器 事实上 从 glsl 1 30 开始就支持它们 但我只使用 OpenGL 2 1 有没有办法在我的 OpenGL 版本中使用位运算 所有 SM3 兼容 OpenGL 2 1 硬件支持limited整
  • 为什么 OpenGL 有远裁剪平面,以及使用什么惯用法来处理这个问题?

    我一直在学习 OpenGL 持续困扰我的一个话题是远裁剪平面 虽然我可以理解近剪裁平面和侧剪裁平面 它们永远不会产生任何实际效果 因为它们之外的对象无论如何都不会被渲染 背后的推理 但远剪裁平面似乎只是一个烦恼 由于 OpenGL 背后的人
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let

随机推荐

  • AndroidX设计架构MVVM之ViewModel生命周期分析

    本文基于ViewModel 2 1 0 先来一张ViewModel生命周期图 原文 AndroidX设计架构MVVM之ViewModel创建流程原理分析 AndroidX设计架构MVVM之ViewModel生命周期分析 AndroidX设计
  • ISCC SSTI

    先找参数吧 通过信息搜集 参数是xiaodouni 就是小豆泥的英文 这个是暹罗猫的一个名字吧 然后直接放两个payload的吧 看不懂的可以看一下我以前的文章CTFshow ssti里面讲了思路 这里就不再解释了 set pp dict
  • QT下配置Boost库

    QT下配置Boost库 前言 当使用别人的QT工程 复制到自己机器上 发现报如下错误 从QtCreator报错来看是找不到Boost相关文件和库 问题解决 首先去官网下载Boost库 编译boost库 下载boost源码 大家可以在boos
  • Ubuntu 18.04.6 单系统深度学习环境搭建(pytorch)

    1 系统安装 网上有很多这类教程 U盘制作 系统安装 2 显卡驱动安装 其他安装方法 ubuntu18 04安装显卡驱动 四种方式 我的安装方法 首先换清华源 选择一个附加驱动 然后应用更改 如果安装后重启黑屏 再尝试另外一个驱动 我是四个
  • R语言——方差分析

    一 方差分析的基本概念 方差分析是在20世纪20年代发展起来的一种统计方法 它是由英国统计学家费希尔在进行实验设计时为解释实验数据而首先引入的 从形式上看 方差分析是比较多个总体的均值是否相等 但是其本质上是研究变量之间的相互关系 方差分析
  • vue中使用echarts-liquidfill实现水球图

    先看效果图 echarts liquidfill查看官方文档 安装 npm install echarts save npm install echarts liquidfill save vue main js 中注册 import ec
  • postgresql从入门到菜鸟(十)initdb流程分析-环境设定

    分析完了参数解析 接下来分析环境设置 首先设定的是认证方式 static void check authmethod unspecified const char authmethod if authmethod NULL strlen a
  • 第三章网络传输介质

    一 信息 1 信号灯组成和类型 1 信号的组成 信息 定义数据类型 数据 描述事物的度量值 信号 信号时信息传输媒介 2 信息类型 数字信号 模拟信号 2 数字信号和模拟信号特点 1 数字信息 计算机通信使用 传输距离远 抗干扰能力强 通过
  • 如何定位CodeMirror插件

    CodeMirror插件不是普通的input textarea输入 无法使用selenium的input方法输入值 需要触发插件的事件才能真正实现值的更改 如何查看改插件有哪些事件 调用js触发setValue事件即可 document e
  • HDFS--读写测试

    读写测试 1 写测试 2 读测试 3 删除测试文件 1 写测试 cd export servers hadoop 2 6 0 cdh5 14 0 yarn jar share hadoop mapreduce hadoop mapreduc
  • 开发板BMP图片显示(6818开发板)

    BMP图片的前54个字节保存图片信息 不保存像素点 确认图片是不是BMP类型 读取整个图片大 pragma pack 1 typedef struct tagBITMAPFILEHEADER unsigned short bfType 2B
  • HR筛选简历内幕全解析

    我们已经把你的简历放进了公司的 人才库 在准备简历素材 挑选简历格式 着手创作简历的过程中 有一句话 可以用来作为戒条 Your resume is scanned not r ead YRIS 为什么让求职者以此为鉴呢 因为招聘者就是这样
  • 进程和线程的区别

    进程和线程的区别 1 进程和线程的关系和区别 2 线程的状态 3 进程的状态 4 多线程的实现方法 5 使用多线程的优缺点 6 线程的 run 和 start 有什么区别 7 什么是单线程和多线程 前两天面试 被问到进程和线程的区别 由于是
  • STM32F103 TFTLCD显示实验(一)

    文章内容 本文将介绍有关TFTLCD的有关知识 包括几个部分 分别如下 TFTLCD简介 相关指令 配置步骤 FSMC简介 由于篇幅过长 因此 代码讲解放到下一章中 链接如下 STM32F103 TFTLCD显示实验 二 https blo
  • 跑通官方的yolov7-tiny实验记录(yolov7-tiny可作为yolov5s的对比实验网络)

    目录 1 一些可用的参考链接 2 开始训练yolov7 2 1 weights 2 2 cfg 2 3 data 2 4 hyp 2 5 epochs 2 6 batch size 2 7 workers 2 8 name 1 一些可用的参
  • STM8中断的设置(ST Visual Develop和IAR环境下)

    以下以stm8s103为例介绍在ST Visual Develop和IAR环境下的中断设置 这两种只是环境不同其实中断向量是不会变的 先看一下数据手册 再结合芯片手册中中断向量映像表 如下图所示 结合起来的话我们就能够理解的 在用ST Vi
  • this.setState的详细用法

    1 为什么不要直接对state进行赋值 如果直接对this state复制是不会去更新视图的 this setState的原理是同一个队列来实现state的更新的 将需要更新的state放入到状态队列中 在一定时间段之后 合并并更新stat
  • 【计算机网络】网络层协议——IP协议基础教程详解!干货满满

    文章目录 计算机网络 网络层 IP协议详解 IP协议的格式 4位版本号 4位首部长度 8位的服务类型 16位总长度 分包组包 标识 片移量 标志 过程实例 8位生存时间 8位协议 16位首部校验和 源IP地址和目的IP地址 IP地址管理 网
  • django channels实战(websocket底层原理和案例)

    1 websocket相关 1 1 轮询 1 2 长轮询 1 3 websocket 1 3 1 websocket原理 1 3 2 django框架 asgi py在django项目同名app目录下 1 3 3 聊天室 django代码总
  • 法线向量扰动、副法线

    3D数学 学习笔记 9 凹凸映射 bump mapping 和切线空间 tangent space 凹凸映射和切线空间在图形学中也是用的较多的 下面给大家介绍下凹凸映射和切线空间 并和大家说下凹凸映射和切线空间的区别和优缺点 凹凸映射 bu