shader学习笔记(二)纹理采样

2023-11-17

资料参照:《Unity Shader入门精要》— 冯乐乐 第7章 基础纹理
【技术美术百人计划】图形 1.3 纹理的秘密
庄懂的技术美术入门课(美术向)-直播录屏-第9课
Unity Shader 入门到改行4——最简纹理采样

1.纹理是什么

1、宏观上是一张2D图片,一个像素上有 RGB 值
2、不局限于存储图片,可以存储高度、法线等信息

纹理优化方式和原理:

CPU优化:纹理图集、纹理数组,减少DrawCall
GPU优化:纹理压缩,降低带宽

纹理设置-Wrap Mode

决定UV值在[0,1]以外的表现
在这里插入图片描述
Repeat:重复 (序列帧图片一般用这个)
Mirror:重复并镜像
Clamp:超出范围的纹理值使用其临近的边缘值
Border:为超出范围的纹理值使用一个定值
在这里插入图片描述

纹理设置-FilterModel

过滤设置,当纹理通过变化产生拉伸的时候,要使用哪种滤波来进行纹理的表现
在这里插入图片描述

Point :点采样模式,屏幕像素会需找最近的贴图像素点,来作为输出,这种比较生硬,但是性能好,不抗锯齿。
Bilinear :*双线性采样模式, 采用最近的4个像素来做线性插值,有平缓的过渡。可以解决贴图放大的问题,但是贴图缩小依然有锯齿。 缩小可以用mip-map来解决。
Trilinear :三线性采样模式,可以比较好的解决贴图缩小和放大。
缺点:牺牲了性能,像素处理速度变慢,贴图大小增加1/3。
优点:画面好,GPU可以根据光栅化结果导入一层MIP-MAP到显存中,减轻硬件负担,综合起来,能弥补像素处理的速度。
在这里插入图片描述

MipMap

将纹理按照不同等级进行缩放,查找纹理像素时根据缩放等级到对应的mipmap里进行采样。
在这里插入图片描述

立方体贴图 CubeMap

立方体6个面的贴图。常用在环境光照(环境球)
在这里插入图片描述

凹凸贴图 Displacement Mapping

法一:高度纹理:用一张图记录高度信息然后做表面位移和法线修改。
法二:法线纹理Normal:用一张图记录法线来模拟高光的效果。
在这里插入图片描述

位移贴图 Displacement Mapping

在这里插入图片描述

2. uv 坐标

什么是 uv 坐标?
uv 坐标首先是一个二维坐标,水平方向是U,垂直方向是V,而坐标用来确定一个位置,uv 就是用来确定一个纹素在某张纹理上的位置。

uv 坐标的范围是多少?
纹理的大小各异,希望能用同一个范围内的坐标来表示所有大小的纹理的 uv 坐标,所以 uv 坐标通常是归一化后的坐标,区间在[0,1]。

如何获得 uv 坐标,或者说 uv 坐标存放在哪里?
uv 坐标是存放在顶点数据中的。在模型中,每一个顶点有一个属性,表示uv坐标。在3d游戏中,3d建模人员在建模软件中完成顶点绑定纹理坐标的操作。

纹理采样是什么意思?
给定一个 uv 坐标和一张纹理,获得这张纹理在 uv 坐标处的纹素的颜色值。这个过程就是纹理采样。

uv 坐标会超过取值范围吗?
通常存储在模型顶点中的 uv 坐标都在 [0,1] 区间内。但是在进行纹理采样时,传入的 uv 却不一定,这是因为我们可以在 着色器内对 uv 进行各种计算。
在进行纹理采样时,如果接受到一个 不在 [0, 1] 区间的纹理坐标时,如何确定该返回哪个纹素,由纹理的“平铺模式Wrap Mode”确定。在 Unity 中,纹理的“平铺模式”通常由引擎开发选项进行设置。

3. shader中实现纹理采样:

2D纹理采样

//属性声明
 _MainTex ("MainTex", 2D) = "white" {}
