当前位置: 首页 > news >正文

Unity URP法线贴图实现教程

前言

在Unity URP(Universal Render Pipeline)中实现法线贴图效果,可以通过以下步骤完成。法线贴图通过修改表面法线方向模拟凹凸细节,无需增加几何复杂度。

对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!

完整实现步骤:

1. 准备法线贴图

  • 使用图像软件(如Photoshop或Substance)创建法线贴图,或从资源商店获取
  • 导入设置
    • 纹理类型:Default
    • 纹理形状:Texture2D
    • 勾选 Bump Map(自动切换为法线贴图模式)
    • 压缩格式:推荐 BC5(DXT5nm)或 BC7

2. 创建URP材质

  • 在Project窗口右键:Create > Material
  • 使用URP内置着色器:
    • 选择Shader:Universal Render Pipeline > Lit
    • 或 Universal Render Pipeline > Simple Lit(简化版)

3. 配置材质参数

  • 在Material Inspector中:
    • Surface Type:根据需求选 Opaque/Transparent
    • 将法线贴图拖拽到 Normal Map 插槽
    • 调整 Normal Scale(通常0.5-1.5)控制凹凸强度
    • 设置基础贴图(Albedo)和其他参数

4. 应用到模型

  • 将材质拖拽到场景中的模型上
  • 确保模型有UV坐标(可在导入设置中检查)

5. 自定义Shader(可选进阶)

如果需要特殊效果,可编写自定义Shader:

Shader "Custom/NormalMapShader" {Properties {_MainTex("Albedo", 2D) = "white" {}_NormalMap("Normal Map", 2D) = "bump" {}_NormalScale("Normal Scale", Range(0,2)) = 1}SubShader {Tags { "RenderPipeline"="UniversalPipeline" }HLSLINCLUDE#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"ENDHLSLPass {HLSLPROGRAM#pragma vertex vert#pragma fragment fragstruct Attributes {float4 positionOS : POSITION;float2 uv : TEXCOORD0;float3 normalOS : NORMAL;float4 tangentOS : TANGENT;};struct Varyings {float4 positionCS : SV_POSITION;float2 uv : TEXCOORD0;float3 normalWS : TEXCOORD1;float4 tangentWS : TEXCOORD2;};sampler2D _MainTex;sampler2D _NormalMap;float _NormalScale;Varyings vert(Attributes IN) {Varyings OUT;// 顶点变换VertexPositionInputs posInput = GetVertexPositionInputs(IN.positionOS.xyz);OUT.positionCS = posInput.positionCS;OUT.uv = IN.uv;// 法线和切线计算VertexNormalInputs normInput = GetVertexNormalInputs(IN.normalOS, IN.tangentOS);OUT.normalWS = normInput.normalWS;OUT.tangentWS = float4(normInput.tangentWS, IN.tangentOS.w);return OUT;}half4 frag(Varyings IN) : SV_Target {// 采样法线贴图float4 normalSample = tex2D(_NormalMap, IN.uv);float3 tangentNormal = UnpackNormalScale(normalSample, _NormalScale);// 构建TBN矩阵float3 normalWS = IN.normalWS;float3 tangentWS = IN.tangentWS.xyz;float3 bitangentWS = cross(normalWS, tangentWS) * IN.tangentWS.w;float3x3 TBN = float3x3(tangentWS, bitangentWS, normalWS);// 转换到世界空间float3 finalNormal = mul(tangentNormal, TBN);// 光照计算(简单漫反射)Light mainLight = GetMainLight();float NdotL = saturate(dot(finalNormal, mainLight.direction));half3 albedo = tex2D(_MainTex, IN.uv).rgb;half3 diffuse = albedo * NdotL * mainLight.color;return half4(diffuse, 1);}ENDHLSL}}
}

关键注意事项:

  1. 切线空间要求
  • 模型必须包含切线(Tangent)数据
  • 检查导入设置:Model > Normals & Tangents 设为 Calculate

  1. 性能优化
  • 移动平台使用 Normal Quality 设置为 Low(16位精度)
  • 复杂场景启用 Batching 减少Draw Calls

  1. 常见问题排查
  • 法线反向:尝试调整 Normal Scale 为负值
  • 接缝问题:确保UV展开无重叠,检查模型拓扑
  • 光照无反应:确认场景中有URP灯光(Directional Light)

增强效果技巧:

  • 视差贴图:在法线基础上添加高度偏移

    float2 parallaxUV = IN.uv + (tangentNormal.xy * _HeightScale);
  • 光滑度控制:将法线信息与粗糙度贴图结合
  • 双面渲染:添加 Cull Off 指令支持双面法线

通过以上步骤,可在URP中高效实现法线贴图效果,显著提升模型表面细节表现力。

更多教学视

Unity3D​www.bycwedu.com/promotion_channels/2146264125

http://www.dtcms.com/a/266593.html

相关文章:

  • 三、jenkins使用tomcat部署项目
  • RK-Android11-性能优化-限制App内存上限默认512m
  • 利用TCP协议,创建一个多人聊天室
  • 使用reactor-rabbitmq库监听Rabbitmq
  • Go中使用Google Authenticator
  • 东软8位MCU低功耗调试总结
  • 如何使用python识别出文件夹中全是图片合成的的PDF,并将其移动到指定文件夹
  • 【ASP.NET Core】REST与RESTful详解,从理论到实现
  • 当前主流AI智能代理框架对比分析报告
  • 分布式光伏监控系统防孤岛保护装置光功率预测
  • 【论文阅读】VARGPT-v1.1
  • Webpack构建工具
  • node.js下载教程
  • 机器学习数学基础与Python实现
  • 机器学习在智能建筑中的应用:能源管理与环境优化
  • 每日问题总结记录
  • 一、如何用MATLAB画一个三角形 代码
  • 基于AR和SLAM技术的商场智能导视系统技术原理详解
  • 京东小程序JS API仓颉改造实践
  • 深圳安锐科技发布国内首款4G 索力仪!让斜拉桥索力自动化监测更精准高效
  • 【centos8服务如何给服务器开发3306端口】
  • Python 中线程和进程在实际项目使用中的区别和联系
  • 解决HttpServletRequest无法获取@RequestBody修饰的参数
  • Java并发性能优化|读写锁与互斥锁解析
  • Python 中的可迭代对象与迭代器:原理与项目实战
  • 【Verilog】parameter、localparam和 `define的区别
  • Android View的绘制原理详解
  • 基于虚拟化技术的网闸安全交换:物理隔离时代的智能数据流通引擎
  • 最快实现的前端灰度方案
  • python打卡day58@浙大疏锦行