Directx11教程(65) 渲染到纹理

    通常情况下,我们的render target都是后缓冲,但也可以把render target设置为一个2d 纹理,然后再通过贴图的方式,把这个2d纹理显示出来,这样,就可以在一个屏幕上显示多个场景了。

    本教程中,我们在myTutorialD3D11_59的基础上,来实现渲染到纹理的效果。

    首先,创建一个rendertextureclass,这个类中,我们创建一个2d纹理,并把这个2d纹理设置为render target,并有一个m_shaderResourceView对象,通过这个对象,我们就可以访问这个2d纹理,后面的2d渲染就是通过这个对象,来实现纹理操作的。

    rendertexture类很简单,主要的变量和函数为:

class RenderTextureClass
{
public:
    RenderTextureClass();
    RenderTextureClass(const RenderTextureClass&);
    ~RenderTextureClass();

    bool Initialize(ID3D11Device*, int, int);
    void Shutdown();

    void SetRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*);
    void ClearRenderTarget(ID3D11DeviceContext*, ID3D11DepthStencilView*, float, float, float, float);
    ID3D11ShaderResourceView* GetShaderResourceView();

private:
    ID3D11Texture2D* m_renderTargetTexture; //渲染目标视图
    ID3D11RenderTargetView* m_renderTargetView;
    ID3D11ShaderResourceView* m_shaderResourceView; //shader资源
};

    接着,我们要创建一个debugwindowclass类,这个类用于在屏幕上显示一个小窗口,把一些常用的信息放在这个窗口类。这个类使用2d渲染,就是传入的投影矩阵,非透视投影矩阵,而是平行投影矩阵。在D3CClass中,我们通过m_D3D->GetOrthoMatrix(orthoMatrix);得到平行投影矩阵。该类通过画两个三角形,构成一个矩形,然后通过纹理贴出方式,把传入的纹理在该矩形框中显示出来。

  该类使用textureshaderclass进行渲染,使用的shader文件为texture.vs和texture.ps。

  在graphicsClass中,我们渲染场景的代码有所改变,要渲染场景2个pass,第一个pass,改变render target,把场景渲染到纹理中。第二个pass正常渲染场景,最后再通过debugwindowclass把第一个pass中产生的纹理通过贴图的方式显示出来。主要的代码如下:

bool GraphicsClass::Frame(float dt)
    {
    D3DXMATRIX worldMatrix, viewMatrix, orthoMatrix;
    bool result;

   // 把场景渲染到纹理中
    result = RenderToTexture(dt);
    if(!result)
        {
        return false;
        }

    // 清除渲染背景.
    m_D3D->BeginScene(0.0f, 0.0f, 0.0f, 1.0f);
    // 调用Render函数,渲染3D场景
    // Render是GraphicsClass的私有函数.
    result = Render(dt);
    if(!result)
        {
        return false;
        }
    // 关掉zbuffer,开始2d渲染.
    m_D3D->TurnZBufferOff();

    // 得到世界,视图以及正交投影矩阵
    D3DXMatrixIdentity(&worldMatrix);
    m_Camera->getViewMatrix(&viewMatrix);
    m_D3D->GetOrthoMatrix(orthoMatrix);

    // 准备debug小窗口的顶点缓冲.
    result = m_DebugWindow->Render(m_D3D->GetDeviceContext(), 20, 10);
    if(!result)
        {
        return false;
        }

    // 用纹理shader渲染debug小窗口,把前面渲染到纹理的场景用过贴图,贴在小窗口.
    result = m_TextureShader->Render(m_D3D->GetDeviceContext(), m_DebugWindow->GetIndexCount(), worldMatrix, viewMatrix,
        orthoMatrix, m_RenderTexture->GetShaderResourceView());
    if(!result)
        {
        return false;
        }

    // 打开z buffer
    m_D3D->TurnZBufferOn();

    // 把渲染的场景present到屏幕
    m_D3D->EndScene();
    return true;
    }

程序执行后的界面如下:

完整的代码请参考:

工程文件myTutorialD3D11_62

代码下载:

稍后提供

 

时间: 2024-09-27 03:10:11

Directx11教程(65) 渲染到纹理的相关文章

Directx11教程(4) 一个最基本D3D应用程序(2)

