渲染目标的实际应用:Flat

      从实质上说,Flat是一个四边形,由两个三角形组成。将指定目标的渲染效果贴在Flat上,可实现很多种效果。本文实现的是在水底往上看的效果:把贴在水面上的纹理贴在该四边形上。

      先看Flat类定义:

       struct flat2D
      {
            float4 position;
            float2 uv;        
      };

       class Flat : public RenderObject
      {


          public:
               Flat(float2 pos,float2 size);
               void _Render();
               void  RendWire(){};
                ~Flat(void);


          private:
               float2 m_size;
               float2 m_position;
               LPDIRECT3DVERTEXBUFFER9 m_pVB;
               LPDIRECT3DINDEXBUFFER9  m_pIB;
       };

       应该不难理解,关于RenderObject的实现请看引擎技术研究之渲染到目标,RendWire()在Flat没意思,纯属是实例化纯虚函数而已

       在构造函数里用四个顶点构成一个四边形,_Render()实现如下:

        if(NULL!=m_pMeshTextures)
        {
            m_pShader->SetTexture("ColorMap",m_pMeshTextures[0]);
            m_pShader->CommitChanges();
         }
        D3Dsystem::GetInstance()->GetDevice()->SetStreamSource( 0, m_pVB, 0, sizeof(flat2D) );
        D3Dsystem::GetInstance()->GetDevice()->SetIndices(m_pIB);
        D3Dsystem::GetInstance()->GetDevice()->SetFVF( D3DFVF_2DVERTEX );
        D3Dsystem::GetInstance()->GetDevice()->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0,4,0,2);

        均用一般的设置。

        在scene里定义Flat *  flatmodel;

        ....................

        flatmodel=new Flat(float2(0,0),float2(1024/5,768/5));

        ....................

        等等

        在场景更新函数里加入:

        //mpReflectTarget->GetTexture() 得到贴到水面的纹理

        flatmodel->SetTexture(mpReflectTarget->GetTexture());

        有关于mpReflectTarget的相关实现请看:引擎技术研究之水的渲染

        最终效果图:

        

         

       

posted @ 2010-11-28 01:44  毛志谦  阅读(228)  评论(0编辑  收藏  举报