D3D12渲染技术之光源

2023-10-11 16:59
文章标签 技术 渲染 光源 d3d12

本文主要是介绍D3D12渲染技术之光源,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

灯光有Point光源,Spot光源,Directional光源,Area光源等等,网上这方面的文章很多,在此我们就不详细介绍每个光源的计算公式了,我们直接介绍将光源应用到我们的案例中。先看我们已经实现好的案例截图:
在这里插入图片描述

顶点格式

照明计算需要表面法线, 我们使用顶点定义法线,然后在三角形的像素上插入这些法线,以便我们可以对每个像素进行光照计算。 而且,我们不再指定顶点颜色, 相反,通过对每个像素应用照明方程来生成像素颜色, 为了支持顶点法线,我们修改我们的顶点结构,如下所示:

// C++ Vertex structure
struct Vertex
{DirectX::XMFLOAT3 Pos;DirectX::XMFLOAT3 Normal;
};// Corresponding HLSL vertex structure
struct VertexIn
{float3 PosL  : POSITION;float3 NormalL : NORMAL;
};
When we add a new vertex format, we need to describe it with a new input layout description:
mInputLayout =,
{{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0,D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },{ "NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 }
};

法线计算

GeometryGenerator中的形状函数已经创建了具有顶点法线的数据,因此我们都设置在那里。 但是,因为我们在这个演示中修改网格的高度使其看起来像地形,我们需要自己为地形生成法线向量。
因为我们的地形表面由函数y = f(x,z)给出,我们可以使用微积分直接计算法向量,而不是前面描述的常规平均计算。 对于曲面上的每个点,我们通过取偏导数在+ x-和+ z-方向上形成两个切向量:
在这里插入图片描述
这两个矢量位于表面点的切平面中, 计算法线向量得到:
在这里插入图片描述
我们用于生成地形网格的函数是:
在这里插入图片描述
偏导数是:
在这里插入图片描述
因此,表面点(x,f(x,z),z)处的表面法线由下式给出:
在这里插入图片描述
我们注意到这个曲面法线不是单位长度,因此需要在光照计算之前进行标准化。特别是,我们在每个顶点处进行上述常规计算以获得顶点法线:

XMFLOAT3 LitWavesApp::GetHillsNormal(float x, float z)const
{// n = (-df/dx, 1, -df/dz)XMFLOAT3 n( -0.03f*z*cosf(0.1f*x) - 0.3f*cosf(0.1f*z),1.0f,-0.3f*sinf(0.1f*x) + 0.03f*x*sinf(0.1f*z));XMVECTOR unitNormal = XMVector3Normalize(XMLoadFloat3(&n));XMStoreFloat3(&n, unitNormal);return n;
}

水面的法向矢量以类似的方式完成, 可以使用有限差分方案来近似每个顶点处的切向量。

更新灯光方向

我们的Lights数组被放入per-pass常量缓冲区, 该案例使用一个方向灯来表示太阳,并允许用户使用向左,向右,向上和向下箭头键旋转太阳位置。 因此,每一帧,我们都需要从太阳计算新的光方向,并将其设置为通道常量缓冲区。
我们以球坐标(ρ,θ,φ)跟踪太阳位置,但半径ρ无关紧要,因为我们假设太阳是无限远的。 特别是,我们只使用ρ= 1使其位于单位球面上并将(1,θ,φ)解释为朝向太阳的方向,以下是更新太阳的相关代码。

float mSunTheta = 1.25f*XM_PI;
float mSunPhi = XM_PIDIV4;void LitWavesApp::OnKeyboardInput(const GameTimer& gt)
{const float dt = gt.DeltaTime();if(GetAsyncKeyState(VK_LEFT) & 0x8000)mSunTheta -= 1.0f*dt;if(GetAsyncKeyState(VK_RIGHT) & 0x8000)mSunTheta += 1.0f*dt;if(GetAsyncKeyState(VK_UP) & 0x8000)mSunPhi -= 1.0f*dt;if(GetAsyncKeyState(VK_DOWN) & 0x8000)mSunPhi += 1.0f*dt;mSunPhi = MathHelper::Clamp(mSunPhi, 0.1f, XM_PIDIV2);
}void LitWavesApp::UpdateMainPassCB(const GameTimer& gt)
{…XMVECTOR lightDir = -MathHelper::SphericalToCartesian(1.0f, mSunTheta, mSunPhi);XMStoreFloat3(&mMainPassCB.Lights[0].Direction, lightDir);mMainPassCB.Lights[0].Strength = { 0.8f, 0.8f, 0.7f };auto currPassCB = mCurrFrameResource->PassCB.get();currPassCB->CopyData(0, mMainPassCB);
}

Light数组放入per-pass常量缓冲区意味着每个渲染通道不能超过16个(我们支持的最大光数)灯, 这对于Demo来说已经足够了。 然而,对于大型游戏世界来说,这还不够,因为你可以想象有数百个灯光的游戏关卡遍布整个关卡, 解决此问题的一种方法是将Light数组移动到每个对象的常量缓冲区。 然后,对于每个对象,搜索场景并找到影响对象的灯光,并将这些灯光绑定到常量缓冲区。 影响对象的灯光是其体积(点光源和聚光灯锥体)与其相交的灯光, 另一种流行的策略是使用延迟渲染或前向+渲染。

Lighting为我们的着色器程序引入了一个新的材质常量缓冲区, 为了支持这一点,我们需要更新根签名以支持额外的常量缓冲区。 与每个对象常量缓冲区一样,我们使用材质常量缓冲区的根描述符来支持直接绑定常量缓冲区,而不是通过描述符堆。

代码下载地址:链接:https://pan.baidu.com/s/1X0Vikf6qGYGPKU-Nwf-wYA 密码:h79q

这篇关于D3D12渲染技术之光源的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/189514

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保

前端技术(七)——less 教程

一、less简介 1. less是什么? less是一种动态样式语言,属于css预处理器的范畴,它扩展了CSS语言,增加了变量、Mixin、函数等特性,使CSS 更易维护和扩展LESS 既可以在 客户端 上运行 ,也可以借助Node.js在服务端运行。 less的中文官网:https://lesscss.cn/ 2. less编译工具 koala 官网 http://koala-app.

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在