UE hard/soft reference| DDX DDY | Unity pcg color

目录

1.虚幻引擎性能优化 (附0跳转Unity对应机制)

hard reference and soft reference

1. 硬引用(Hard Reference)

2. 软引用(Soft Reference)

3. 使用原则

2.空间梯度转法线

DDX DDY节点

​编辑

3.ddx和ddy节点深入解释

1. DDX 和 DDY 的定义

2. 微积分解释

3. 应用场景

4. 公式和示例

总结

4.偏导数

1. 偏导数的定义

2. 几何解释

3. 计算偏导数的例子

4. 偏导数的应用

附0:C#程序化生成不同高度的颜色C#:

逆插值函数解释:

附1:Unity中类似硬引用和软引用的机制


1.虚幻引擎性能优化 (附0跳转Unity对应机制)

hard reference and soft reference

在虚幻引擎中,硬引用(Hard Reference)和软引用(Soft Reference)各自有不同的内存管理和加载行为。硬引用保证了资源在对象加载时立即可用,但会占用更多内存;软引用则适合需要动态加载的资源,在优化加载时间和内存使用方面有很大优势,但需要管理资源的加载和卸载。

1. 硬引用(Hard Reference)

  • 定义:硬引用是直接引用资源对象的方式。使用硬引用的对象在加载时会立即加载其所有的被引用资源。
  • 加载行为:一旦对象加载,所有硬引用的资源会被强制加载到内存中。这可能会导致较长的加载时间,尤其是当引用的资源较大时。
  • 内存管理:硬引用的资源始终驻留在内存中,直到引用它们的对象被销毁。
  • 适用场景:适合始终需要的资源,例如核心游戏逻辑和界面中持续显示的资源。
  • 示例UObject* MyObject 是一个硬引用,编译时直接生成对象引用。

2. 软引用(Soft Reference)

  • 定义:软引用(也称为“弱引用”)是一种延迟加载的引用方式。资源在使用时才被加载到内存。
  • 加载行为:使用软引用的资源不会立即加载,只有在明确请求资源时才会被加载。这减少了初始加载时间。
  • 内存管理:软引用的资源只有在需要时才加载,可以在不需要时从内存中卸载,节省内存。
  • 适用场景:适合非关键资源或不一定总是需要的资源,例如备用的武器模型、装饰对象等。
  • 示例TSoftObjectPtr<UObject> MySoftObject 是一个软引用,需要在代码中手动调用 LoadSynchronous() 方法或使用异步加载来实际加载资源。

3. 使用原则

  • 硬引用:用于常驻内存、频繁使用或关键的资源,以确保稳定性。
  • 软引用:用于可选资源或在某些特定条件下才需要的资源,优化内存和加载时间。

2.空间梯度转法线

DDX DDY节点

  • DDX DDY节点使用:可以使用它们来计算法线贴图的屏幕空间梯度。
  • 虚幻引擎中的heightToNormal节点解释: cheap blur by stacking them or to generate outlines/lines by color difference

相关微积分解释:

  • 平均斜率是用来描述整个区间上函数变化的整体趋势的
  • C2 secondary derivative match up.二阶导数表示切线斜率变化曲线
  • C0 make sure the output of approximation equals to the original function
  • C1 make sure the derivative equals to the derivative of the original function

泰勒级数展开的图例表达

3.ddx和ddy节点深入解释

DDXDDY 节点用于计算纹理或材质输入的屏幕空间导数。这些节点的原理涉及微积分中的偏导数,可以帮助实现抗锯齿和 mipmapping 等效果。以下是这两个节点的微积分解释:

1. DDX 和 DDY 的定义

  • DDX (Partial Derivative in X direction)DDX 节点计算出材质输入在屏幕 X 方向上的偏导数,表示在屏幕水平轴上输入值的变化率。
  • DDY (Partial Derivative in Y direction)DDY 节点计算出材质输入在屏幕 Y 方向上的偏导数,表示在屏幕垂直轴上输入值的变化率。

简单来说,DDXDDY 分别对应输入在屏幕上水平方向和垂直方向的变化率。这些偏导数是基于像素间的差异计算的,帮助确定每个像素应该显示的细节程度。

