公告板

Direct9学习之 - 公告板技术

发布者: 新撰组 | 发布时间: 2013-11-26 21:53| 评论数: 0

游戏程序
平台类型: PC/兼容机 
程序设计: 客户端 3D图形 
编程语言: C/C++ 
引擎/SDK: DirectX 
一. 公告板的应用:
     
      公告板可被用于场景中对细节要求不高的树木花草,也可用于玩家头顶的某些特效表现等。其好处自然是高效简洁。

二. 公告板基本原理:

公告板最基本的原理就是,绘制一个带贴图的矩形区域,由阿尔法混合使贴图看起来更逼真,并且保证每帧矩形都是正对摄像机,从而在效果上表现出贴图中的对象。 由于只绘制了一个矩形因此其绘制的性能很高。

三. 公告板实现方式及相关代码:

由公告板的基本原理可以将其实现归纳为以下步骤:
        1. 初始化公告板矩形并将其放置到场景中
        2. 每帧根据当前相机位置在XZ平面旋转矩阵保证其正对摄像机(当相机可绕UP方向移动旋转时会导致公告板穿帮,此时需要其他手段来解决。)
        3. 绘制矩形并对其贴图进行阿尔法混合。

                具体相关代码如下:

        1. 初始化公告板矩形定点信息
        
          a. 定义公告板定点信息
          // 公告板定点信息  
          struct  CUSTOMVERTEX
         {
            float x, y, z;    //顶点位置
            float u,v ;    //顶点纹理坐标
          };

          #define D3DFVF_CUSTOMVERTEX   (D3DFVF_XYZ|D3DFVF_TEX1)

          b. 创建定点缓冲区
          // 创建定点缓冲
          pDevice->CreateVertexBuffer( 4*sizeof(CUSTOMVERTEX),0, D3DFVF_CUSTOMVERTEX,
          D3DPOOL_MANAGED, &m_pVertexBuf, NULL );


           // 初始化顶点数据 填充顶点缓冲区数据
          CUSTOMVERTEX Vertices[] =
         {
           { -m_fWidth / 2.0f, -m_fHeigh / 2.0f, 0.0f,  0.0f, 1.0f, },
           { -m_fWidth / 2.0f, m_fHeigh / 2.0f, 0.0f,  0.0f, 0.0f, }, 
           { m_fWidth / 2.0f, -m_fHeigh / 2.0f, 0.0f,  1.0f, 1.0f, }, 
           { m_fWidth / 2.0f, m_fHeigh / 2.0f, 0.0f,  1.0f, 0.0f, }
         };

        void* pVertices;
        if( FAILED( m_pVertexBuf->Lock( 0, sizeof(Vertices), (void**)&pVertices,0 ) ) )

memcpy( pVertices, Vertices, sizeof(Vertices) );
m_pVertexBuf->Unlock();


        c. 创建纹理贴图
        D3DXCreateTextureFromFileA( pDevice, pTexPath, &m_pTexture );


       2. 每帧根据相机位置旋转公告板

        a. 计算相机朝向
         VECTOR3 vPos;
         pCamera->GetPostion( &vPos );
         VECTOR3 vLookAt;
         pCamera->GetLookAt( &vLookAt );
         m_vCamera = vLookAt - vPos;


        b. 更新公告板方向(只计算在XZ平面的方向为了避免失真)
         float fAngle = 0;
         if( m_vCamera.x > 0.0f )
            fAngle = -atanf(m_vCamera.z/m_vCamera.x)+D3DX_PI/2;
         else
            fAngle = -atanf(m_vCamera.z/m_vCamera.x)-D3DX_PI/2;


        c. 设置旋转矩阵
          D3DXMatrixRotationY( &matRotation, fAngle + nIndex * m_nCount / D3DX_PI );


       3. 设置纹理贴图绘制公告板

        a. 设置纹理阿尔法混合
          pDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1);
          pDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );

          pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   true );
          pDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA );
          pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );


        b. 绘制公告板
          pDevice->SetTexture( 0, m_pTexture );
          pDevice->SetStreamSource( 0, m_pVertexBuf, 0, sizeof(CUSTOMVERTEX) );
          pDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
          pDevice->SetTransform( D3DTS_WORLD, &matBillboard );
          pDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, 0, 2 );




四. 效果展示:


             Direct9学习之 - 公告板技术         Direct9学习之 - 公告板技术 
公告板                                                      十字交叉公告板


    


五. 其他:

1. 关于十字交叉公告板:
         所谓十字交叉公告板既是在公告板的基础上再将矩形旋转90度,使得两个公告板交叉。十字交叉公告板比单纯公告板表现效果更好。

      2. 关于在UP方向旋转相机导致公告板穿帮的问题可以采用在XZ平面增加一个顶部公告板的方式解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
浅墨出品,零资源分下载,分享精神至上~ 源码的配套博文是 《 【Visual C++】游戏开发五十四 浅墨DirectX教程二十一 视觉上的诡计:公告(Billboard)技术》 ,文章地址http://blog.csdn.net/poem_qianmo/article/details/13278851, 点击Release文件夹下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 背景音乐来自火影忍者疾风传 用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,文字输出,颜色,纹理贴图,四大变换,三维天空模拟,粒子系统等等知识。 另外,关于雪花粒子效果提醒大家一下,可在SnowParticleClass.h中的PARTICLE_NUMBER宏中改变雪花粒子数量,默认粒子数量为3000,1G显存的显卡取10万粒子数量帧数就只有8帧了。所以要自己改雪花粒子数量的话请根据自己的显卡性能酌情选择,如果你取个非常大的50万粒子数量,显卡吃不消烧了可别怪我- - 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值