接着上篇教程的代码,本篇加入基本的D3D代码,实现一个完整的D3D11程序框架. 我们增加一个新类D3DClass, 用来处理3D渲染功能.增加该类后,程序的框架如下图:     GraphicsClass.h代码改变如下, 主要是增加了一个D3DClass类成员变量,在Render函数中,将会调用D3DClass的相应Render函数,比如BeginScene.EndScene,BeginScene主要是清除framebuffer,设置渲染背景颜色,而EndScene则是把交换前后缓冲,使当前

Directx11教程(66) D3D11屏幕文本输出(1)

     在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所有问题,但在D3D11中个,这个变得超级麻烦,因为微软移除了Font接口,要在屏幕上输出文本,用户需要做很多事情. 通常我们可以用以下的方法来输出文本信息: (1)用纹理贴图的方法,把所有的字体存储在一张纹理上,再做一个字体查询表,对应纹理的相应位置,可以用2D渲染的方式,把文本染出来,但这种方法不是很灵活,英文还好说,字母字符就那么多,但对于汉字就麻烦了,另外字体

Directx11教程(67) 显示模型文件

      在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的三维物体呢?特别是利用已有的3D文件,比如obj, 3ds, md2, x等格式的文件,这时,就要利用这些3D格式的解析器,本教程中,我们利用Open Asset Import Library库,来显示各种格式的3D文件(动画文件,暂时不考虑,只考虑静态的3D文件).       Open Asset Import Library是一个开源的模型导入

Directx11教程(43) 纹理映射(13)-动态纹理映射

     本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理波动的效果.       地形(山谷)以及水面都是基于网格的平面.       对于地形,修改顶点类型为: struct VertexType     {     D3DXVECTOR3 position;     D3DXVECTOR3 normal;     D3DXVECTOR2 texture; //纹理坐标     D3DXVECTOR4 Kd; //材质的

Directx11教程(49) stencil的应用-镜面反射

     本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. ID3D11DepthStencilState* m_depthStencilStateMirror; ID3D11DepthStencilState* m_depthStencilStateReflect; m_depthStencilStateMirror是渲染镜子时候,使用的depth stencil 状态,我们设置stencil 函数为D3D11_COMPARI

Dreamweaver MX 2004视频宝典教程(65)

dreamweaver|教程 第 65 集:CSS的介绍 课程目标:了解CSS的基本作用. 课程要点:CSS也就是层叠样式表,它可以控制和重设HTML中的绝大多数标记.CSS是网页设计者必须掌握的知识. [全屏观看] | [下载视频] 本教程尺寸为 800 * 600 建议全屏在线观看或下载观看,以达到最佳观看效果

Directx11教程(54) 简单的基于GS的billboard实现

    本章我们用一个billboard的实现来学习D3D11中的GS.     在VS shader中,我们输入的是顶点位置及顶点属性,输出的也是顶点位置及顶点属性.在GS shader中,我们输入的是体元(primitive,可以是点,线,三角形等等,凡是D3D11中允许的体元都可以使用), 输出顶点.顶点属性,以及体元信息.     如下面两个图,左边对一个三角形做vs操作,则会对三个顶点v1,v2,v3分别执行顶点操作,右图对三角形做gs操作,则整个三角形做为输入,输出则为一个四面体(增

Directx11教程(19) 画一个简单的地形

      通常我们在xz平面定义一个二维的网格,然后y的值根据一定的函数计算得到,比如正弦.余弦函数的组合等等,可以得到一个看似不错的地形或者水面的效果. 在本教程中我们修改ModelClass.h和ModelClass.cpp,得到一个近似的地形.         在本章代码中,我们定义300*300=90000个顶点,共(300-1)(300-1)*2个三角形,每个网格的大小都为1.     我们得到y值的函数为: float ModelClass::getHeight(float x,

Directx11教程(3) 一个最基本D3D应用程序(1)

      在前一篇教程程序代码的基础上,这次我们将增加2个类: InputClass,键盘处理的代码将放在这个类里面,GraphicsClass类,D3D渲染的代码放在这个类里,这两个类都是SystemClass类的成员变量,SystemClass类中会调用这2个类实例的初始化.渲染以及shutdown函数.    增加这个两个类后,应用的程序的框架如下:     System Class类有点小变动,增加了两个成员变量m_Input,m_Graphics,分别处理输入和渲染的操作. Syst