Directx11教程(65) 渲染到纹理

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

    通常情况下,我们的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);得到平行投影矩阵。该类通过画两个三角形,构成一个矩形,然后通过纹理贴出方式,把传入的纹理在该矩形框中显示出来。

image

  该类使用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;
    }

程序执行后的界面如下:

image

完整的代码请参考:

工程文件myTutorialD3D11_62

代码下载:

稍后提供

 

相关文章
|
前端开发
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
2108 0
Threejs - 加载视频纹理渲染 实现一个3D视频播放器
|
3月前
|
缓存 图形学
Unity3D学习笔记12——渲染纹理
Unity3D学习笔记12——渲染纹理
38 2
|
3月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
36 2
|
5月前
|
开发工具 图形学
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
【推荐100个unity插件之11】Shader实现UGUI的特效——UIEffect为 Unity UI 提供视觉效果组件
291 0
|
负载均衡 安全 vr&ar
【Unity渲染】一文看懂!Unity通用渲染管线URP介绍
Unity 的渲染管线包含内置渲染管线、SRP、URP和HDRP。自从Unity2019.3开始,Unity将轻量级渲染管线修改为了通用渲染管线,这是一种快速、可扩展的渲染管线,支持所有的移动设备,适用于 2D、3D、虚拟现实 (VR) 和增强现实 (AR) 项目。
|
缓存 BI API
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波
从0开发游戏引擎之纹理管理器实现 纹理数据绑定OpenGL滤波方式选择线性滤波
|
存储 缓存 算法
OpenGL图像渲染以及渲染问题解决方案
在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的,对于不可见的部分,应该及早丢弃。例如在一个不透明的墙壁后,就不应该有渲染,这种情况叫做隐藏面消除(Hidden surface elimination).
621 0
OpenGL图像渲染以及渲染问题解决方案
|
存储 图形学
【Aladdin Unity3D Shader编程】之四 贴图纹理
关于纹理贴图介绍 纹理坐标也叫UV坐标,UV坐标都是0~1,并不是我们所理解的像素坐标,相当于是一个百分比。 编写shader映射纹理 将纹理的颜色取代漫反射的颜色 Shader "AladdinShader/11 Single Texture Shader" ...
1752 0