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);得到平行投影矩陣。該類通過畫兩個三角形,構成一個矩形,然后通過紋理貼出方式,把傳入的紋理在該矩形框中顯示出來。

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

代碼下載:

稍后提供

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM