DCC - Photoshop - Nvidia NormalMapFilter - 法线生成工具 - 顺便测试 Unity URP 12.1 中的 Decal System

article/2025/8/28 17:33:22

文章目录

  • NVIDIA Texture Tools Exporter 下载、安装
  • 法线生成素材图
  • 扣干净无用像素
  • 使用 NVIDIA Normal Map Filter 生成贴图
  • 配置好 URP Renderer
  • 添加好 Decal Render Feature
  • 设置好 Decal Render Feature Techniqu: DBuffer
  • 配置好 unity shader graph
  • 添加 URP Decal Projector 组件
  • 配置好 URP Decal Projector 参数
  • 最终效果
  • 原理
  • Project


之前有一篇使用几何体的方式来绘制深坑,这种方式效果还不错,局限性还是有的,具体可以参考:Unity Shader - URP - 抄作业 - Deep Crack - 裂痕深坑 - SRP Batch优化

图形效果铁原则:制作方法没有最好的,只有最适合的,只要看起来不错,就够了


今天研究使用:URP 12.1 中的 Decal System

然后尝试了一下 在 Decal 中修改原来 GBuffer 的 Normal 的效果

但是没有法线图,我就随便那一张之前项目测试用的地裂图来做测试

但是只有 albedo,没有 normal


NVIDIA Texture Tools Exporter 下载、安装

使用 Photoshop 来构建法线,使用到

  • NVIDIA Texture Tools Exporter
  • legacy ps cs 5.0 or 6.0 的下载地址

这个工具生成并不复杂,原理和:高度转法线的功能差不多,可以查看我之前的一篇:Unity Shader - ddx/ddy偏导函数测试,实现:锐化、高度图、Flat shading应用、高度生成法线

安装好之后,在:滤镜/NVIDIA Tools/NormalMapFilter… 中即可打开

在这里插入图片描述

在对应的 photoshop 安装目录下回有一个 plugin 有显示 *.8bf 文件
在这里插入图片描述


法线生成素材图

打开这么一张图:
在这里插入图片描述


扣干净无用像素

使用魔术棒工具,设置好:不连续,20 容差

在这里插入图片描述

将中间灰色部分扣除掉
在这里插入图片描述


使用 NVIDIA Normal Map Filter 生成贴图

打开上面提到的:NVIDIA Normal Map Filter 工具,设置好参数,点击:OK
在这里插入图片描述

下面就是生成后的法线贴图
在这里插入图片描述


配置好 URP Renderer

不使用 RenderPath: Deffered 也没问题,原来时:Forward

如果 RenderPath : Forward的话,那么在 Render Feature 中的 Techinque 要选择:DBuffer
在这里插入图片描述


添加好 Decal Render Feature

在这里插入图片描述


设置好 Decal Render Feature Techniqu: DBuffer

在这里插入图片描述


配置好 unity shader graph

在这里插入图片描述


添加 URP Decal Projector 组件

在 hierarchy 视图添加:empty go,添加 URP Decal Projector
在这里插入图片描述


配置好 URP Decal Projector 参数

在这里插入图片描述


最终效果

在这里插入图片描述

请添加图片描述


原理

以 Deferred Rendering Path 为例

URP Decal Projector 组件集成了:从过 Blit 也好,或是 CopyTo/CopyFrom 也好
先将 GBuffer 中的 Albedo, Normal 等,需要的数据复制到 DBuffer

然后 在 Decal Shader 中读取 DBuffer 的参数,修改通过该Decal Shader 逻辑处理修改后的数据重新输出到 GBuffer

然后 GBuffer 就按 Deferred Rendering Path 流程,继续往下走


下面是正常的 Deferred Rendering Path 的过程

Regulars Write Albedo, Normal, PositionWS, Metallic, Roughness, AO, Depth
Rendering with GBufer Data
Deferred Rendering Pipeline
GBuffer
Deferred Shader

然后我在 GBuffer 之后再添加一个 修改 GBuffer 的过程

修改过程如下

Reading GBuffer Data to DBuffer
Albedo
Normal
Compute And Write Back GBuffer
Modifing GBuffer Data - Decal Shader
GBuffer
DBuffer
Decal Shader

