Unity Shader 光线追踪原理与实战案例

Unity Shader-GodRay,体积光(BillBoard,Volume Shadow,Raidal Blur,Ray-Marching) 前言好久没有更新博客了,经历了不少事情,好在最近回归了一点正轨,决定继续Unity Shader的学习之路。作为回归的第一篇,来玩一个比较酷炫的效果,一般称之为GodRay,也有人叫它云隙光,当然,最高大上的名字就是体积光散射了。这几个名字对应几种类似的效果,但是实现方式相差甚远。先来几张照片以及其他游戏的截图看一下:ps:这张图片是一张照片哈,是本屌丝看别人的云南游记发现的,清明节本来想去的,结... 阅读详情

从硬件加速到屏幕空间追踪,理解 URP 17+ 中光线追踪的核心机制与 5 个生产级应用

一、什么是 URP 光线追踪

传统光栅化渲染(rasterization)只计算 从光源到表面 的直接光照,无法自然处理反射、折射、间接光等复杂现象。 光线追踪(Ray Tracing) 则反转了光线方向:从相机发射"虚拟光线"进入场景,与几何体求交,从而天然支持这些视觉效果。

Unity 6 / URP 17 提供了完整的光线追踪集成,底层使用 DXR(DirectX Raytracing)或 Vulkan RT 后端。 关键的是 URP 提供了 多种渲染模式,可以根据项目硬件预算灵活选择:

渲染模式光追类型硬件要求适用场景
Raster(光栅化)无任意移动端、低端 PC
Raster + Screen Space RTSSR / SSGI / SSAO任意中端 PC 主机
Ray Traced硬件 DXR / Vulkan RTRTX / RDNA2+高端 PC、PS5、Xbox
Path Traced硬件 RT + 多次弹射RTX 30+ 建议电影级、CG 短片

二、URP 光线追踪的整体架构

URP 的光线追踪并不是取代整个前向/延迟渲染,而是 嵌入 现有管线的特定阶段, 仅对需要的视觉效果启用追踪计算。整体流程如下:

核心数据结构

URP 的光线追踪依赖三个核心数据对象:

  • RayTracingAccelerationStructure(加速结构):BVH(Bounding Volume Hierarchy)形式的场景几何体组织,BLAS 描述单个网格,TLAS 描述整个场景实例层级。
  • RayTracingShader(追踪 shader):包含 __raygen、__miss、__closesthit、__anyhit 等可调函数。
  • RayTracingPass:通过 CommandBuffer.DispatchRays 调度一次追踪计算。

三、追踪算法的核心数学

追踪的本质是 光线与几何体求交。在硬件 RT 出现之前,CPU 上有经典算法如 Möller-Trumbore 三角面求交; GPU 的硬件 RT 把这一计算交给 BVH 加速结构和专用电路(如 NVIDIA 的 RT Core)处理。

光线定义

R(t) = O + t · D, t ∈ [tmin, tmax]

其中 O 是起点,D 是方向,t 是沿光线的距离参数。

追踪递归方程(渲染方程)

Lo(p, ωo) = Le + ∫Ω f(p, ωi, ωo) · Li(p, ωi) · (n · ωi) dωi

渲染方程描述了从表面点 p 朝方向 ωo 出射的辐射亮度。蒙特卡洛路径追踪通过发射随机光线采样这个积分。

BVH 加速结构的工作方式

性能关键:BVH 重建(rebuild)是追踪性能的最大瓶颈之一。 静态场景只需构建一次,动态场景可以使用 RayTracingAccelerationStructure.Update 增量更新。 URP 内部会自动管理这个生命周期,开发者只需在 UniversalRenderPipelineAsset 中开启对应开关。

四、案例一:光线追踪环境光遮蔽(RTAO)

环境光遮蔽(AO)模拟的是 几何体之间的相互遮挡。传统 SSAO 用屏幕空间深度近似,效果受屏幕分辨率限制; RTAO 在半球空间内发射真实光线,能捕捉到更精确的远距离遮蔽关系。

算法原理

  1. 对每个表面点 p,沿法线半球方向采样 N 条光线
  2. 追踪每条光线,统计未命中(被遮挡)比例
  3. 将未命中率作为 AO 系数

AO(p) = 1 − (1/N) · Σ visibility(p, ωi)

URP 配置步骤

  1. 打开 UniversalRenderPipelineAsset,将 Rendering Path 改为 Deferred。
  2. 在 UniversalRendererData 上点击 Add Renderer Feature → Screen Space Ambient Occlusion。
  3. 将 Ambient Occlusion 的 Source 设为 Ray Traced(需 GPU 支持 DXR/Vulkan RT)。
  4. 调节 Max Ray Length、Sample Count、Denoiser 三个核心参数。

推荐参数:Sample Count 在 PC 设为 4–8,主机 设为 2–4(依赖时序降噪)。 Max Ray Length 决定 AO 半径——室内 2–5m,室外 5–20m。Max Ray Length 越大,性能开销越高。

五、案例二:光线追踪反射(RTR)

反射是 RT 最直观的应用。SSR(屏幕空间反射)只能反射屏幕上可见的物体,遇到屏幕外或被遮挡的几何体时只能 fallback 到 cubemap; RTR 不受屏幕限制,能反射场景中的任何物体。

URP 中的反射模式对比

反射模式支持屏幕外几何体性能开销最佳场景
Reflection Probe(烘焙)否(仅静态)极低室内静态场景
SSR否中光滑地面、金属
RTR是中高镜面、抛光金属、水面
Hybrid(SSR + RTR 切换)是可调复杂动态场景
// URP 中启用 RTR(伪代码基于 URP 17 Renderer Feature) class RayTracedReflectionsFeature : ScriptableRendererFeature { public enum Mode { Off, SSR, RTR, Hybrid } public Mode mode = Mode.Hybrid; public int sampleCount = 4; public float maxRayLength = 50f; public float smoothnessCutoff = 0.6f; public override void AddRenderPasses(ScriptableRenderer renderer, ...) { if (mode == Mode.Hybrid) { // 平滑度高 → 用 SSR(便宜) // 平滑度低 + 屏幕外 → 用 RTR } } }

六、案例三:光线追踪全局光照(RTGI)

全局光照(GI)模拟光能在场景中 多次弹射 的效果。传统 lightmap 是预计算的,无法处理动态物体; 屏幕空间 GI(SSGI)受屏幕限制。RTGI 通过追踪二次光线,能实时计算单次或多次弹射的间接光。

单次弹射 RTGI 算法

  1. 从当前着色点 p 沿法线半球采样 N 条光线
  2. 追踪每条光线,命中点 q 的位置和法线从 G-Buffer 读取
  3. 在 q 处直接查询光照(如 SH 环境光或主光)
  4. 累加作为 p 的间接光

LGI(p) ≈ (1/N) · Σ Ldirect(q) · visibility(p, q) · cos(θ)

性能注意:单次弹射 RTGI 在 1080p 下每像素采样 4 条光线、追踪到第一次命中时 通常已接近实时上限(高端 PC 约 4-8ms)。如果需要多次弹射,建议改为 Path Tracing 并启用 NRD 去噪。

七、案例四:光线追踪阴影(RTS)

光栅化阴影(shadow map)本质是 从光源视角渲染深度,必然存在分辨率、走样、级联开销等问题。 追踪阴影则从 接收表面向光源 发射一条光线,命中即被遮挡——非常直观。

算法对比

特性Shadow MapRay Traced Shadow
分辨率受 shadow map 分辨率限制无(按需追踪)
锯齿有,需 PCF 软化天然无锯齿
面积光源困难(多张 cascade)天然支持
性能较低高(与像素数相关)
动态光源需要重建无需重建

面积光的"软阴影"特性

追踪阴影天然支持 面积光源软阴影。对光源表面采样 N 个点,从接收表面向每个点追踪,求遮挡比例:

Visibility = (1/N) · Σ [O_hit(p, light_i) == false]

其中 N 越大阴影越柔和,但 N=4 配合去噪通常就够用。

八、案例五:路径追踪(Path Tracing)

