在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相关推荐

  1. 在DirectX 12中使用SSAO

    在DirectX 12中使用SSAO SSAO是常用的实现环境光遮蔽,提高物体真实性的一种技术,它可以分为生成AO贴图和使用AO贴图两个阶段.在生成阶段,我们需要一张view space下的norma ...

  2. 在DirectX 12中绘制文字

    在本教程中,我们将学习如何在DirectX 12中绘制一些位图文本.我们还将学习如何使用高精度计时器来获取每秒的帧数,以及使游戏逻辑的时序保持一致,而不是像前面的教程中那样基于计算机的运行速度. 介绍 ...

  3. 在3ds max中,利用normal map 制作精美骰子

    使用normal map的目的 使用normal map的主要目的是使得low-poly的模型看起来如同high-poly的模型那样精致,比如一个1500个三角形面片的模型在细节上看起来跟一个拥有20 ...

  4. DirectX 12 曲面细分着色器笔记

    曲面细分着色器 1. 背景 2. 曲面细分工作机制 2.1 Hull Shader(外壳着色器) 2.2 Tessellator(曲面细分器) 2.3 Domain Shader(域细分器) 3. 编 ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十九章:法线贴图 原文:Introduction to 3D Game P ...

  6. DirectX 12 3D游戏开发实战 -- 龙书随书源码各章项目运行结果概览

    DirectX 12 3D游戏开发实战 -- 龙书随书源码各章项目运行结果概览 第1章 向量运算 第2章 矩阵运算 第4章 Direct3D初始化 第6章 利用Direct3D绘制几何体Box 第7章 ...

  7. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引...

    Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十五章:第一人称摄像机和动态索引 原文:Introduction to 3 ...

  8. Normal Map Compress with DXT5

    Normal Map Compress with DXT5 作者:clayman 仅供个人学习使用,请勿转载,勿用于任何商业用途. 这应该是常识性的知识,不过大部分介绍normal map技术的文章似 ...

  9. Normal map (Bump mapping) 法线贴图(凹凸映射) Standard Shader系列10

    Normal map (Bump mapping) 法线贴图(凹凸映射) 本文档主要是对Unity官方手册的个人理解与总结(其实以翻译记录为主:>) 仅作为个人学习使用,不得作为商业用途,欢迎转 ...

最新文章

  1. 模块导入---如何在一个文件中导入其它模块,来调用它的变量、函数等,以节省代码量...
  2. c 服务器文件是存在,客户端服务器在较大的文件的c文件传输问题
  3. Linux系统vi编辑器执行命令,linux下vi编辑器命令
  4. k8s控制器:Job和CronJob
  5. Response.ContentType 详细列表
  6. CRM WebUI的错误消息是如何从后台服务器取出并绘制到前台的
  7. C#学习笔记---数据类型
  8. World Wind Java开发之二 使用Winbuilders设计图形用户界面(转)
  9. 苹果公布iPhone 12屏幕更换价格,果然没让人失望!
  10. discuz模板引擎语法
  11. MATLAB gui 对表格增添(删除)数据
  12. 分布式系统统一登录的实现
  13. cm agent主机异常Error, CM server guid updated, expected
  14. 用Altium Designer的databaseLib文件连接MySQL数据库工具管理自己的元器件信息数据库
  15. AUTOSAR 基础软件的内在安全
  16. 生信分析学习笔记:(2)GO KEGG分析
  17. 运用阿里云地图实现经纬度转换为省市县
  18. Oracle连接不上解决办法合集
  19. 公共经济学(开卷)期末复习题
  20. 数据集成平台的特点(Oracle service bus)

热门文章

  1. win10专业版“引用的账户已锁定,且可能无法登录”解决方案
  2. boss直聘java几轮面试,京东商城java高级面试:通过在Boss直聘上收到来自京东金 - 职朋职业圈...
  3. Swift编码规范(目前swift 4.2,持续更新)
  4. cmakelist的作用及使用
  5. 可运行的GPS获取经纬度和获取基站例子(环境Android Studio 3.5.2扒拉能运行的例子找到太辛苦了要么版本太老。)
  6. 和Surface pro电源适配器说拜拜——Surface PD快充电源线方案讲述
  7. Abelssoft CryptBox2021(电脑文件加密软件)免费版 附使用说明
  8. php程序文件免费加密软件,FileWall – 免费实用的文件(夹)加密软件工具!
  9. 5G将如何踏着七彩祥云来到我们身边?
  10. 小红书app滑块解决思路