zoukankan      html  css  js  c++  java
  • 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

    代码下载:

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

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

  • 相关阅读:
    Windows Svr 2008 Ent R2 性能计数器显示不全
    SQL Server的keepalive
    C语言字符串常见操作-strcpy、strlen、strcat和strcmp实现
    计算机中数据的编码方式
    OC中的排序方法
    关于C语言内存对齐
    C语言内存管理总结-野指针
    Objective-C基础学习笔记(九)-Foundation
    Objective-C基础学习笔记(八)-内存管理-autorelease使用-property创建对象的内存管理-循环引用的内管管理
    Objective-C基础学习笔记(七)-分类-Category-类的本质-load和+initialize方法-SEL数据
  • 原文地址:https://www.cnblogs.com/mikewolf2002/p/2505412.html
Copyright © 2011-2022 走看看