然后我们将: Modifing GBuffer Data - Decal Shader 子过程放入到原来的 Pipeline 中,如下:

Regulars Write Albedo, Normal, PositionWS, Metallic, Roughness, AO, Depth
Copy GBuffer to DBuffer
Rendering with GBufer Data
Deferred Rendering Pipeline
Modifing GBuffer Data - Decal Shader
GBuffer
Deferred Shader

这样就达到了修改 normal 的效果

URP Decal Shader Graph 中,也提供了修改 Base Col, MAOS ,就是修改 albedo, metallic, ao, smoothness 的关键地方,如下图所示
在这里插入图片描述


Project

TestURP_DecalSystem_Unity_2021.3.1f1.unitypackage


http://chatgpt.dhexx.cn/article/KNpYpYlP.shtml

相关文章

图形杂记-Decal贴花

ThreeJS WEBGL Decal 贴花 在图形学里主要指将特定图案,以类似粘贴或印刷的方式附着于其他物体上,能创造一种新颖的体验或逼真的效果,比较有趣,游戏中比较出名的有喷射战士splatoon123等。 unity HDRP中默认支持decal&#xff0c…

SQL中的declare用法

 平时写SQL查询、存储过程都是凭着感觉来,没有探究过SQL的具体语法,一直都是按c#那一套往SQL上模仿,前几天项目中碰到一个问题引起了我对declare定义变量的作用域的兴趣。 大家都知道c#中的局部变量,在i…

UE4使用贴花(Decal)

一、创建贴花材质 1:新建一个Material材质,修改Material Domain 为Deferred Decal (延迟贴花),设置Blend Mode 为Translucent(半透明) 2:新建节点 3:给节点赋予材质,根据要求链接透明度和粗糙度 二、使用使用贴花 …

Deferred Decal(延迟贴花)

Decal渲染是一个引擎中重要的一部分,记忆中印象最深刻的就是以前CS中的弹痕与爆炸痕迹了。目前来说,Decal的实现方法也比较多,而且感觉还跟游戏类型有关,比如子弹乱飞的射击类FPS游戏中对贴花系统的要求就比较高,因为本…

【游戏开发小技】Unity中实现Dota里的角色技能地面贴花效果(URP | ShaderGraph | Decal)

本文最终效果 文章目录 一、前言二、环境准备1、URP环境准备2、技能范围图案 二、方案一:写Shader实现1、Shader脚本:UrpDecal.shader2、材质球3、创建Cube4、地面场景5、添加Renderer Feature: Decal6、移动DecalCube,与地面交叉7、运行效果…

UE5实现贴地面效果(RT+Decal)

文章目录 1.实现目标2.实现过程2.1 实现原理2.1.1 Render Target2.1.2 Polygon2.2 具体过程3.参考资料1.实现目标 在之前的文章中基于CesiumForUnreal实现了对地形3DTileset的贴地面绘制效果,在这里基于UE自带的RT和Decal实现更加通用的贴地面效果。依旧是加载在线的Cesium W…

Unity Shader-Decal贴花(SelfDecal,Alpha Blend,Mesh Decal,Projector,Deferred Decal)

前言 最近通关了《What Remains of Edith Finch》(艾迪芬奇的记忆),总体来说应该算是一个剧情解密向的游戏,故事表现手法十分出色。 游戏主要是叙述一个神秘的家族遭遇了一系列类似《死神来了》的故事,家族的人离奇死…

Unity Decal 贴花效果测试

贴花效果,就和名字的直接意思类似,把一张图贴到另一个物体上显示,经常被用于表现一些重复出现的图案,比如弹孔,涂鸦,污渍等。效果图: 常规贴花实现 Unity官方提供了一个工程,这个…

UE4 Decal 贴花不在静态光照下绘制

Decal顶点没有烘焙的光照数据,因此无法在含前向管线的阴影下绘制。特效贴花为unlit自发光材质,阴影下表现影响不大。而场景Decal需要计算光照。 1. Decal实现原理 MobileDecalRendering.cpp 通过矩阵变换 得到FrustumComponentToClip,传入…

游戏中的Decal(贴花)