路径追踪是 蒙特卡洛方法 直接求解渲染方程的极限形式:每条光线在表面多次弹射(反射、折射), 每次根据 BRDF 随机采样方向,最终结果是无偏的(unbiased)。

伪代码

// 路径追踪 Ray Generation Shader 伪代码 [shader("raygeneration")] void RayGen() { float3 rayDir = GenerateCameraRay(DispatchRaysIndex().xy); float3 throughput = 1.0; float3 radiance = 0.0; for (int bounce = 0; bounce < MAX_BOUNCES; bounce++) { TraceRay(payload, origin, rayDir, ...); if (payload.hitDistance < 0) { radiance += throughput * SampleSky(rayDir); break; } // 命中表面,采样 BRDF float3 brdf = SampleBRDF(payload.normal, rayDir, payload.albedo); float3 newDir = CosineWeightedSample(payload.normal); radiance += throughput * payload.emission; throughput *= brdf * dot(payload.normal, newDir); rayDir = newDir; } _Output[DispatchRaysIndex().xy] = float4(radiance, 1); }

关于噪声:路径追踪的输出在低采样数下充满噪点。生产实践中通常用 累积帧(progressive accumulation) 或 NRD 去噪器 提升质量。 URP 17 内置了对 NVIDIA NRD 库的封装,可直接调用。

九、性能优化:半分辨率追踪 + 时序去噪

追踪的瓶颈在 每像素光线数 × 总像素数。生产管线几乎都采用两个核心优化:

关键配置

// URP 17 半分辨率追踪配置 var settings = new RayTracingSettings { resolutionScale = 0.5, // 半分辨率 sampleCount = 1, // 每像素光线数 maxRayLength = 30, // 最大追踪距离 denoiser = DenoiserType.NRD, // NRD 去噪 temporalAccumulation = true, // 启用时序累积 motionVectorRejection = 0.1f, // 动体区域检测阈值 };

实战数据:4K 屏幕下,0.5 + NRD 的 RTR 大约 1.2ms,
而全分辨率 + 1spp 无去噪的 RTR 接近 4ms 且充满噪点。半分辨率方案性价比高约 5 倍。

十、完整配置流程

前置条件

  1. Unity 6(或 Unity 2023.3+ LTS)+ URP 17+。
  2. GPU 支持硬件 RT:NVIDIA RTX 系列、AMD RDNA2+、Intel Arc 显卡;或 Vulkan 1.2 + RT 扩展。
  3. Player Settings → Other Settings → 勾选 Ray Tracing。
  4. URP Asset 中 Rendering 改为 Deferred(光追仅在 Deferred 下可用)。

添加追踪 Renderer Feature

  1. 选中 UniversalRendererData,在 Inspector 中点击 Add Renderer Feature。
  2. 选择需要的效果:Screen Space Ambient Occlusion、Screen Space Reflections、Screen Space Global Illumination。
  3. 对每个 feature,将 Mode 改为 Ray Traced。
  4. 配置 Sample Count、Max Ray Length、Denoiser。
  5. 在场景中加入测试物体(带反射地板、面积光源)验证效果。

性能 vs 质量预设

预设分辨率缩放每像素光线弹射数去噪4K 目标帧时
Ultra1.084 (Path)NRD + 时序~8ms (RTX 4080)
High0.542NRD + 时序~3ms
Medium0.511NRD + 时序~1.5ms
Low0.2511简单双边滤波~0.8ms

十一、常见坑与最佳实践

1. 透明物体追踪

默认追踪在 alpha test 物体(带 cutout 的植被、栅栏)上会产生错误结果。需要:

// 透明材质追踪时关闭 alpha test [shader("closesthit")] void ClosestHit(inout Payload payload) { if (alphaTestedMaterial) { // 调用 anyhit shader 检查 alpha IgnoreHit(); // alpha 不通过则忽略 } payload.hitDistance = RayTCurrent(); }

2. 动体更新

URP 默认每帧重建 BLAS 对所有 Skinned Mesh 来说开销巨大。 对骨骼动画物体推荐使用 RayTracingAccelerationStructure.Update 增量更新。

3. 不开去噪不要出图

