凹凸纹理概念

news2024/11/15 15:49:44

1、凹凸纹理

纹理除了可以用来进行颜色映射外,另外一种常见的应用就是进行凹凸映射。凹凸映射的目的是使用一张纹理来修改模型表面的法线,让我们不需要增加顶点,而让模型看起来有凹凸效果。
原理:光照的计算都会利用法线参与计算,决定最终的颜色表现效果。那么在计算“假”凹凸面时,使用“真”凹凸面的法线参与计算,呈现出来的效果可以以假乱真

凹凸纹理最大的作用就是让模型可以在不添加顶点(不增加面)的情况下让模型看起来同样充满细节(凹凸感),是一种视觉上的“欺骗”技术 。

要进行凹凸映射,目前有两种主流方式:高度纹理贴图,法线纹理贴图

2、高度纹理贴图

高度纹理贴图一般简称高度图,它存储了模型表面上每个点的高度信息。通常它使用灰度图像,其中不同灰度值表示不同高度。较亮区域通常对应较高的点,较暗的区域对应较低的点。它主要用于模拟物体表面的位移,类似于:

存储规则:图片中的某一个像素点的RGB值是相同的,都表示高度值,A值一般情况下为1。高度值范围一般为0~1,0代表最低,1代表最高
优点:可以通过高度图很明确的知道模型表面的凹凸情况
缺点:无法在Shader中直接得到模型表面点的法线信息,
而是需要通过额外的计算得到,因此会增加性能消耗,所以我们几乎很少使用它。
我们在使用凹凸纹理时,一般都会使用法线纹理贴图

3、法线纹理贴图

法线纹理贴图一般简称法线贴图 或 法线纹理,它存储了模型表面上每个点的法线方向。
存储规则:图片中的RGB值分别存储法线的X、Y、Z分量值,A值可以用于存储其他信息,
比如材质光滑度等。
优点:从法线贴图中取出的数据便是法线信息,可以直接
简单处理后就参与光照计算,性能表现更好
缺点:我们无法直观的看出模型表面的凹凸情况

3.1 法线纹理贴图读取分量数据的规则

由于法线XYZ分量范围在[-1,1]之间,而像素RGB分量范围在[0,1]之间,因此我们需要做一个映射计算:
存储图片时:像素分量 = (法线分量 + 1) / 2
因此当我们取出像素分量使用时需要进行逆运算
读取数据时:法线分量 = 像素分量 * 2 - 1

3.2 两种法线纹理贴图的存储方式

法线纹理贴图中主要存储法线信息,而法线信息其实就是个方向向量,而方向向量就得有相对坐标系
因此,法线贴图的存储方式按相对坐标系有两种方式:

  • 基于模型空间的法线纹理
  • 基于切线空间的法线纹理

3.2.1 基于模型空间的法线纹理

模型数据中自带的法线数据,是定义在模型空间中的,因此最直接的存储法线贴图数据的方式
就是存储基于模型空间下的法线信息。
注意:模型数据中的法线数据是“真”数据,法线贴图中对的法线数据是“假”数据

由于模型空间中每个点存储的法线方向是各式各样的,比如:
法线(0,1,0)映射到像素后(法线分量 + 1) / 2 是 (0.5,1.0.5) 绿色
法线(0,-1,0)映射到像素后(法线分量 + 1) / 2 是 (0.5,0,0.5) 紫色
因此基于模型空间的法线纹理一般是五颜六色的,这种法线纹理贴图数据取出来直接参与Shader计算即可

3.2.2 基于切线空间的法线纹理

虽然基于模型空间的法线纹理贴图看起来很符合计算需求,但是在实际开发时,美术同学给到我们的法线贴图一般都是基于切线空间的。

原点:顶点本身
X轴:顶点切线
Z轴:法线方向(顶点的原法线)
Y轴:X和Z的叉乘结果,也被称为副切线

切线空间下的法线纹理贴图是蓝色的原因是,在切线空间下,如果该顶点的法线不变化(不需要“凹凸感”)那么它的坐标是(0,0,1),因为在切线空间下,Z轴就是原法线方向,因此:
法线(0,0,1)映射到像素后(法线分量 + 1) / 2 是 (0.5,0.5,1) 浅蓝色,这个浅蓝色就是 切线空间下法线贴图存在大片蓝色的原因,因为大部分顶点的法线和模型本身法线是一致的,只有凹凸部分的颜色才会有些许差异。这种法线纹理贴图数据取出来后需要进行坐标空间转换再参与Shader计算。

