【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现

本文详细讲解Unity中纹理的使用,包括单张纹理、凹凸映射(法线纹理)和遮罩纹理的实现。作者介绍了如何在Shader中应用这些纹理,涉及纹理映射坐标、法线纹理的切线空间计算以及遮罩纹理在控制表面属性中的应用。此外,还探讨了Unity中不同类型的纹理和它们的优劣。
摘要由CSDN通过智能技术生成

笔者使用的是 Unity 2018.2.0f2 + VS2017,建议读者使用与 Unity 2018 相近的版本,避免一些因为版本不一致而出现的问题。

【Unity Shader】(三) ------ 漫反射和高光反射的实现
【Unity Shader】(四) ------ 纹理之法线纹理、单张纹理及遮罩纹理的实现
【Unity Shader】(五) ------ 透明效果之半透明效果的实现及原理
【Unity Shader】(六) ------ 复杂的光照(上)
【Unity Shader】(七) ------ 复杂的光照(下)
【Unity Shader】(八) ------ 高级纹理之立方体纹理及光线反射、折射的实现

 

在游戏中,我们除了能看到游戏物体的形体轮廓,还能看到物体的一些具体外观,包括颜色,凹凸等。而实现这一步的就是使用 纹理。与纹理相对应的技术就是 纹理映射技术 ,相当于把一张图贴在物体表面,然后 逐纹素 地控制颜色

 

纹理映射坐标:纹理映射坐标定义了一个顶点在纹理中对应的2D坐标。由于常用 U 来表示横向坐标, V 来表示纵向坐标,所以纹理映射坐标也是我们常常见到的 UV坐标。 顶点 UV 坐标通常会被归一化至 【0,1】范围内。当然纹理采样时使用的坐标也不一定在这个范围内。

另外值得注意的是,OpenGL 与 DirectX 的二维坐标系是不一样的,OpenGL中原点位于左下角,DirectX原点位于左上角。当然 Unity 会帮我们处理这个差异,同时一般情况下,Unity 采用的纹理空间是符合 OpenGL传统的。

 

需要注意的是:本文着重讲述纹理采样的原理,由于实现的shader中的光照模型计算如同上文中,并不完整。所以不能直接运用于项目

 

目录

一. 单张纹理

1.1. 实现单张纹理

二. 凹凸映射

2.1 高度纹理

2.2 法线纹理

2.3 切线空间下计算光照

三. 遮罩纹理

总结


一. 单张纹理

先看一下我们要实现的效果

shader 的一些书写方式本文便不再赘述,同时本文的计算光照的方式都能够在上一篇文章中找到,如果忘了,可以先复习一下

【Unity Shader】(三) ------ 漫反射和高光反射的实现

 

1.1. 实现单张纹理

新建一个场景,去掉天空盒子;新建一个 Capsule 与 Material,命名为 SingleTexture;

I. 先定义 Properties 语义块

其中 _MainTex 的纹理用来表示纹理贴图,这里我们用这张纹理贴图来代替物体的漫反射颜色。

 

II. 为了控制 Properties 中的属性,我们在CG代码片中定义与之相匹配

在Unity中,一般使用 纹理名_ST 来代表某个纹理的属性

 _MainTex_ST 代表 _MainTex 这个纹理的属性:S(Scale)缩放,T(Translation)平移。

_MainTex_ST.xy 代表 缩放值;_MainTex_ST.zw 代表 偏移值

 

III. 定义输入输出结构体

 uv 变量存储了纹理坐标,以便在片元着色器中进行采样

 

IV. 顶点着色器

黄色框中,我们使用了 _MainTex_ST 对顶点纹理坐标进行变换,得到最终的纹理坐标。先使用 _MainTex_ST.xy 对顶点纹理坐标进行缩放,然后使用 _MainTex_ST.zw 进行偏移。而 TRANSFORM_TEX 则是封装了这个计算方式的内置函数,我们可以在 UnityCG.cginc 中找到它的定义

很显然,参数一为顶点纹理坐标,参数二为纹理名

 

V. 片元着色器

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值