2. 微积分解释

在微积分中,偏导数表示一个函数沿某个变量方向上的变化率。在这里,材质的输入值 f(x, y) 是一个二维函数,DDXDDY 分别计算沿 X 和 Y 方向的变化率:

  • DDX(f) ≈ ∂f∂x\frac{\partial f}{\partial x}∂x∂f​
  • DDY(f) ≈ ∂f∂y\frac{\partial f}{\partial y}∂y∂f​

具体来说,DDX(f) 近似地表示相邻像素之间的输入值在 X 方向上的变化量,而 DDY(f) 表示相邻像素之间在 Y 方向上的变化量。虚幻引擎通过采样相邻像素来计算这些导数,称为“有限差分法”。

3. 应用场景

  • Mipmapping:当计算出导数后,可以知道当前像素输入的变化速度。如果变化率大,则需要选择更低级别的纹理贴图(即更模糊的 mip 级别),以减少纹理细节上的锯齿。
  • 抗锯齿:对于一些需要平滑处理的效果(例如法线贴图或细节纹理),使用导数可以帮助实现更平滑的过渡。
  • 流动效果:如果使用 DDXDDY 计算偏导数,可以得到材质在屏幕上的流动方向或变化趋势,从而控制纹理偏移、UV 扭曲等。

4. 公式和示例

假设 f(x, y) 是一个像素在屏幕上的 UV 坐标或颜色值,DDX(f)DDY(f) 的计算方式如下:

  • DDX(f) ≈ f(x+Δx,y)−f(x,y)f(x + \Delta x, y) - f(x, y)f(x+Δx,y)−f(x,y)
  • DDY(f) ≈ f(x,y+Δy)−f(x,y)f(x, y + \Delta y) - f(x, y)f(x,y+Δy)−f(x,y)

这里 Δx\Delta xΔx 和 Δy\Delta yΔy 是屏幕上相邻像素的距离。在材质编辑器中使用 DDXDDY 可以将这些偏导数用于纹理的自适应采样、抗锯齿、动态效果等。

总结

  • DDXDDY 是计算偏导数的工具,提供材质输入在 X 和 Y 方向上的变化率。
  • 这些节点帮助虚幻引擎根据屏幕空间的变化来动态调整材质,进而优化视觉效果,减少锯齿。

4.偏导数

1. 偏导数的定义

假设有一个多元函数 f(x,y)f(x, y)f(x,y),其值依赖于变量 xxx 和 yyy。偏导数表示 fff 相对于其中一个变量的变化率:

  • 相对于 xxx 的偏导数:记为 ∂f∂x\frac{\partial f}{\partial x}∂x∂f​,表示在 yyy 不变的情况下,fff 随 xxx 的变化率。
  • 相对于 yyy 的偏导数:记为 ∂f∂y\frac{\partial f}{\partial y}∂y∂f​,表示在 xxx 不变的情况下,fff 随 yyy 的变化率。

偏导数符号中的 ∂\partial∂ 用于区别普通导数 ddd,因为偏导数涉及多元函数的多个变量。

2. 几何解释

在几何上,偏导数可以理解为函数图形在某个方向上的“斜率”。例如:

  • ∂f∂x\frac{\partial f}{\partial x}∂x∂f​ 表示函数 f(x,y)f(x, y)f(x,y) 在 xxx 方向的斜率,即图形在 xxx 方向的变化趋势。
  • ∂f∂y\frac{\partial f}{\partial y}∂y∂f​ 表示函数 f(x,y)f(x, y)f(x,y) 在 yyy 方向的斜率。

可以把它想象成在一个山丘上,分别沿东西(xxx 方向)和南北(yyy 方向)走一步,查看高度的变化。

3. 计算偏导数的例子

假设 f(x,y)=x2+y2f(x, y) = x^2 + y^2f(x,y)=x2+y2,计算它的偏导数:

  • 相对于 xxx 的偏导数:保持 yyy 不变,对 xxx 求导数:

    ∂f∂x=2x\frac{\partial f}{\partial x} = 2x∂x∂f​=2x
  • 相对于 yyy 的偏导数:保持 xxx 不变,对 yyy 求导数:

    ∂f∂y=2y\frac{\partial f}{\partial y} = 2y∂y∂f​=2y

