Windows 8 Directx 开发学习笔记(七)水波纹的实现

本文介绍了在Windows 8 Directx开发中,如何使用实时更新顶点缓冲来实现水波纹效果。通过修改WaterModel类和Renderer类,设置模拟变量,更新顶点缓冲区,实现了水面上随机点的扰动和水波随时间的传播。关键步骤包括初始化模拟常量,创建动态顶点缓冲区,以及在Update方法中进行水波纹的模拟更新。
摘要由CSDN通过智能技术生成

使用DirectX实际开发中,模型的形状不可能都是一成不变,只依靠移动摄像机去实现动画。这里用实时更新顶点缓冲的方式生成一个水波模型,最终效果类似向水面扔石子时出现的水波纹。有了上一篇建立好的模型,实现这个效果仅需要更改WaterModel类和Renderer类里m_water的相关调用。

首先更改WaterModel的头文件,添加模拟变量成员和临时缓冲区指针,并增加两个方法DisturbUpdate,整个类代码如下:

class WaterModel
{
public:
    WaterModel(void);
    ~WaterModel(void);
    void Initialize(ID3D11Device* d3dDevice, int m, int n, float dx, float dt, float speed, float damping);
    void Render(ID3D11DeviceContext* d3dContext);
    void Disturb(int i, int j, float magnitude);
    void Update(ID3D11DeviceContext* d3dContext, float dt);
 
private:
    Microsoft::WRL::ComPtr<ID3D11Buffer> m_vertexBuffer;
    Microsoft::WRL::ComPtr<ID3D11Buffer> m_indexBuffer;
    uint32 m_vertexCount,m_indexCount;
 
    //二维网格的行数、列数
    int xRange;
    int zRange;
 
    // 欲计算的模拟常量.
    float mK1;
    float mK2;
    float mK3;
    float mTimeStep;
    float mSpatialStep;
   
    //顶点临时缓冲
    XMFLOAT3* mPrevSolution;
    XMFLOAT3* mCurrSolution;
};

完成后就开始更改WaterModel的构造方法,使用初始化列表初始化成员:

WaterModel::WaterModel(void):
    m_indexCount(0),m_vertexCount(0),
    mK1(0.0f),mK2(0.0f), mK3(0.0f),
    mTimeStep(0.0f),mSpatialStep(0.0f),
    mPrevSolution(0),mCurrSolution(0),
    xRange(128),zRange(128)
{
}

然后是更改Initialize方法。其中模拟常量等与算法有关的部分按照DirectX 10的例子进行计算,代码如下:

xRange = m;
zRange = n;
 
m_vertexCount
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值