在游戏中,decal是一种非常常见的效果,常用来实现弹孔,血迹,涂鸦等效果。最近研究了下Decal在游戏引擎中的实现方式,大致总结了一下:1.基于面片实现:直接用一个Quat的mesh,加上一张贴图&#xff…

UE4 Decal实现简介

Decal 是游戏中常见的一个东西,经常被用在 显示弹痕,地面叠加花纹等。 Decal 绘制流程 Decal可以认为是,将一个面的画面沿Decal的Box的X轴方向投影到物体表面。 Decal的绘制实际只有一个Box绘制。 RHICmdList.DrawIndexedPrimitive(GetUn…

跳出for循环

跳出for循环有三种方式&#xff1a; 1&#xff1a;continue&#xff1b;跳出当次循环&#xff0c;可继续进行下一个循环&#xff1b; function ceshi(){for(var i 0 ; i < 6 ; i){if(i 3){continue;}console.log(,i);} }ceshi(); 效果图&#xff1a; 2&#xff1a;brea…

跳出forEach循环

我们平时用到的循环有很多种。for, map, while, forEach, for...of, for...in等等&#xff0c;每种循环都有在某一次循环语句中跳出本次循环的方法&#xff0c;但是除了forEach。 有小伙伴说不用不就好了。其实这些循环里边&#xff0c;当属for的效率最高&#xff0c;for...in最…

Java 8 跳出foreach循环,跳出本次循环,继续执行,之前的for each循环如何跳出本次循环,跳出循环,跳出多层for循环。

在Java8之前&#xff0c;最开始使用for i 循环&#xff0c;很老旧&#xff0c; 后来有了高级的for each 循环&#xff0c;然后这个跳出本次循环和跳出所有的for循环&#xff0c;都简单&#xff0c;稍微没见过的就是跳出多层for循环。 然后就是Java8出的foreach循环&#xff0…

js中的for循环如何跳出,js中for循环的两种语法

js几种for循环的几种用法 谷歌人工智能写作项目&#xff1a;小发猫 js&#xff0c;for循环是怎么运行的&#xff1f; typescript有哪些变化。 最普遍的介绍&#xff1a;for循环是JavaScript中最常用的循环&#xff0c;标准for循环代码格式为&#xff1a;for(定义变量初始值;…

if/while/do-while/for循环以及跳出循环break/return/continue

流程控制对任何一门编程语言都是至关重要的&#xff0c;它为我们提供了控制程序步骤的基本手段。常见对主要分为&#xff0c;条件语句、循环语句、跳转语句。 1、if语句 if 语句是一种判断语句。 语法&#xff1a; if(条件){条件成立时执行的代码 } if...else 语句当条件成…

Python中跳出循环的两种方法

我们经常遇到循环在进行到某一个特定的值时&#xff0c;需要跳出循环&#xff0c;或跳过这个值&#xff0c;python中早已为我们准备了这样的参数:break,continue 比如下面的for循环&#xff1a; for i in range(1,10):print(循环了,i,次) 结果显而易见如图&#xff1a; 当我…

js foreach与for循环之return跳出循环

因为自己比较大只&#xff0c;容易忘记&#xff0c;仅此用来记录一下~ 各种循环中使用return或者退出循环的机制。 1、forEach 使用 return 可以退出循环吗&#xff1f;下面代码打印啥&#xff1f; const list [1, 2, 3, 4, 5]list.forEach(e > {if (e 3) {return}consol…

JS中如何跳出.forEach循环

写在前面 提到在一段程序中如果碰到需要终止&#xff0c;结束一个循环&#xff0c;函数或者一段代码&#xff0c;一般会想到以下这几个关键字return、continue、break 简述一下三者的区别&#xff1a; break: 终止整个循环(有内层循环时终止的是内层循环)&#xff0c;退出swi…

JavaScript foreach 方法跳出循环

通常&#xff0c;在 for循环中跳出循环可以用 break或者 continue 来跳出循环。 break&#xff1a;跳出循环&#xff1b; continue&#xff1a;跳过当次循环。 而有时候需要在 foreach 中跳出循环&#xff0c;该怎么做呢&#xff1f; forEach() 方法用于调用数组的每个元素&am…