通常情況下,我們的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
代碼下載:
稍后提供


