【Unity3D Shader】学习笔记-纹理采样②

简介: 前言 上一篇对同一纹理进行多次采样混合,本篇则是通过不同的纹理采样进行混合产生一些效果。一、简单贴花 贴花简单来说就是在原贴图上面贴上细节贴图,就像墙面上的喷绘一样。下面这个只是最简单的例子,也就是只能在一张图(一个模型)上面贴其他细节。

【Unity3D Shader】学习笔记-纹理采样②


前言


   上一篇对同一纹理进行多次采样混合,本篇则是通过不同的纹理采样进行混合产生一些效果。

  [声明:本笔记系列文章的图片资源都源自百度图片搜索,如有问题联系我]

一、简单贴花


   贴花简单来说就是在原贴图上面贴上细节贴图,就像墙面上的喷绘一样。下面这个只是最简单的例子,也就是只能在一张图(一个模型)上面贴其他细节。


微信图片_20220424152222.png微信图片_20220424152229.png


fixed4 frag (v2f i) : SV_Target
{
    fixed4 col = tex2D(_MainTex, i.uv);
    // 这里加了点偏移
    fixed4 details = tex2D(_DetailsTex, i.uv + fixed2(-0.2, 0.0));
    return lerp(col, details, details.a);
}


二、法线贴图


   通过将法线贴图和光照方向转换到切线空间,然后进行漫反射计算,得到模型的更多细节。


微信图片_20220424152459.png微信图片_20220424152503.png


v2f vert (appdata v)
{
    v2f o;
    o.vertex = UnityObjectToClipPos(v.vertex);
    o.uv = TRANSFORM_TEX(v.uv, _MainTex);
    // 这个矩阵用来把模型空间下的方向转换成切线空间下
    TANGENT_SPACE_ROTATION;
    //得到切线下的光照方向
    o.lightDir = normalize(mul(rotation, ObjSpaceLightDir(v.vertex)));  
    UNITY_TRANSFER_FOG(o,o.vertex);
    return o;
}
fixed4 frag (v2f i) : SV_Target
{
    // 法线贴图采样
    fixed4 normalColor = tex2D(_NormalTex, i.uv);
    // 切线空间下的法线
    fixed3 tangentNormal = UnpackScaleNormal(normalColor, _BumpScale);
    tangentNormal = normalize(tangentNormal);
    fixed4 base_color = tex2D(_MainTex, i.uv);
    // 法线和灯光同方向为1,相互垂直为0,相反则为-1. 或者是光和法线的夹角,小于90度为正数,大于90度为负数。
    float NdotL = dot(tangentNormal, i.lightDir);
    fixed3 diffuse = _LightColor0.rgb * base_color.rgb * saturate(NdotL);
    return fixed4(diffuse, 1.0);
}


三、扰动图采样


   通过对扰动图进行采样来计算对主纹理采样的新的uv数据,从而控制采样后的效果,更换不同的扰动图会获得不同的效果。下图类似热扭曲效果。还可以做更多的效果,例如水滴,水流,焦散等等。


微信图片_20220424152510.gif


fixed4 frag (v2f i) : SV_Target
{
    // 控制uv的偏移
    float _offsetU = 1.2;
    float _offsetV = 1.2;
    // 控制速度
    float _Spd = 0.4;
    // 扰动强度
    float _Force = 0.026; 
    float2 l_uv = float2(-_Spd*_Time.x*_offsetU, _offsetV*-_Spd*_Time.x);
    float2 r_uv = float2(_Spd*_Time.x*_offsetU, _offsetV*_Spd*_Time.x);
    //贴图扰动采样
    float4 distort = tex2D(_NoiseTex,i.uv + l_uv);
    float4 distort2 = tex2D(_NoiseTex,i.uv + r_uv);
    // 生成新的uv进行纹理采样
    float2 n_uv = i.uv + _Force * float2(distort.r + distort2.r, distort.g + distort2.g);
    float4 col = tex2D(_MainTex, n_uv); 
    return col;
}


相关文章
|
4月前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
310 0
|
4月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
42 2
|
4月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
49 2
|
4月前
|
API 图形学 异构计算
Unity3D学习笔记7——GPU实例化(2)
Unity3D学习笔记7——GPU实例化(2)
32 2
|
4月前
|
存储 缓存 图形学
Unity3D学习笔记11——后处理
Unity3D学习笔记11——后处理
64 1
|
3月前
|
图形学 开发者
【独家揭秘】Unity游戏开发秘籍:从基础到进阶,掌握材质与纹理的艺术,打造超现实游戏视效的全过程剖析——案例教你如何让每一面墙都会“说话”
【8月更文挑战第31天】Unity 是全球领先的跨平台游戏开发引擎,以其高效性能和丰富的工具集著称,尤其在提升游戏视觉效果方面表现突出。本文通过具体案例分析,介绍如何利用 Unity 中的材质与纹理技术打造逼真且具艺术感的游戏世界。材质定义物体表面属性,如颜色、光滑度等;纹理则用于模拟真实细节。结合使用两者可显著增强场景真实感。以 FPS 游戏为例,通过调整材质参数和编写脚本动态改变属性,可实现自然视觉效果。此外,Unity 还提供了多种高级技术和优化方法供开发者探索。
59 0
|
4月前
|
测试技术 C# 图形学
Unity3D学习笔记10——纹理数组
Unity3D学习笔记10——纹理数组
58 0
|
4月前
|
图形学 异构计算
Unity3D学习笔记8——GPU实例化(3)
Unity3D学习笔记8——GPU实例化(3)
54 0
|
4月前
|
存储 API 图形学
Unity3D学习笔记6——GPU实例化(1)
Unity3D学习笔记6——GPU实例化(1)
70 0
|
4月前
|
API 图形学 索引
Unity3D学习笔记5——创建子Mesh
Unity3D学习笔记5——创建子Mesh
34 0