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

假定xz平面是大地,y轴是向上的方向,则billboard和y轴的方向一致,随着摄像机位置的改变,billboard必须改变自己的世界坐标,始终朝向摄像机。
在billboard类中,我们定义一个变量,表示billboard的中心位置:

旋转角度可以通过函数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);
程序执行后,界面如下:

完整的代码请参考:
工程文件myTutorialD3D11_45
代码下载:
http://files.cnblogs.com/mikewolf2002/d3d1139-49.zip
Directx11教程(51) 简单的billboard的更多相关文章
- Directx11教程(54) 简单的基于GS的billboard实现
原文:Directx11教程(54) 简单的基于GS的billboard实现 本章我们用一个billboard的实现来学习D3D11中的GS. 在VS shader中,我们输入的是顶点 ...
- Directx11教程(52) 实例(instancing)的简单应用
原文:Directx11教程(52) 实例(instancing)的简单应用 有些时候,我们需要在场景中渲染大量的重复的物体,比如体育场中的观众,森林里面的树木等等,这些物体具有相似的形状,比如很多树 ...
- Directx11教程(42) 纹理映射(12)-简单的bump mapping
原文:Directx11教程(42) 纹理映射(12)-简单的bump mapping 有时候,我们只有一个粗糙的模型,但是我们想渲染纹理细节,比如一个砖墙,我们如何在只有一个平面的时候 ...
- Directx11教程(20) 一个简单的水面
原文:Directx11教程(20) 一个简单的水面 nnd,以前发的这篇教程怎么没有了?是我自己误删除了,还是被系统删除了? 找不到存稿了,没有心情再写一遍了. 简单说一下,本篇教程就是实 ...
- Directx11教程(19) 画一个简单的地形
原文:Directx11教程(19) 画一个简单的地形 通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者 ...
- Directx11教程(6) 画一个简单的三角形(2)
原文:Directx11教程(6) 画一个简单的三角形(2) 在上篇教程中,我们实现了在D3D11中画一个简单的三角形,但是,当我们改变窗口大小时候,三角形形状却随着窗口高宽比例改变而改变, ...
- Directx11教程(5) 画一个简单的三角形(1)
原文:Directx11教程(5) 画一个简单的三角形(1) 在本篇教程中,我们将通过D3D11画一个简单的三角形.在D3D11中,GPU的渲染主要通过shader来操作(当然还有一些操作 ...
- Directx11教程(67) 显示模型文件
原文:Directx11教程(67) 显示模型文件 在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...
- Directx11教程(65) 渲染到纹理
原文:Directx11教程(65) 渲染到纹理 通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个 ...
随机推荐
- git commit规范工具
npm install -g commitizen commitizen init cz-conventional-changelog --save --save-exact 以后,凡是用到git c ...
- 【DM642学习笔记六】TI参考文档--DM642 Video Port Mini Driver
这个文档介绍了在DM642EVM板上视频采集和显示微驱动的使用和设计.用EDMA进行存储器和视频端口的数据传输.为了增强代码的复用性和简化设计过程,驱动分为通用视频端口层和特定编解码芯片微驱动层两个 ...
- 使用video.js支持flv格式
html5的video标签只支持mp4.webm.ogg三种格式,不支持flv格式,在使用video.js时,如果使用html5是会报错不支持. 修改了一下代码 js部分 videojs.option ...
- mongodb+nodejs 增删查的demo
1.启动数据库 启动完成后显示 端口号是27017 2.创建数据库 创建一个名为mydb的数据库 3.先查询一下当然的用户,再新增一个 4.创建数据表,查询所有的表 db.createCollec ...
- jQuery Validate扩展验证方法 (zhangxiaobin)
/***************************************************************** jQuery Validate扩展验证方法 (zhangxiaob ...
- LA3029 City Game
Bob is a strategy game programming specialist. In his new city building game the gaming environment ...
- 1858: [Scoi2010]序列操作
1858: [Scoi2010]序列操作 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 3397 Solved: 1624 [Submit][Statu ...
- idea小操作
1.IDEA 实用功能Auto Import:自动优化导包(自动删除.导入包) 2.设置System.out.println();等快捷键 3.将idea的背景修改为图片 4.Linux ifconf ...
- 利用Nginx轻松实现Ajax的跨域请求(前后端分离开发调试必备神技)
利用Nginx轻松实现浏览器中Ajax的跨域请求(前后端分离开发调试必备神技) 前言 为什么会出现跨域? 造成跨域问题的原因是因为浏览器受到同源策略的限制,也就是说js只能访问和操作自己域下的资源,不 ...
- NYOJ1367 物流配送
题目描述: 物流配送是物流活动中一种非单一的业务形式,它与物品流动.资金流动紧密结合.备货是配送的准备工作或基础工作,备货工作包括筹集货源.订货或购货.集货.进货及有关的质量检查.结算.交接等.配送的 ...