Directx11教程(51) 简单的billboard

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

       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

相关文章
|
开发工具 图形学
|
API 开发工具 数据格式
|
存储 C++ Windows
使用C++和DirectX开发游戏GUI(六)
要想真正使你的GUI大放光彩,你必须有一个资源编辑器.当然你不需要做个象开发环境提供的资源编辑器那样的华丽和强大,但是你起码得有个基本的程序来完成加入,编辑,删除,排列,免除你为对话框的每个控件计算虚拟坐标位置的麻烦事儿.
1501 0
VS2010 C#配置DirectX相关
    基本上,只需要下载好类似directx_Jun2010_redist.exe这样的东西,默认安装,在工程中稍加引用就OK了。参考网址:http://blog.csdn.net/woaixiaozhe/article/details/7861340 ...
734 0
Directx11教程(63) tessellation学习(5)
TS中生成细分后顶点的u,v,{w}坐标,我们根据控制点和u,w,{w}坐标生成新的顶点位置,在前面四边形的细分中,我们用了双线性差值的方法,得到新的顶点位置,这些新顶点位置都在一个平面上。
887 0
Directx11教程(57) 环境映射
建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个球体当成一面镜子,把我们视点看这个物体上某个顶点p时的反射向量当作cube map查询向量v,得到纹理texel,然后p点的颜色可以用blend的方式,混合当前颜色和采样的纹理texel,就可以实现我们想要的效果。
849 0
|
算法
Directx11教程(60) tessellation学习(2)
本教程中,我们开始tessellation编程,共实现了2个程序,第一个tessellation程序,是对一个三角形进行细分操作,第二个程序是对一个四边形进行细分操作,两个程序coding差不多,我们先看第一个程序。
752 0
|
算法 Go 异构计算
Directx11教程(59) tessellation学习(1)
在D3D11管线中,新增加了3个stage, Hull shader, Tessellator, Domain shader,用来实现细分操作,就是在gpu中把低细节的表面细分成高细节的体元。
824 0