这表示在 xxx 增大时,f(x,y)f(x, y)f(x,y) 的变化率为 2x2x2x;在 yyy 增大时,f(x,y)f(x, y)f(x,y) 的变化率为 2y2y2y。

4. 偏导数的应用

偏导数广泛用于计算中,特别是在涉及到二维或多维数据的场合,例如:

  • 机器学习:用于优化函数,调整模型参数。
  • 物理学:描述多维空间中不同方向的变化,例如电场、重力场的分布。
  • 计算机图形学:如虚幻引擎中的 DDXDDY,用于计算纹理在屏幕空间中的变化率,从而动态调整渲染效果。


附0:C#程序化生成不同高度的颜色C#:

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;[RequireComponent(typeof(MeshFilter))]
public class mesh_generator : MonoBehaviour
{Mesh mesh;Vector3[] vertices;int[] triangles;Color[] colors;public int xSize = 20;public int zSize = 20;public Gradient gradient;float minTerrainHeight;float maxTerrainHeight;//normalize height//vertex count = (xSize+1)*(zSize+1)void Start(){mesh = new Mesh();GetComponent<MeshFilter>().mesh = mesh;CreateShape();UpdateMesh();}// Update is called once per framevoid CreateShape(){vertices = new Vector3[(xSize + 1) * (zSize + 1)];for (int i = 0,z =0; z <= zSize; z++){for(int x = 0; x <= xSize; x++){float y = Mathf.PerlinNoise(x*.4f, z * .4f) * 2f;//*.3f  for scalevertices[i] = new Vector3(x, y, z);if(y>maxTerrainHeight)maxTerrainHeight = y;if(y<minTerrainHeight)minTerrainHeight = y;//这两行代码用于跟踪地形的最高和最低点。//每生成一个新的 y 值(高度),都会检查它是否比当前的 maxTerrainHeight //或 minTerrainHeight 更大或更小//从而更新这些变量。minTerrainHeight 和 maxTerrainHeight 在后续用于颜色渐变//(例如,生成一个从山谷到山顶的颜色过渡)。i++;}}triangles = new int[xSize*zSize*6];int vert = 0;int index =0;for (int z = 0; z < zSize; z++){for (int x = 0; x < xSize; x++){triangles[index + 0] = vert + 0;triangles[index + 1] = vert + xSize + 1;triangles[index + 2] = vert + 1;triangles[index + 3] = vert + 1;triangles[index + 4] = vert + xSize + 1;triangles[index + 5] = vert + xSize + 2;vert++;index += 6;}vert++;//3*3, 行结束后 vert++,vert = 4, index = 18}//uvs = new Vector2[vertices.Length];colors = new Color[vertices.Length];//创建一个 colors 数组,长度同 vertices 顶点数组。存储每个顶点对应颜色值。for (int i = 0, z = 0; z <= zSize; z++){for (int x = 0; x <= xSize; x++){//uvs[i]=new Vector2((float)x/xSize,(float)z/zSize);float height = Mathf.InverseLerp(minTerrainHeight, maxTerrainHeight, vertices[i].y);//Mathf.InverseLerp 函数将 vertices[i].y(顶点的高度)映射到一个 0 到 1 的范围。colors[i] = gradient.Evaluate(height);//gradient.Evaluate(height) 根据高度 height 从 gradient 中获取对应的颜色。//将计算得到的颜色存储到 colors[i] 中,与顶点 vertices[i] 一一对应。i++;}}}void UpdateMesh(){mesh.Clear();mesh.vertices = vertices;mesh.triangles = triangles;mesh.colors = colors;mesh.RecalculateNormals();}
}

逆插值函数解释

Mathf.InverseLerp(float min, float max, float value)

参数解释:

  • min: 范围的最小值。
  • max: 范围的最大值。
  • value: 需要进行归一化的值。

result=value−min/max−min

这个函数之所以叫做逆向插值(Inverse Lerp),是因为它完成了与普通**线性插值(Lerp)**相反的操作。 