3.3.3 为什么要使用切线空间下的法线纹理贴图

所以在实际开发时要使用切线空间下的法线贴图
原因有以下几点:

  • 可以用于不同模型 —— 如果模型空间下法线,不能用于其他模型
  • 方便处理模型变形 —— 同上
  • 可以复用 —— 一个砖块,6个面贴图都是一样的,可以只用一张法线贴图即可用于6个面计算
  • 可以压缩 —— 可以只存储两个轴的分量
  • 方便制作UV动画 —— UV坐标改变可以实现凹凸移动效果,如果是模型空间下法线贴图表现会有问题等等

4、总结

  • 凹凸纹理是用来做什么的?

通过高度纹理或法线纹理在不添加顶点(不增加面)的情况下让模型看起来同样充满细节(凹凸感)
原理:计算“假”凹凸面时,使用“真”凹凸面的法线参与计算

  • 高度纹理贴图

RGB都存储高度值,表现为一张灰度图,由于需要更多额外计算,我们一般不使用

  • 法线纹理贴图

RGB分别存储法线的XYZ值,有相对模型空间(彩色)和切线空间(蓝色)两种法线贴图

  • 为什么要使用切线空间下的法线纹理贴图

切线空间法线贴图虽然要产生额外计算,但是能让法线贴图更加的通用,灵活

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

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

相关文章

winform 大头针实现方法——把窗口钉在最上层

平时我们再使用成熟的软件的时候,会发现有个大头针的功能挺不错的。就是点一下大头针,窗口就会钉住,一直保持在最上面一层,这样可以一边设置参数,一边观察这个窗口里面的变化,比较方便。下面我就来简单实现…

进阶SpringBoot之首页和图标定制

idea 快捷键: ctrl shift "" 使缩起来的代码展开 ctrl shitf "-" 使代码缩起 WebMvcAutoConfiguration.class:可以看到需要有一个 index.html 文件映射到首页 private Resource getIndexHtmlResource(Resource location) {tr…

关于SpringMVC的一点学习笔记

关于SpringMVC的一点学习笔记 1、 maven依赖/目录结构2、配置文件3、从前端请求开始4、Controller5、Service6、Dao7、mybatis8、utils公共类9、 分页查询 QueryPageBean / PageResult10、静态页面Freemarker用在经常访问但不经常变化的页面场景中11、Reids12、Echarts13、认证…

后台管理权限自定义按钮指令v-hasPermi

第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…

软件设计之MySQL(2)

软件设计之MySQL(2) 此篇应在JavaSE之后进行学习: 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 Navicat可以在软件管家下载 使用navicat连接mysql数据库创建数据库、表、转储sql文件,导入sql数据 学习内容: 基础的SELECT语…

数据分析:宏基因组数据的荟萃分析

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 介绍 宏基因组数据的荟萃分析是一种综合多个独立宏基因组研究结果的方法,目的是揭示不同人群或样本中微生物群落的共同特征和差异。这种方法特别适用…

ubantu安装python3.10

1.从官网下载安装 1.1安装依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev wget libbz2-dev1.2从官网下载源文件 wget https://www.python.org/ftp/pyth…

设计资讯 | 巴黎 2024 年奥运会“另一个自我”以 DAB 汽车定制电动摩托车的形式亮相

巴黎 2024 年奥运会运动作为定制电动摩托车 DAB Motors 融入了2024 年巴黎奥运会的精神,通过其定制电动摩托车诠释了奥运会的五环。这些车辆由其服务部门 DAB Custom Studio (DCS) 提供,颜色编码与奥运五环一样。每种颜色代表一项运动:蓝色代…

RobotFramework框架+Selenium实现UI自动化测试(十六)

学习目录 1 UI自动化测试 2安装RF框架所需的 robotframework-seleniumlibrary包 1) robotframework-seleniumLibrary版本说明 2) robotframework-selenium2Library版本说明 3 selenium介绍 3.1 配置操作系统环境支持使用selenium打开浏览器 3.2 s…