追踪结果在低采样下噪点非常明显,不接 NRD/降噪器直接展示是业余做法。 始终在追踪 Pass 后跟一个去噪 Pass,否则用户能直接看到噪点。

4. 远距离光线"飞过"全空

Max Ray Length 过大会让大部分光线"飞过整个场景未命中",浪费算力。推荐值:

  • 室内:5 - 20m
  • 室外:50 - 200m
  • 超远景观:500m+,配合天空盒 fallback

5. 与 forward 模式不兼容

URP 的 Forward/Forward+ 模式 不支持 光线追踪 Renderer Feature。 启用 RT 之前必须确认项目使用 Deferred 模式,否则相关 feature 会被自动禁用。

十二、总结

光线追踪让 URP 的渲染能力跃升一个量级。理解下面的对应关系能帮助你快速决策:

视觉效果追踪方案核心收益建议最低配置
精确 AORTAO远距离、复杂几何的遮蔽RTX 2060 / RX 6600
完美反射RTR + SSR 混合屏幕外物体反射RTX 2070 / RX 6700
动态间接光RTGI动态物体 GI、彩色反弹RTX 3060 / RX 6800
面积光软阴影RTS无锯齿、面积光源RTX 3050 / RX 6600
电影级真实感Path Tracing无偏全局解RTX 3080 / RX 6900

一句话总结:URP 的追踪不是替代光栅化,而是光栅化之上的视觉补强。 用"半分辨率 + NRD 去噪"作为默认方案,把有限的 RT 算力花在刀刃上。

Unity渲染机制深度解析:从Lambert到光线追踪的实战测试与问题排查 在计算机图形学中,光线与物体表面的交互是渲染技术的核心,其基本原理决定了最终图像的视觉真实感。从经典的Lambertian漫反射模型到Phong高光模型,再到现代基于物理的渲染(PBR)管线,每一层技术演进都旨在更精确地模拟光线的行为。理解这些反射机制的技术价值在于,它不仅是实现逼真视觉效果的基础,更是开发者进行高效问题诊断和性能优化的关键。在实际的Unity项目开发中,诸如材质显示异常(如“紫了”)、反射效果丢失或性能瓶颈等常见问题,其根源往往与对光照模型、反射探针以及光照贴图烘焙等机制的理解深度直接相关 阅读详情

相关推荐

Unity中实现真实感光柱反射:从物理追踪到Shader渲染的完整方案

在游戏开发与实时渲染领域,光线追踪是实现真实光照与反射效果的核心技术之一。其原理是通过模拟光线在场景中的传播路径,计算与物体表面的交互,从而生成逼真的光影效果。这项技术在提升视觉沉浸感方面具有重要价值,广泛应用于解谜游戏、特效展示和灯光模拟等场景。本文聚焦于Unity引擎中的实现方案,通过CPU端进行精确的物理光线追踪计算,结合GPU端的高质量Shader渲染,解决了传统LineRenderer方案在视觉效果和反射逻辑上的不足。方案中详细探讨了递归射线检测、反射向量计算、动态胶囊体网格生成等关键技术,并融入

hideto 433

基于unity自己写光追。

前几天写的博客好像访问量多了不少。 最近听到裁员的消息挺多的。但是貌似搞unity的找工作还行。 毕竟从事这个的相对少一点。前些年互联网大热,大家都一窝蜂的去学java,后台,前端这个那个的。你看现在人才冗余了吧,所以还是搞点冷门的专业比较好,不要凑热闹。 曾国藩说过,众驶之地勿往。 --------------------------------------------------------------------------------- 闲聊到此结束。 最近工作关系,需要用unity实现

4665

Unity光线反射机制测试Demo实战演示

经过这一整套剖析,你应该已经意识到:好的反射效果 ≠ 堆参数,而是一套系统工程。要想做出让人信服的材质,必须同时考虑:物理合理性:Metallic/Smoothness/F₀是否符合现实规律?环境匹配度:Cubemap或Probe能否真实反映场景内容?视角动态性:菲涅尔、SSR、RTX是否协同工作?性能可控性:不同平台是否有降级预案?最后送大家一句我在项目中常说的话:“当你觉得某个表面‘差点意思’的时候,往往不是缺细节,而是能量分配错了。