Mathf.Lerp(float a, float b, float t) 给定两个值 ab,以及插值系数 t(在 [0, 1] 范围内),返回 ab 之间按 t 的比例插值后的值value

Mathf.InverseLerp(float min, float max, float value) 的作用是给定 valueminmax 之间,反向求解位置比例 t,表示 value 距离 minmax 的相对位置。

附1:Unity中类似硬引用和软引用的机制

在 Unity 中,没有完全相同的术语或系统。但有以下对应机制:

  • 直接引用类似于硬引用,适合需要常驻的资源。直接引用通常指的是在脚本中直接通过 public[SerializeField] 变量引用资源。
  • Addressables 中的 AssetReference 提供了类似软引用的功能,支持延迟加载和内存管理。
  • Resources.Load() 也可以用来动态加载资源,但缺少 Addressables 的强大内存管理功能。

Unity 的 Addressables 是官方推荐的资源管理工具,它更接近于 Unreal Engine 的软引用,特别适合需要动态加载和卸载资源的项目。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方

没想到大家这篇文章呼声还挺高 这篇文章是对它的详细实现&#xff0c;建议在阅读本篇之前&#xff0c;先浏览一下前面的文章&#xff0c;以便更好地理解和掌握内容。 这种老派的假反射技术&#xff0c;适合用于移动端或对反射效果的速度和清晰度有较高要求的场合。该技术通过一…

前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)

一、相对定位 使用相对定位的盒子会相对于自身原本的位置&#xff0c;通过偏移指定的距离&#xff0c;到达新的位置。盒子的本体仍处于文档流中。使用相对定位&#xff0c;除了要将 position 属性值设置为 relative 外&#xff0c;还需要指定一定的偏移量。其中&#xff0c;水…

