原文: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

代码下载:

稍后提供

 

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

  1. NeHe OpenGL教程 第三十六课:从渲染到纹理

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

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

    原文:Directx11教程(67) 显示模型文件       在前面的教程中,我们都是通过在ModelClass中直接产生顶点和索引数据,简单的三角形,立方体等等还好说,毕竟比较简单,如何显示复杂的 ...

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

    原文:Directx11教程(66) D3D11屏幕文本输出(1)      在D3D10中,通过ID3DX10Font接口对象,我们可以方便的在屏幕上输出文字信息,一个DrawText函数就能解决所 ...

  4. Directx11教程(57) 环境映射

    原文:Directx11教程(57) 环境映射       建好skydome后,如果我们想让其中的某个物体,比如那个球体来映射出周围环境的蓝天白云(不包括自己附近的物体),该怎么做呢?此时可以把这个 ...

  5. Directx11教程(56) 建立一个skydome

    原文:Directx11教程(56) 建立一个skydome       本章建立一个skydome(天空穹),主要学习如何使用cube mapping.      cube map就是把六张纹理当作 ...

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

    原文:Directx11教程(54) 简单的基于GS的billboard实现     本章我们用一个billboard的实现来学习D3D11中的GS.     在VS shader中,我们输入的是顶点 ...

  7. Directx11教程(52) 实例(instancing)的简单应用

    原文:Directx11教程(52) 实例(instancing)的简单应用 有些时候,我们需要在场景中渲染大量的重复的物体,比如体育场中的观众,森林里面的树木等等,这些物体具有相似的形状,比如很多树 ...

  8. Directx11教程(51) 简单的billboard

    原文:Directx11教程(51) 简单的billboard        billboard称作公告板,通常用一个quad(四边形)表示[有的billboard用两个正交的quad表示],它的特点 ...

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

    原文:Directx11教程(49) stencil的应用-镜面反射      本教程中,我们利用stencil来实现一个镜面反射效果. 1.首先我们要在D3DClass中增加几个成员变量及函数. I ...

随机推荐

  1. BZOJ 2165: 大楼

    Time Limit: 40 Sec Memory Limit: 259 MB Submit: 957 Solved: 353 [Submit][Status][Discuss] Descriptio ...

  2. linux 编译C语言代码后产生OBJ文件的方法

    如果你不指定编译成什么文件,gcc默认一步到位,直接生成可执行文件你可以试试以下几个参数 -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他 ...

  3. rdf(资源描述框架)

    资源描述框架(Resource Description Framework),一种用于描述Web资源的标记语言.RDF是一个处理元数据的XML(标准通用标记语言的子集)应用,所谓元数据,就是“描述数据 ...

  4. Maven实战02_Maven的安装和配置

    1:在Windows上安装Maven 本人系统环境:win10  + JDK1.8 + apache-maven-3.3.9 在安装Maven之前,首先要确定你的Java环境是否已经配置好了,你是否已 ...

  5. day67test

    作业 1.按照上方 知识点总结 模块,总结今天所学知识点: 2.有以下广告数据(实际数据命名可以略做调整) ad_data = { tv: [ {img: 'img/tv/001.png', titl ...

  6. 2019-8-31-HttpRepl-互操作的-RESTful-HTTP-服务调试命令行工具

    title author date CreateTime categories HttpRepl 互操作的 RESTful HTTP 服务调试命令行工具 lindexi 2019-08-31 16:5 ...

  7. Leetcode543.Diameter of Binary Tree二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过根结点. 示例 : 给定二叉树 1 / \ 2    3 / \ 4  5 返回 3, 它 ...

  8. Django项目:CRM(客户关系管理系统)--45--37PerfectCRM实现King_admin添加用户时密码加密

    #views # ————————02PerfectCRM创建ADMIN页面———————— from django.shortcuts import render # ————————04Perfe ...

  9. 20190814-A Second

    一秒,或是,第二次? 这考试也太频繁了吧…… 考试过程: 看三道题. T1没思路. 然后去厕所清醒了一下. 在厕所的时候,突然想到可以离散化. 于是就这么搞了. 然后去写T2. T2好像是数学题. 于 ...

  10. linux 下环境变量设置

    Ubuntu Linux系统包含两类环境变量:系统环境变量和用户环境变量.系统环境变量对所有系统用户都有效,用户环境变量仅仅对当前的用户有效. 修改用户环境变量 用户环境变量通常被存储在下面的文件中: ...