weixin_28487725的博客 1264

Unity学习之Shader

Unity学习之Shader

liu_xueping的专栏 4171

DFT实训教程笔记2(bibili版本)- Scan synthesis practice

文章目录Scan synthesis practice 本博文是博主记录DFT实训教程的笔记版本,此笔记并没有对所有的知识进行记录,仅仅以自身的认知水平,来记录了一些部分笔记并加上了自己的理解。 Scan synthesis practice How to design scan clock structure? 假设一块chip里面有好几十个clock domain,如果每一个clock domain都用一个scan clock虽然会非常清晰,但是IO数目肯定不够用。 clock group: 1、no

ciscomonkey的博客 9082

系统设计---算法与架构

这片文章对系统设计的具体步骤及相关知识进行介绍,主要分为四部分:算法设计、IC系统架构设计、基于systemC的IC系统设计、系统设计工具SPW简介。 (一)算法设计 系统设计的第一步是给出清晰的系统规范,该规范写明了系统的功能、性能、费用、开发时间等。接下来创建一个系统行为模型,并且可以用来初步验证设计的性能。再下来,对行为模型进行细化,即进行算法设计。算法设计大致分为三步: 1)给出浮点

正在努力的ICer的博客 4373

在Unity中实现简化的光线追踪

本文介绍了在Unity中实现简化版光线追踪的方法。通过Unity Shader编写光线追踪核心逻辑,利用OnRenderImage函数将自定义着色器应用于相机渲染。文章详细讲解了光线与球体求交的数学原理和代码实现,包括射线参数方程求解、蒙特卡洛积分应用等关键步骤。虽然该实现经过简化(仅使用顺序表存储球体数据,未采用BVH等加速结构),但完整展示了路径追踪的基本原理。

2501_91056363的博客 2025

(赛事-2022)[re:Invent 2018]-002:通过分析log多次迭代优化奖励函数后- 最快7.6s / 圈

Deepracer training 流程

Rainbow 4711

unity3d 求两个点长度_Unity3D实现体积光

体积光是现实中常见的因丁达尔效应而产生的一种大气现象,文人墨客常用“慵懒的阳光泄下”描绘该现象带来的美感。笔者在一次旅游后见到了这种神奇的自然现象,遂决定在游戏中实现并使用这样的效果。青藏高原上雨后初晴的体积光体积光是由空气中的水蒸气和灰尘对光线的散射造成的,显然在实时渲染中我们无法模拟庞杂的微小粒子,只能用近似的方法获得,我们这里将更加着重于实现。我们将使用Unity自带的Shadow...

weixin_39935388的博客 525

【processing】创意编程

首先接到这个作业的时候,我是很崩溃的,我是真的不会画画QAQ,还画自己,这也太难了,于是我决定!还是祸害我爱豆吧!于是我从微博太太那里找了个图临摹 下面是太太的图 先给太太道歉!都是为了作业! 然后我画出来是这样子的 还可以!!!没有特别丑!(虽然也不是特别像吧) 但是画这个真是画死我了,下面贴上代码吧,没啥特殊的就是各种贝塞尔曲线各种圆各种线 //face stroke(70,27,11...

qq_25700571的博客 1267

CCC数字钥匙3.0标准解读(16)

介绍通信过程最重要部分:身份认证和加密.介绍需要身份认证的过程和需要加密的数据及过程.

weixin_41738640的博客 1531

unity 如何运行demo_Unity渐进式光照贴图烘焙详解