「OC」简单网络请求的实现

「OC」简单网络请求的实现 文章目录 「OC」简单网络请求的实现写在前面URL和API网络请求的流程网络申请数据解析参考文章 写在前面 在暑假最后一个项目天气预报之中,使用了网络请求,虽然说还是不太理解网络请求之中的相关内容,以及在写天气预…

傻瓜式一步到位Mysql 8.0 密码修改

5.7之前修改密码语句 update user set authentication_string password(“root”) where user “root”; mysql 5.7.9以后废弃了password字段和password()函数;并在user表加了authentication_string:字段表示用户密码 #进入到mysql 安装目录下 #停止 mysql 服务 …

低碳环保测试知识问答活动

全国生态日,倒计时1天。为了组织这场关于“低碳环保测试知识问答”主题的线上知识竞赛,我们历经从活动方案策划到落地答题小程序上线。 一、活动背景 通过举办此次知识竞赛,旨在提高公众对低碳环保的认识和参与度,推广低碳生活方…

网络协议七 应用层 DNS协议 和 DHCP协议 这两个都了解就好

应用层常见的协议 1. DNS 协议 了解 将baidu.com 解析成具体IP的协议 实际上可以理解为:客户端 通过 DNS 协议 和 DNS 服务器进行交互,将域名转换成IP 2. DHCP 协议 了解 从DHCP 服务器自动获取IP地址

P1305 新二叉树

题目&#xff1a; 洛谷传送门&#xff1a;P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int n,ans; char root; struct node{char nod,r,l; }a[100000]; void dfs(char idx){cout<…

Erupt 项目搭建

创建Spring Boot项目 Maven依赖 Spring Boot版本为 2.7.10&#xff0c;erupt版本为 1.12.14 erupt版本要与Spring Boot版本适配&#xff0c;3.x.x版本Spring Boot暂不适用说是 <properties><erupt.version>1.12.14</erupt.version></properties> <…

全场景——(三)USB开发基础(1)

文章目录 一、USB 系统硬件框架和软件框架1.1 实验现象1.2 硬件框架1.3 软件框架 二、USB 电气信号2.1 USB 设备状态切换图2.2 硬件线路2.3 电子信号2.4 低速/全速信号电平2.5 高速信号电平2.6 设备连接与断开2.6.1 连接2.6.2 断开 2.7 复位2.8 设备速率识别2.8.1 低速/全速2.8…

【STM32】入门教程(完整版汇总非常详细)

本教程参考b站江协科技STM32入门教程&#xff0c;视频链接&#xff1a; 哔哩哔哩江协科技STM32入门教程https://www.bilibili.com/video/BV1th411z7sn/?spm_id_from333.337.search-card.all.click “唯一能持久的竞争优势是胜过竞争对手的学习能力。”——盖亚斯 希望对您有帮…

栈的定义及基本操作

栈的定义和特点 栈是一个特殊的线性表&#xff0c;是限定在一端进行插入和删除操作的线性表&#xff1b; 插入到栈顶称作入栈&#xff08;PUSH) 从栈顶删除最后一个元素称作出栈 &#xff08;POP&#xff09; 图1 栈的表示 假设三个元素a,b,c入栈顺序为a&#xf…

【洛谷/水滴题解】[NOIP2005 普及组] 采药

1.难度&#xff1a;普及- 2.类型&#xff1a;dp&#xff0c;01背包 3.描述&#xff0c;输入输出格式&#xff0c;样例&#xff1a; 4.AC代码&#xff1a; #include<bits/stdc.h> using namespace std; int t,m; int dp[1005]; int main() {ios::sync_with_stdio(false…

MySQL第8讲--DCL(数据控制语言)的基本操作

文章目录 前言DCL(数据控制语言)用户管理查询用户创建用户修改用户密码删除用户 权限控制查询权限授予权限撤销权限 前言 在第六讲MySQL第6讲–DQL(数据查询语言)的基本操作之基本和条件查询和第七讲MySQL第7讲–DQL(数据查询语言)的基本操作中我们讲述了DQL中的&#xff0c;基…