在DirectX 12中使用normal map
在DirectX 12中使用normal map
normal map本身就是一张texture,故而加载normal map的逻辑并不需要进行特殊处理。加入normal map之后,shader层面需要顶点的tangent信息,因此需要在CPU层将tangent信息传递进去。首先需要修改的是顶点的声明:
struct Vertex{XMFLOAT3 normal;XMFLOAT4 color;XMFLOAT2 uv;XMFLOAT3 tangent;};
相应地,input layout也要进行修改:
mInputLayout ={{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},{"COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 1, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0},{"TANGENT", 0, DXGI_FORMAT_R32G32B32_FLOAT, 1, D3D12_APPEND_ALIGNED_ELEMENT, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0}};
为了方便将normal map的shader resource view传递到GPU,我们可以在const buffer中记录下normal map在descriptor heap中的index:
matConstants.normalMapIndex = object->mNormalTexture->mID;
接下来就是GPU层面的改动了,原先的shader代码需要进行修改,首先是const buffer需要新增一个normalIndex:
struct MaterialData
{float4 diffuseAlbedo;float3 fresnelR0;float shininess;uint diffuseMapIndex;uint normalIndex;uint matPad0;uint matPad1;
};
其次,传递给vertex shader的顶点信息需要加上tangent:
struct VertexIn
{float3 PosL : POSITION;float3 NormalL : NORMAL;float4 Color : COLOR;float2 UV : TEXCOORD0;float3 Tangent : TANGENT;
};
最后,我们将原先直接使用normal的地方进行替换,替换为从normal map中采样得到的信息,注意到normal map保存的normal是TBN空间的,需要转换到world空间中:
float3 NormalSampleToWorldSpace(float3 normalMapSample, float3 unitNormalW, float3 tangentW)
{// Uncompress each component from [0,1] to [-1,1].float3 normalT = 2.0f*normalMapSample - 1.0f;// Build orthonormal basis.float3 N = unitNormalW;float3 T = normalize(tangentW - dot(tangentW, N)*N);float3 B = cross(N, T);float3x3 TBN = float3x3(T, B, N);// Transform from tangent space to world space.float3 bumpedNormalW = mul(normalT, TBN);return bumpedNormalW;
}
最后运行的效果如下:
如果你觉得我的文章有帮助,欢迎关注我的微信公众号(大龄社畜的游戏开发之路)-
在DirectX 12中使用normal map相关推荐
- 在DirectX 12中使用SSAO
在DirectX 12中使用SSAO SSAO是常用的实现环境光遮蔽,提高物体真实性的一种技术,它可以分为生成AO贴图和使用AO贴图两个阶段.在生成阶段,我们需要一张view space下的norma ...
- 在DirectX 12中绘制文字
在本教程中,我们将学习如何在DirectX 12中绘制一些位图文本.我们还将学习如何使用高精度计时器来获取每秒的帧数,以及使游戏逻辑的时序保持一致,而不是像前面的教程中那样基于计算机的运行速度. 介绍 ...
- 在3ds max中,利用normal map 制作精美骰子
使用normal map的目的 使用normal map的主要目的是使得low-poly的模型看起来如同high-poly的模型那样精致,比如一个1500个三角形面片的模型在细节上看起来跟一个拥有20 ...
- DirectX 12 曲面细分着色器笔记
曲面细分着色器 1. 背景 2. 曲面细分工作机制 2.1 Hull Shader(外壳着色器) 2.2 Tessellator(曲面细分器) 2.3 Domain Shader(域细分器) 3. 编 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图 原文:Introduction to 3D Game P ...
- DirectX 12 3D游戏开发实战 -- 龙书随书源码各章项目运行结果概览
DirectX 12 3D游戏开发实战 -- 龙书随书源码各章项目运行结果概览 第1章 向量运算 第2章 矩阵运算 第4章 Direct3D初始化 第6章 利用Direct3D绘制几何体Box 第7章 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...
Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...
- Normal Map Compress with DXT5
Normal Map Compress with DXT5 作者:clayman 仅供个人学习使用,请勿转载,勿用于任何商业用途. 这应该是常识性的知识,不过大部分介绍normal map技术的文章似 ...
- Normal map (Bump mapping) 法线贴图(凹凸映射) Standard Shader系列10
Normal map (Bump mapping) 法线贴图(凹凸映射) 本文档主要是对Unity官方手册的个人理解与总结(其实以翻译记录为主:>) 仅作为个人学习使用,不得作为商业用途,欢迎转 ...
最新文章
- 模块导入---如何在一个文件中导入其它模块,来调用它的变量、函数等,以节省代码量...
- c 服务器文件是存在,客户端服务器在较大的文件的c文件传输问题
- Linux系统vi编辑器执行命令,linux下vi编辑器命令
- k8s控制器:Job和CronJob
- Response.ContentType 详细列表
- CRM WebUI的错误消息是如何从后台服务器取出并绘制到前台的
- C#学习笔记---数据类型
- World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
- 苹果公布iPhone 12屏幕更换价格,果然没让人失望!
- discuz模板引擎语法
- MATLAB gui 对表格增添(删除)数据
- 分布式系统统一登录的实现
- cm agent主机异常Error, CM server guid updated, expected
- 用Altium Designer的databaseLib文件连接MySQL数据库工具管理自己的元器件信息数据库
- AUTOSAR 基础软件的内在安全
- 生信分析学习笔记:(2)GO KEGG分析
- 运用阿里云地图实现经纬度转换为省市县
- Oracle连接不上解决办法合集
- 公共经济学(开卷)期末复习题
- 数据集成平台的特点(Oracle service bus)
热门文章
- win10专业版“引用的账户已锁定,且可能无法登录”解决方案
- boss直聘java几轮面试,京东商城java高级面试:通过在Boss直聘上收到来自京东金 - 职朋职业圈...
- Swift编码规范(目前swift 4.2,持续更新)
- cmakelist的作用及使用
- 可运行的GPS获取经纬度和获取基站例子(环境Android Studio 3.5.2扒拉能运行的例子找到太辛苦了要么版本太老。)
- 和Surface pro电源适配器说拜拜——Surface PD快充电源线方案讲述
- Abelssoft CryptBox2021(电脑文件加密软件)免费版 附使用说明
- php程序文件免费加密软件,FileWall – 免费实用的文件(夹)加密软件工具!
- 5G将如何踏着七彩祥云来到我们身边?
- 小红书app滑块解决思路