基于微信小程序的移动学习平台的设计与实现+ssm(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

git 工具原理

git 目录 git git的使用 了解git的三个区域 具体操作 如何下载别人上传到git的工程 -- 可以参考菜鸟教程&#xff0c;包括安装配置git Git 安装配置 | 菜鸟教程 -- Git 是一种分布式版本控制系统&#xff0c;用于管理软件项目的源代码。它是由 Linux 之父 Linus Torval…

Linux操作系统:学习进程_对进程的深入了解

目录 前言 开篇 一、进程概念 二、进程的描述与管理 1、如何描述与管理 2、Linux中的PCB-task_struct 3、对进程组织的理解 三、进程的属性 1、系统创建进程 2、查看进程 3、进程的标识符 4、退出进程 1>ctrlc 2>kill命令杀死进程 5、用户进程的创建方式…

力扣:225 用队列实现栈

栈、队列 栈&#xff1a; 弹夹&#xff0c;后进先出 队列&#xff1a; 排队&#xff0c;先进先出 描述&#xff1a; var MyStack function () {// 定义两个数组&#xff0c;模拟队列this.queue []this._queue [] };/** * param {number} x* return {void}*/ MyStack.protot…

lora训练模型 打造个人IP

准备工作 下载秋叶炼丹器整理自己的照片下载底膜 https://rentry.org/lycoris-experiments 实操步骤 解压整合包 lora-scripts,先点击“更新” 训练图片收集 比如要训练一个自己头像的模型&#xff0c;就可以拍一些自己的照片&#xff08;20-50张&#xff0c;最少15张&…

IO 多路复用技术:原理、类型及 Go 实现

文章目录 1. 引言IO 多路复用的应用场景与重要性高并发下的 IO 处理挑战 2. IO 多路复用概述什么是 IO 多路复用IO 多路复用的优点与适用场景 3. IO 多路复用的三种主要实现3.1 select3.2 poll3.3 epoll三者对比 4. 深入理解 epoll4.1 epoll 的三大操作4.2 epoll 的核心数据结构…

大数据新视界 -- 大数据大厂之 Impala 性能优化:从数据压缩到分析加速(下)(8/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

信息学奥赛一本通 1395:烦人的幻灯片(slides)

【题目链接】 ybt 1395&#xff1a;烦人的幻灯片(slides) 【题目考点】 1. 图论&#xff1a;拓扑排序 【解题思路】 先理解题意&#xff1a; 如图&#xff0c;每张幻灯片是一个矩形&#xff0c;在该矩形范围内有一个位置写了这张幻灯片的编号。但实际情况是幻灯片是透明…

DB-GPT系列(三):底层大模型设置(开源模型、在线模型)

前面两篇文章分别对 DB-GPT 的总体情况进行了介绍&#xff0c;同时涵盖了镜像一键部署与源码部署这两种部署方式。 DB-GPT系列&#xff08;一&#xff09;&#xff1a;DB-GPT能帮你做什么&#xff1f; DB-GPT系列&#xff08;二&#xff09;&#xff1a;DB-GPT部署&#xff0…

LabVIEW配电产品精度测试系统

开发了一种基于LabVIEW平台的配电产品精度测试系统&#xff0c;通过自动化测试流程实现更高的测试准确性与效率。系统采用串口和TCP通信技术&#xff0c;与多功能交流采样变送器和配电设备无缝数据交互&#xff0c;提升了测试工作的可靠性和一致性。 一、项目背景 在配电产品…

详解Java之Spring MVC篇二

目录 获取Cookie/Session 理解Cookie 理解Session Cookie和Session的区别 获取Cookie 获取Session 获取Header 获取User-Agent 获取Cookie/Session 理解Cookie HTTP协议自身是“无状态”协议&#xff0c;但是在实际开发中&#xff0c;我们很多时候是需要知道请求之间的…

【大数据学习 | kafka】kafka的偏移量管理

1. 偏移量的概念 消费者在消费数据的时候需要将消费的记录存储到一个位置&#xff0c;防止因为消费者程序宕机而引起断点消费数据丢失问题&#xff0c;下一次可以按照相应的位置从kafka中找寻数据&#xff0c;这个消费位置记录称之为偏移量offset。 kafka0.9以前版本将偏移量信…

RabbitMQ 管理平台(控制中心)的介绍

文章目录 一、RabbitMQ 管理平台整体介绍二、Overview 总览三、Connections 连接四、Channels 通道五、Exchanges 交换机六、Queues 队列查看队列详细信息查看队列的消息内容 七、Admin 用户给用户分配虚拟主机 一、RabbitMQ 管理平台整体介绍 RabbitMQ 管理平台内有六个模块&…

推荐一款强大的图像处理软件:Adobe Photoshop2025

AdobePhotoShop赛博日落版是一款强大的图像处理软件&#xff0c;专为用户提供多种先进的图像编辑功能。该版本包含了最新的AI移除工具、AI查找干扰功能以及Neural Filters神经滤镜插件&#xff0c;旨在提升用户的创作效率和成品效果。 主要功能 - AI创意填充&#xff1a;该功能…

PC模块静电放电测试中的宕机黑屏

静电放电(ESD)是电子设备中常见且难以避免的干扰源之一,尤其是在复杂的电子系统中,它对系统的稳定性和可靠性影响极大。近期,在进行静电放电(6KV接触放电、15KV空气放电)测试时,某P C模块在多个端子(如USB、RJ45、HDMI及耳机端子)遭遇了显示黑屏、图像异常及系统宕机…

吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.7-4.8

目录 第四门课 卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;第四周 特殊应用&#xff1a;人脸识别和神经风格转换&#xff08;Special applications: Face recognition &Neural style transfer&#xff09;4.7 深度卷积网络学习什么&#xff1f;&am…

适用于个人或团队的文档管理和知识库系统,NAS快速部署『BookStack』

适用于个人或团队的文档管理和知识库系统&#xff0c;NAS快速部署『BookStack』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 知识库对于很多需要和文字打交道的个人或者团队都不陌生对吧&#xff1f;对于我们个人来说&#xff0c;它可以将常用的学习资料、工作笔记、项目计划和…

并发编程的基础:深入理解内存屏障(Memory Barriers)

内存屏障是一种基础语言&#xff0c;在不同的计算机架构下有不同的实现细节。本文主要在x86_64处理器下&#xff0c;通过Linux及其内核代码来分析和使用内存屏障 对大多数应用层开发者来说&#xff0c;“内存屏障”&#xff08;memory Barrier&#xff09;是一种陌生&#xff…