d3d12龙书学习之MiniEngine的最小化实现(六) 龙书第10章 混合

本文介绍了在学习D3D12龙书过程中,对MiniEngine的优化,包括带透明纹理的箱子、非垂直同步时间戳bug的修复、雾效果的实现、常量缓冲区16字节对齐问题的解决以及水体半透明效果和禁止红绿通道写入的练习。通过代码优化和调整渲染顺序,实现了各种视觉效果。
摘要由CSDN通过智能技术生成

前言

首先我们先简单的优化下代码。

  1. 在我们现在的项目中,shader运行总共需要4个常量缓冲区:
    槽位0:传入渲染目标特有的ObjectConstants结构,里面有模型转世界坐标矩阵、纹理转换矩阵、纹理偏移矩阵
    槽位1:传入通用的投影矩阵、光照等等 PassConstants
    槽位2:传入渲染目标特有纹理参数 MaterialConstants
    槽位3:传入渲染目标特有的纹理视图 renderItem.srv
    0、2、3都是渲染目标特有的。这里添加一个函数setShaderParam稍微封装下
  2. 我们目前有两个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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值