随着各大计算平台的算力稳步增长,特别是GPU技术的不断进化,原先可望而不可及的技术比如实时光线追踪技术开始逐步走入玩家的视野。一些先锋厂商甚至已经超出Demo的范畴,开始正式推出支持实时光追的游戏。不过目前的实时光追技术还只能在配备了最新Nvidia RTX 20系列显卡的PC机上才能实现(前一代Nvidia 10系列显卡,比如GeForce 1080,1070,甚至1060也可以用软件...

weixin_39859715的博客 995

CNN卷积神经网络手写数字识别实例及代码详解

本文的代码来自githup的Deep Learning的toolbox,是用Matlab实现的。感谢该toolbox的作者付出和分享。 我在应该该代码进行训练时,出现一些报错,如expand函数应用不对,flipall函数未定义等问题,对这些问题进行了修正,完成网络训练和验证。 本文mnist_uint8.mat的获取可以参照我的另一篇博客:MNIST数据库处理--matlab生成mnist_

VivienFu的专栏 6万+

案例学习——Unity基于体绘制的大气散射shader

本案例学习资料来源 Volumetric Atmospheric Scattering 案例学习——Unity基于体绘制的大气散射shader0 效果展示1 引入1.0 介绍1.1 单次散射(Single Scattering)1.1.1 出射散射(Out-Scattering)1.1.2 入射散射1.2 基于体绘制的单次散射模型(Volumetric Single Scattering)2 大气散射背后的理论2.1 透射函数2.2 散射函数2.3 数值积分2.4 方向光2.5 吸收系数3 瑞利散射中的数学

清清!的博客 5979

BRep实战指南:从理论到文件格式的全面解析

本文全面解析BRep(边界表示法)从基础概念到文件格式的实战应用。详细介绍了BRep的数学定义、工业应用场景,以及STEP、IGES等主流文件格式的对比与使用技巧,帮助读者掌握三维建模核心技术并优化性能。

weixin_29235923的博客 407

RK3568笔记二:部署手写数字识别模型

部署手写数字识别模型,使用手写数字识别(mnist)数据集训练了一个 LENET 的五层经典网络模型。Lenet是我们的深度学习入门的必学模型,是深度学习领域中的经典卷积神经网络(CNN)架构之一。过程分为:训练,导出ONNX,转化RKNN,测试。

1169

Unity光线追踪实战:从原理到实现,打造模块化学习范例

光线追踪作为计算机图形学的核心渲染技术,其原理在于模拟光线在虚拟场景中的物理传播路径,通过求解光线与物体的交点来计算像素颜色。这项技术的核心价值在于能够生成物理上极度真实的光照效果,如精确的软阴影、反射、折射和全局光照,从而大幅提升实时渲染的视觉保真度。在游戏开发、影视预演和数字孪生等应用场景中,实时光线追踪正成为高端视觉体验的关键。本文聚焦于Unity引擎中的实践,深入剖析了基于HDRP和DXR的硬件光线追踪实现架构。通过一个高度模块化的“Gem”范例项目,文章详细拆解了从光线生成、加速结构管理到着色器编

weixin_33767813的博客 646

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

实时光线追踪的原理、DXR机制、Unity HDRP实战与性能调优

本文系统介绍了Unity实时光线追踪技术,从原理到实践全面解析。主要内容包括:实时光追与光栅化的本质区别、DXR硬件架构和Unity HDRP管线适配规则,详细讲解了六大核心光追效果及其实现原理。文章提供了完整的HDRP光追配置流程、C#代码动态控制方案、核心参数调优指南,并针对常见问题给出专业解决方案。强调光追需结合PBR和GI技术形成完整渲染体系,通过模块化管理和设备分级适配实现画质与性能平衡。最后指出实时光追是替代传统模拟渲染、实现影视级画质的下一代标准,为开发者提供了可直接商用的技术手册。

分享知识,拥抱变化 556

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Unity跨管线光线追踪方案:uRaymarching实现原理与工程实践

光线追踪作为计算机图形学中模拟光线物理行为的核心技术,通过追踪光线路径来计算光照、反射与折射,能够生成接近真实世界的渲染效果。其原理在于从摄像机发射光线并与场景几何体求交,进而计算颜色与光照贡献。这项技术的价值在于突破了传统光栅化在全局光照和复杂光学效果上的局限,为游戏、影视和实时可视化应用带来了质的飞跃。在Unity引擎生态中,原生光线追踪主要集成于高清渲染管线(HDRP),对使用通用渲染管线(URP)或传统内置管线的项目形成了较高的技术门槛。uRaymarching方案应运而生,它基于Raymarchi

weixin_34320724的博客 330

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

unity片元着色器中获取屏幕坐标_Unity Ray Tracing Gem Shader 光线追踪宝石着色器

项目原址:github.com/Sorumi/UnityRayTracingGem​github.comRay Tracing光线追踪是指从摄像机出发的若干条光线,每条光线会和场景里的物体求交,根据交点位置获取表面的材质、纹理等信息,并结合光源信息计算光照。相对于传统的光栅化渲染,光线追踪可以轻松模拟各种光学效果,如反射、折射、散射、色散等。但由于在进行求交计算时需要知道整个场景的信息,其计算成本...

weixin_39875760的博客 345

Unity光线反射与折射实战:从向量推导到递归追踪实现

在计算机图形学与游戏开发中,光线与物体表面的交互是构建逼真视觉体验的核心基础。其原理基于几何光学,通过向量运算精确描述光线的反射与折射行为。掌握这些底层技术,不仅能深化对渲染管线的理解,更能为开发高级视觉效果(如水面倒影、玻璃透射)提供扎实的理论支撑。反射遵循入射角等于反射角的定律,其向量公式 R = I - 2*(I·N)*N 高效且优雅;折射则由斯涅尔定律(Snell's Law)支配,需处理光线穿越不同介质(如空气、水、玻璃)时的方向偏折与全反射临界现象。在工程实践上,开发者常在Unity等引擎中,通

weixin_34320724的博客 382

[Unity]-[渲染Render]-[Shader] Unity Shader的基础

节点库:Shader Graph提供了丰富的节点库,包括颜色、纹理、数学、程序纹理、输入、实用工具、UV变换等类型的节点。Blackboard:用于创建外部属性,相当于Shader中的Properties,可以创建Float、Vector、Color、Texture等类型变量。Graph Inspector:包含节点设置和图设置两个选项卡,用于设置节点的命名、参数值域、默认值等信息,以及着色器数值计算精度、支持的渲染管线等。

sky_smile_Allen的博客 2539

Unity 6光线追踪实战:DanbaidongRP光追阴影与高质量SSR从入门到精通

DanbaidongRP 是一款基于 Unity 6(6000.0.30f1)与 Universal RP 17.0.3 打造的开源自定义渲染管线,专门为 PBR 与 NPR 卡通渲染双重优化,内置光线追踪阴影(Ray Tracing Shadow)与高质量 SSR 反射(Ray Tracing Reflection)。本篇文章将带你从零开始安装 DanbaidongRP,并深入解析光追阴影与高质

gitblog_07826的博客 422

Unity Shader技术体系深度解析:从基础原理到高级实践

本文基于《Unity Shader入门精要》的技术框架,系统分析Unity Shader的核心原理与实践方法。文章从渲染管线、Shader语言结构、光照模型、性能优化等维度展开,结合现代图形学理论,探讨Shader开发中的关键技术路径,并针对移动端与PC端渲染差异提出优化策略。Unity的渲染管线遵循经典图形学架构,包含应用阶段(Application Stage)、几何阶段(Geometry Stage)和光栅化阶段(Rasterizer Stage)。在可编程管线中,顶点着色器(Vertex Shade

晴天了无痕的博客 1436

Unity之Shader基础探索

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_45548042的博客 2657

Unity光线追踪与Oceanology插件兼容性问题解决方案

光线追踪和高级水体模拟是现代游戏开发中常用的两种先进渲染技术。光线追踪通过模拟光线物理行为实现真实光影效果,而水体模拟系统则依赖复杂的流体动力学计算。这两种技术都需要大量显存和GPU计算资源,当它们在Unity引擎中同时使用时,常会出现显存管理冲突和渲染管线状态竞争问题。典型的兼容性问题表现为显卡驱动崩溃、材质贴图错乱或帧率骤降。通过优化显存分配策略、调整渲染时序和使用混合精度计算等工程实践方法,可以有效解决RTX系列显卡上的资源争夺问题。这些方案不仅适用于Unity中的光线追踪与Oceanology插件组

weixin_33674976的博客 475
上一篇: Unity Shader 水面 Shader 教程 从 Gerstner 波浪到屏幕折射、焦散、泡沫的完整实现
mxwin
博客等级 码龄19年 22粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值