// 输入参数
uniform sampler2D _MainTex; float4 _MainTex_ST;  //纹理名_ST,可以通过这个变量获得纹理的缩放(.xy)和平移值(.zw)
 // 纹理采样
 float3 diffuse = tex2D(_MainTex, i.uv);

CubeMap采样

设置TextureShape为“Cube”
![在这里插入图片描述](https://img-blog.csdnimg.cn/f0cc049e8f38440c8a9862cf7cd9c0aa.png

//属性声明
_Cubemap("环境球", Cube) = "_Skybox" {}
// 输入参数
uniform samplerCUBE _Cubemap;
//采样Cubemap   _CubemapMip为Mip值
float3 vrDirWS = reflect(-vDirWS, nDirWS);
float3 var_Cubemap = texCUBElod(_Cubemap, float4(vrDirWS, _CubemapMip)).rgb;

法线贴图Normal

法线纹理的思想是取代对三角面上的顶点法线进行插值,而是简单的通过从纹理中取样来获取法线方向
设置TextureType为“Normal map”
在这里插入图片描述

 //属性声明 bump
  _NormTex	("RGB:法线贴图", 2D)= "bump" {}
// 输入参数
 uniform sampler2D _NormTex;
// 采样并解码nDirTS
float3 nDirTS = UnpackNormal(tex2D(_NormalMap, i.uv0)).rgb;
构造TBN矩阵,计算nDirWS
float3x3 TBN = float3x3(i.tDirWS, i.bDirWS, i.nDirWS);
//获得切线空间转世界空间下的法线方向
float3 nDirWS = normalize(mul(nDirTS, TBN));   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

shader学习笔记(二)纹理采样 的相关文章

  • emc re 整改 超标_EMC辐射骚扰超标如何整改?

    辐射骚扰是电脑 GPS导航等工作时向空间发射的一种电磁波干扰 这种干扰会影响其他电器特别是高灵敏度电器的正常工作 组成整机系统的主板 显示卡 开关电源 显示器 键盘 鼠标等都可能引起辐射骚扰超标 对于辐射骚扰通常用电磁场的大小来度量 其单位

随机推荐

  • 对泛型之不能协变(convariant)的理解,以及不能协变导致的问题

    1 何为协变 假设有一个接口 以及一个他的实现类 如下 接口为 public interface GenericsInterface void test 其实现类为 public class Type2 implements Generic
  • 6.ajax应用,ajax应用

    web tools ajax version 天气预报 value 北京 gt id disp weather gt ip地址查询 value 127 0 0 1 gt id disp iparea gt 手机归属查询 id disp mo
  • js利用google翻译接口把网页翻译成各国语言

    网页翻译为德语 Translate Page To German a href 网页翻译为德语 Translate Page To German a 网页翻译为西班牙语 Translate Page To Spanish a href a
  • [Mysql] 删除数据

    为了从一个数据表中删除 去掉 数据 可使用DELETE语句 语法 DELETE FROM表名 WHERE 条件 ORDER BY LIMIT row count DELETE FROM要求指定从中删除数据的表名 WHERE子句过滤要删除的行
  • 如何将li的前面那个圆点去掉

    只需要将 css样式 的 list style type 属性设置为none即可 代码如下 list style type none span style font size 18px span 下面的代码位于标签内 span style
  • 虚拟内存基本概念

    一 传统存储管理方式的特征 缺点 1 连续分配 单一连续分配 固定分区分配 动态分区分配 2 非连续分配 基本分页存储管理 基本分段存储管理 基本段页式存储管理 3 特点 很多暂时用不到的数据也会长期占用内存 导致内存利用率不高 一次性 作
  • JS基础_js一元运算符

    1 什么是一元运算符 只对一个操作数操作就能改变当前操作数的值的运算符号 2 一元运算符有哪些 2 1 正号 和负号 举例
  • CP4.矩阵的LU分解

    LU分解 将矩阵A分解成的形式 称作矩阵LU分解 L代指下三角矩阵 U代指上三角矩阵 首先用到的是前面讲过的消元法 以下为例子 通过消元操作 最后矩阵A变成了一个上三角矩阵U 那么只要上式左乘一个 就可以转化为 这里的就是L矩阵了 所以 也
  • javac编译时出现GBK报错(错误:编码GBK的不可映射字符)

    javac编译时出现GBK报错 错误 编码GBK的不可映射字符 一 这里列出我遇到的三种情况 代码格式分别为 ANSI UTF 8 无BOM的UTF 8 这里我用的是notepad 进行编写 ANSI格式 首先我们先创建一个 java源文件
  • 说说JUC三个类:CountDownLatch,CyclicBarrier和Semaphore

    目录 CountDownLatch CyclicBarrier Semaphore 总结 在JUC中 有三个工具类来辅助我们进行并发编程 分别是 CountDownLatch CyclicBarrier和Semaphore CountDow
  • 使用vue-cli来搭建vue项目

    使用vue cli来搭建vue项目 一 创建所需要的文件夹 二 安装vue cli 三 使用脚手架vue cli 2 X版 来构建项目 前提 搭建好NodeJS环境 一 创建所需要的文件夹 1 首先在Node js的文件夹里面建上 temp
  • S71200外围设备接线-输入接线

    S71200外围设备接线 输入端子接线 含NPN和PNP 传感器接线 作为一个PLC的初学者 我觉得第一件事请并不是学习什么TIA Portal软件或者编程指令 而是了解PLC的系统参数和外围设备接线 上面的一张文章 我通过图文的方式简单讲
  • 问题 E: 十进制整数转二进制

    十进制整数转二进制的方法是 除以2 取出余数 商继续除以2 直到得到0为止 将取出的余数逆序即可得到对应的二进制数的各位 例如 22转二进制的计算过程 22 2 11 余0 11 2 5 余 1 5 2 2 余 1 2 2 1 余 0 1
  • 小程序获取用户信息实现一键登录

    文章目录 旧版获取用户信息实现登录流程 login页面代码 个人中心页面代码 全局app vue代码 下面是小程序获取用户信息最新调整的方式 温馨提示 以下小程序登录方式只适用于2 27 1版本库以下使用 详情请看微信官方文档调整 旧版获取
  • python中的连续比较是什么_在python中提取连续行之间的差异

    你的例子表明你想要在一对线之间进行比较 这与将其定义为line n 1 line n 不同 后者将给出5个结果 而不是3个 在 结果也取决于你认为的差异 它是位置性的 还是仅仅基于奇数行中缺失的字母 还是两者的差异都适用 例如 boat t
  • 优酷 YouTube Twitter及JustinTV视频网站架构设计笔记

    本文是整理的关于优酷 YouTube Twitter及JustinTV几个视频网站的架构或笔记 对于不管是视频网站 门户网站或者其它的网站 在架构上都有一定的参考意义 毕竟成功者的背后总有值得学习的地方 虽然有些文章的发表时间有点久了 但是
  • 将第三方库改为我自己想要的

    将第三方库改为我自己想要的 方法 比较常用的 给出一些例子 React组合方法 高阶组件方法 方法 修改第三方库以适应自己的需求可以通过多种方法实现 下面是一些常见的策略 继承 通过创建继承自第三方库组件或类的子类 你可以重写或扩展其方法
  • Keil警告和错误语句与消除方法笔记

    遇到的keil相关错误 警告内容在这里进行更新 Warning 1 D last line of file ends without a newline 文件最后一行不是新行 解决 保证文件最后一行什么符号也没有 167 D argumen
  • MySQL索引原理B+树

    B 树索引是B 树在数据库中的一种实现 是最常见也是数据库中使用最为频繁的一种索引 B 树中的B代表平衡 balance 而不是二叉 binary 因为B 树是从最早的平衡二叉树演化而来的 在讲B 树之前必须先了解二叉查找树 平衡二叉树 A
  • shader学习笔记(二)纹理采样

    资料参照 Unity Shader入门精要 冯乐乐 第7章 基础纹理 技术美术百人计划 图形 1 3 纹理的秘密 庄懂的技术美术入门课 美术向 直播录屏 第9课 Unity Shader 入门到改行4 最简纹理采样 1 纹理是什么 1 宏观