前言
首先我们先简单的优化下代码。
- 在我们现在的项目中,shader运行总共需要4个常量缓冲区:
槽位0:传入渲染目标特有的ObjectConstants结构,里面有模型转世界坐标矩阵、纹理转换矩阵、纹理偏移矩阵
槽位1:传入通用的投影矩阵、光照等等 PassConstants
槽位2:传入渲染目标特有纹理参数 MaterialConstants
槽位3:传入渲染目标特有的纹理视图 renderItem.srv
0、2、3都是渲染目标特有的。这里添加一个函数setShaderParam稍微封装下 - 我们目前有两个PSO。m_PSO和m_PSOEX。采用一个无序map封装下,方便管理
优化之后的github:
https://github.com/mversace/DirectX12-MiniEngine-Dragon/tree/12ee9996066d9205a95c4b45a1bc5d6c16dcb5ea
箱子采用带透明的纹理
这个纹理透明,很容易做的。只需要在ps shader的main函数中加一行代码就可以了。
这样,alpha通道低于0.1的像素就不再渲染了
clip(diffuseAlbedo.a - 0.1f);
而箱子正面透过去后,会发现箱子的背面看不到。这是因为我们设置的PSO会自动进行背面剔除。这个剔除的操作先于ps shader。
我们可以创建一个新的不进行背面剔除的PSO,来对箱子进行渲染
GraphicsPSO alphaTestPSO = defaultPSO;
raster = Graphics::RasterizerDefault;
raster.CullMode = D3D12_CULL_MODE_NONE; // 不剔除背面
alphaTestPSO.SetRasterizerState(raster);
alphaTestPSO.Finalize();
m_mapPSO[E_EPT_ALPHATEST] = alphaTestPSO;
MiniEngine中非垂直同步的时间戳bug
稍微修改下代码,使得程序运行直接跑水体这个部分
bool m_bRenderShapes = false;
然后运行发现水的波浪持续升高,基本快把山淹没了。
仔细调试后发现是update函数的入参,在第二帧时会传入一个极大值,导致水的波浪计算错误。
可以搜索Core中的‘s_FrameStartTick’变量,发现第一次update时,这个值是0,经过一次present后,取得当前的时间戳,直接变成了一个极大值。导致第二次的update入参过大。后续会恢复正常。
void Graphics::Present(void)
{
...
if (s_EnableVSync)
{
// With VSync en