渲染到目標,通俗地說就是把特定場景的物體放在目標上顯示。這個目標可以是紋理,視窗等。本文介紹的是把場景渲染到紋理,並以的形式儲存起來。
一其原理如下:
在初始化時建立一紋理texture,獲取指向該紋理的指標,接著建立深度表面,並獲取指向其的指標depthsu***ce。在渲染時先獲取系統的預設的渲染目標和深度模板表面,再設定texture的表面為渲染目標,並通過depthsu***ce設定深度模板表面,接著渲染場景中的物體,並儲存該紋理到制定路徑,最後恢復系統的預設的渲染目標和深度模板表面。
二 具體步驟:
設計一渲染目標類rendertarget,負責紋理,深度表面的建立,以及設定渲染目標,深度表面等。現介紹其實現:
初始化函式:該函式接收外界傳入的width和height作為紋理的寬和高,
其功能有:1 是根據width和height建立紋理,呼叫idirect3ddevice9介面的
createtexture(width,height,1,d3dusage_rendertarget,
d3dfmt_a8r8g8b8
,d3dpool_default,&mprtt,null);
mprtt為指向該紋理的指標。
2 根據width和heigh建立深度表面,呼叫idirect3ddevice9介面的
createdepthstencilsu***ce
(width,height,d3dfmt_d24s8,
d3dmultisample_none
,0,true,&mpdepthsu***ce,null);
mpdepthsu***ce為指向該深度表面的指標
渲染函式:首先要獲取乙個系統裝置指標device,定義並初始化idirect3dsu***ce9型別指標 poldzbuffer, prendersu***ce ,pbackbuffer。
接著獲取系統預設的渲染目標device->getrendertarget(0,&pbackbuffer);
獲取系統d3d預設深度表面device->getdepthstencilsu***ce(&poldzbuffer);
設定mprtt紋理的表面作為渲染目標
mprtt->getsu***celevel(0,&prendersu***ce);
device->setrendertarget(0,prendersu***ce);
再設定深度表面 device->setdepthstencilsu***ce(mpdepthsu***ce);
執行場景物體的渲染操作後,再恢復系統預設設定
device->setrendertarget(0,pbackbuffer);
device->setdepthstencilsu***ce(poldzbuffer);
最後釋放引用safe_release(pbackbuffer);safe_release(prendersu***ce);
三 ***模式實現:
現討論一下場景物體的渲染部分:
因某些場景的不同而需要進行特殊的渲染操作,這樣就要求根據不同場景呼叫不同的渲染流程。這樣需用到一設計模式:***模式。
其原理如下:先設定呼叫哪一種***,再根據不同的***執行其相應的渲染操作。
實現如下:
1先定義一虛基類:listener,定義兩個純虛函式:
virtual void execute()=0; virtual void afterexecute()=0;
再定義兩個listener的子類:reflectlistener,currentscenelistener 並改寫其純虛函式,可在execute()裡進行場景物體模型的渲染操作,afterexecute()執行相關的重置操作。
2在場景類scene的私有成員列表中定義:
rendertarget
*mpreflecttarget;
reflectlistener
*mpscenerenderer;
rendertarget
*m_pcurrentscenetarget;
currentscenelistener
*m_pcurrentlistener;
即乙個***對應乙個渲染目標。
3在rendertarget類私有成員列表中定義:listener
*mprenderlistener;
並新增對應的設定***的介面函式 setrenderevent
(listener *plistener);
再新增一成員函式__rend(),其在rendertarget
類的rend()中呼叫,__rend()首先要進行清理操作:執行idirect3ddevice9介面的
clear
(0,null,d3dclear_target|d3dclear_zbuffer,d3dcolor_xrgb(255,255,255),1.0f, 0);
再執行:mprenderlistener
->execute();mprenderlistener->afterexecute();
這樣可根據不同的***執行不同的渲染流程。
4在場景類的初始化函式執行:
m_pcurrentlistener=new currentscenelistener();
m_pcurrentscenetarget=new rendertarget();
m_pcurrentscenetarget->initial("currentscenetarget",1024,1024);
m_pcurrentscenetarget->setrenderevent(m_pcurrentlistener);
同理可使用reflectlistener***。
5因本文描述的是渲染目標到紋理,並以的格式儲存,那可在scene的析構函式裡執行場景物體的渲染操作:m_pcurrentscenetarget->render();
這樣儲存的是執行介面關閉時的那個場景畫面。
四 概括一下流程:
在scene的初始化函式執行rendertarget
的initial(),接著設定***
setrenderevent(),再在scene的析構函式裡執行rendertarget的render
(),而render
()呼叫rendertarget
的__render(), __render()呼叫相應***的 execute()和afterexecute(),在execute()進行場景物體的渲染操作。
引擎技術研究之Shader技術
shader 技術屬於 gpu的渲染技術,其相應語言是高階著色器語言 high level shader language 簡稱hlsl hlsl 主要作用為將一些複雜的影象處理快速而又有效率地在顯示卡上完成。在 directx 中有兩種 shader 頂點著色器 vertex shader vs ...
AOP技術研究 引言
1 引言 軟體設計因為引入物件導向思想而逐漸變得豐富起來。一切皆為物件 的精義,使得程式世界所要處理的邏輯簡化,開發者可以用一組物件以及這些物件之間的關係將軟體系統形象地表示出來。而從物件的定義,進而到模組,到元件的定義,利用物件導向思想的封裝 繼承 多型的思想,使得軟體系統開發可以向搭建房屋那樣,...
技術研究與工程開發
一 r d概念的分拆 搞研發的掏出名片來一般會印上這麼個部門 r d。所謂r d就是research develop,研究與開發,所以簡稱研發。我曾經碰到個高人,強調把這兩詞拆開來單獨理解。研究 就是把乙個團隊知識之外的知識點弄懂,引入專案中使用 開發 就是把已經明白的東西做出來。二 為什麼多數程式...