Directx11教程(51) 简单的billboard

       billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点就是始终面向摄像机的方向。在大规模场景渲染中,可以公告板上贴一个纹理,比如树,这样在比较远的场景中,可以用它表示模型数据,从而减少场景中的顶点数量。

image

   

       假定xz平面是大地,y轴是向上的方向,则billboard和y轴的方向一致,随着摄像机位置的改变,billboard必须改变自己的世界坐标,始终朝向摄像机。

      在billboard类中,我们定义一个变量,表示billboard的中心位置:

image

    image    

 

        旋转角度可以通过函数atan2(treeCenter.x - camerapos.x,treeCenter.z - camerapos.z)得到,之后,我们就可以得到billboard变化后的世界矩阵。

      

       在myTutorialD3D11_44的基础上,我们根据摄像机的位置,做一个旋转变化,就可以实现一个简单的billboard。就是把镜子当成一个quad平面,在上面贴上树的纹理,按X键旋转摄像机,可以发现树会始终朝向我们摄像机的位置。

代码很简单,渲染镜子前,做个旋转变化:

D3DXVECTOR3 treeCenter = m_MirrorModel->getCenterPos();
D3DXVECTOR4 treeCenter1;
D3DXVECTOR3 modelpos = D3DXVECTOR3(0.0, 0.0, 2.0);
// 设置平移位置.
D3DXMatrixTranslation(&worldMatrix3, modelpos.x, modelpos.y, modelpos.z);

//根据平移矩阵变化billboard中心位置

D3DXVec3Transform(&treeCenter1, &treeCenter, &worldMatrix3);
treeCenter.x = treeCenter1.x;
treeCenter.y = treeCenter1.y;
treeCenter.z = treeCenter1.z;

// 得到旋转的角度(弧度表示)
angle1 = atan2(treeCenter.x - camerapos.x,treeCenter.z - camerapos.z) ;


// 旋转billboard.
D3DXMatrixRotationY(&worldMatrix2, angle1);

D3DXMatrixMultiply(&worldMatrix4, &worldMatrix2, &worldMatrix3);

//把mirror 顶点和索引数据放入缓冲区,准备渲染,mirror模型做为billboard使用
m_MirrorModel->Render(m_D3D->GetDeviceContext());


result = m_LightTexShader->Render(m_D3D->GetDeviceContext(), m_MirrorModel->GetIndexCount(), worldMatrix4, viewMatrix, projectionMatrix,
    light, material, camera,m_TexManager->createTex(m_D3D->GetDevice(),string("tree1.dds")));

 

在lighttex.ps中,加上根据贴出alpha值clip的代码:

//从纹理图中得到alpha值
float alpha = shaderTexture.Sample(SampleType, input.tex).a;
//如果alpha小于0.25就放弃掉当前的像素
clip(alpha-0.25);

程序执行后,界面如下:

image

完整的代码请参考:

工程文件myTutorialD3D11_45

代码下载:

http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip

http://files.cnblogs.com/mikewolf2002/pictures.zip

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于DirectX 11的开发教程,以下是一些建议的资源和步骤: 1. 官方文档:首先,你可以参考Microsoft官方提供的DirectX开发文档。他们提供了详细的教程和示例代码,涵盖了DirectX 11的各个方面。你可以在Microsoft的官方网站上找到这些文档。 2. 学习基础知识:在开始使用DirectX 11之前,建议你先学习一些基础知识,比如图形学和着色器编程。了解基本的图形学概念和渲染管线的工作原理对理解DirectX 11的开发非常有帮助。 3. 使用工具:为了使用DirectX 11进行开发,你需要安装DirectX SDK或者Windows SDK。这些工具包括编译器、调试器和其他必要的辅助工具,帮助你开发DirectX 11应用程序。 4. 编写代码:开始编写自己的DirectX 11应用程序。你可以使用C++来编写代码,并使用DirectX API来创建窗口、渲染图形和处理用户输入等操作。在编写代码时,可以参考官方文档中的示例代码和教程。 5. 调试和优化:一旦你的应用程序运行起来,你可能会遇到一些问题,比如性能瓶颈或者渲染错误。在这种情况下,你可以使用调试工具来诊断和解决这些问题。另外,优化你的代码也是很重要的,以提高应用程序的性能和效率。 6. 参考其他资源:除了官方文档之外,还有一些其他资源可以帮助你学习和理解DirectX 11的开发。比如书籍、在线教程、论坛和博客等等。你可以根据自己的需求和学习风格选择适合自己的资源。 希望以上建议对你有所帮助!祝你在DirectX 11开发中取得成功!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值