前言
光照的实现,主要是shader做的,C++代码层没添加多少东西。
理解了shader,看懂d3d12book的源码,shader直接拷进来,C++代码直接转过来就可以了。
难度主要是看懂shader。对于光照的计算,应该说我也没有深入学,仅仅是了解了一些概念,就像是很多数学公式我也不会推一样。正确理解自己的能力,做好能力范围内的事情,对于数学的提高,觉得可以稍微靠后放一放。主要还是学习d3d12的一些使用上的东西。
修改MiniEngine的坐标转换
在前边的学习过程中,就挺纠结的。因为在VS shader中mul函数的俩参数是反过来的。最初以为是MiniEngine做了什么奇怪的操作,后来发现不是。
这篇博客讲得很清楚,可以学习下。
https://www.cnblogs.com/X-Jun/p/9808727.html
我觉得 mul(点,矩阵) 更符合直觉,也更符合公式。
所以第八章第一步就是要在C++部分对传入的矩阵先做一次转置。
为了更好的贴合d3d12book的shader,也同样的把常量缓冲区改成3部分,只是槽有点区别。
先实现shapes这个例子,只需要两个常量缓冲区,一个放入模型转世界的矩阵,一个放入摄像机的世界转投影矩阵。
简易的修改如下:
- 修改根签名:
m_RootSignature.Reset(3, 0);
m_RootSignature[0].InitAsConstantBuffer(0, D3D12_SHADER_VISIBILITY_VERTEX);
m_RootSignature[1].InitAsConstantBuffer(1, D3D12_SHADER_VISIBILITY_ALL);
- 动态传入投影矩阵的转置矩阵
__declspec(align(16)) struct
{
Matrix4 viewProj; // 从世界坐标