国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
2DApplication
2D Application收藏
轉(zhuǎn)載
2D Application
這一章將討論IDirect3DDevices9接口怎樣應(yīng)用到簡(jiǎn)單的兩維應(yīng)用程序里去。然而,接下來(lái)討論的方法和接口的方法不僅僅只應(yīng)用在兩維應(yīng)用程序里面。
開(kāi)始我們將看看IDirect3DSurface9接口,它用于存放像素?cái)?shù)據(jù)。我們將看看怎樣創(chuàng)建surfaces,怎樣填充數(shù)據(jù),并且執(zhí)行像素拷貝操作。
接下來(lái),我們討論IDirect3DSwapChain9接口管理back buffer集合。設(shè)備創(chuàng)建的時(shí)候都會(huì)攜帶一個(gè)默認(rèn)的swap chain,但是也可以為window模式下多個(gè)視圖創(chuàng)建新的swap chain。
再接下來(lái),我們將討論P(yáng)resentation,Present 也是IDirect3DDevice9提供的方法。
即使Direct3D可以不使用GDI,但是他們也要處理發(fā)送到應(yīng)用程序top-level窗口的消息。我們推薦使用Direct3D應(yīng)用程序來(lái)處理窗口消息。DirectX 并沒(méi)有提供直接方法來(lái)將GDI和Direct3D結(jié)合起來(lái)。但是,通常是在內(nèi)存DC和流水線產(chǎn)生的結(jié)果像素?cái)?shù)據(jù)上執(zhí)行GDI操作。
最后,我們將討論流水線的Video scan out部分以及swap chain從back buffer到front back 的過(guò)程。video scan out 電流讀取數(shù)據(jù),使用cursor overlay,gamma校正以及像素?cái)?shù)據(jù)轉(zhuǎn)化成monitor的模擬信號(hào)。
Pixel Surface
Pixel 面是像素?cái)?shù)據(jù)的矩形集合。像素?cái)?shù)據(jù)的內(nèi)存layout是通過(guò)D3DFORMAT定義的。在設(shè)備上使用surface有幾處地方:back buffer surfaces, depth/stencil buffer surfaces,紋理層surface,render target surface 以及圖片surface。Direct3D 使用IDirect3DSurface9接口表示一個(gè)surface,CreateOffscreenPlainsurface方法可以創(chuàng)建一個(gè)圖片surface,它能存在于scrath內(nèi)存池,系統(tǒng)內(nèi)存池和設(shè)備內(nèi)存池。CreateDepthStencilSurface和CreateRenderTarget分別返回depth/stencil的surface和render target的surface。一個(gè)plain surface可能不是3D 渲染的目標(biāo),但是你能在plain surface和其他surface之間進(jìn)行數(shù)據(jù)拷貝。
HRESULT CreateOffscreenPlainSurface(UINT width,
UINT height,
D3DFORMAT format,
D3DPOOL pool,
IDirect3DSurface9 ** result,
HANDLE * unused);
如果設(shè)備不支持被請(qǐng)求面的各式,CreateOffscreenPlainSurface將會(huì)失敗,或者是系統(tǒng)內(nèi)存里面沒(méi)有足夠的存儲(chǔ)空間。使用CheckDeviceFormat可以用來(lái)預(yù)先檢查設(shè)備是否支持某種格式的surface。
interface IDirect3DSurface9 : IDirect3DResource9
{
HRESULT GetContainer(REFIID container_iid, void ** value);
HRESULT GetDC(HDC ** value);
HRESULT GetDesc(D3DSURFACE_DESC * value);
HRESULT LockRect(D3DLOCKED_RECT * data,  const RECT * locked_region,DWORD flags);
HRESULT Release(HDC context);
HRESULT UnlockRect();
}
對(duì)于CreateOffscreenPlainSurface創(chuàng)建的surface,當(dāng)container_iid是IID_Direct3DDevice9時(shí),GetContainer將返回成功。GetDESC將返回D3DSURFACE_DESC結(jié)構(gòu)體里面的像素?cái)?shù)據(jù)的描述信息。
typedef struct _D3DSURFACE_DESC
{
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
D3DMULTISAMPLE_TYPE MultiSampleType; //與render target surface一起使用的multisampling
DWORD MultiSampleQuality;
UINT Width;
UINT Height;
} D3DSURFACE_DESC;
Accessing Surface Pixel Data
為了獲取surface的像素?cái)?shù)據(jù),我們需要使用LockRect和UnlockRect方法。當(dāng)lockRect方法的locked_region不為NULL的時(shí)候,就只lock住了surface的某個(gè)局部。參數(shù)flags告訴Direct3D一旦surface被鎖住,數(shù)據(jù)將怎么辦。Flags包括D3DLOCK_DISCARD, D3DLOCK_DONOTWAIT, D3DLOCK_NO_DIRTY_UPDATE,D3DLOCK_NOSYSLOCK, D3DLOCK_READONLY。
D3DLOCK_DISCARD通知runtime整個(gè)locked區(qū)域?qū)⒅槐粚?xiě)入而不讀取。使用discard flag, runtime不會(huì)提供一份surface數(shù)據(jù)的copy給應(yīng)用程序讀取。不使用discard flag,runtime可能被迫停掉所有未決的操作,然后再返回一個(gè)surface數(shù)據(jù)的copy給應(yīng)用程序。注意:這個(gè)flag不能使用在子區(qū)域。
D3DLOCK_DONOTWAIT 決定當(dāng)lock的時(shí)候不會(huì)阻塞住runtime,等待未決的渲染操作完成。如果lock調(diào)用已經(jīng)阻塞了,它將返回D3DERR_WASSTILLDRAWING。
Direct3D為每個(gè)可管理的surface(注意這里只能是managed surface)維護(hù)一個(gè)dirty 區(qū)域表,用來(lái)最小化unlock數(shù)據(jù)的拷貝量。如果已經(jīng)是使用了D3D_NO_DIRTY_UPDATE,locked區(qū)域?qū)⒉粫?huì)影響dirty 區(qū)域list。
使用D3DLOCK_READONLY,應(yīng)用程序保證對(duì)鎖定區(qū)域沒(méi)有任何的寫(xiě)操作。
D3DLOCK_NOSYSLOCK只只能應(yīng)用到video memory的surfaces。為了阻止video存儲(chǔ)資源被鎖時(shí)設(shè)備lost,Direct3D獲取系統(tǒng)critical section來(lái)阻止設(shè)備丟失。它也能阻塞操作系統(tǒng)的其他部分執(zhí)行,這樣勢(shì)必會(huì)影響系統(tǒng)的交互和反應(yīng)靈敏度。 D3DLOCK_NOSYSLOCK 禁止獲取系統(tǒng)的critical section。
LockRect 方法返回D3DLOCKED_RECT結(jié)構(gòu)體,它定義了surface的像素?cái)?shù)據(jù)。它保證了surface數(shù)據(jù)在sanline上是連續(xù)的。
typedef struct _D3DLOCKED_RECT
{
int  pitch;  //定義了相鄰兩個(gè)scanlines的距離。
void *pBits; //像素?cái)?shù)據(jù)的指針。
}D3DLOCKED_RECT;
當(dāng)遍歷surface的每個(gè)像素時(shí),pitch 和像素的大小是很重要的。像素?cái)?shù)據(jù)的大小是跟D3DFORMAT有關(guān)。
IDirect3DSurface9并沒(méi)有提供方法用于從圖片裝載到surface,或者像素格式轉(zhuǎn)換,D3DX卻提供了很多這樣的操作方法。
Using GDI On a Surface
GDI提供GetDC和ReleaseDC方法來(lái)操作與GDI兼容格式的surface。與GDI兼容格式包括D3DFMT_R5G6B5,D3DFMT_X1R5G5B5,D3DFMT_R8G8B8和D3DFMT_X8R8G8B8。
GDI device context可以使用GDI執(zhí)行基于surface的渲染操作,然后立刻釋放。一旦device context被創(chuàng)建,就會(huì)在Direct3D runtime里面建立一個(gè)lock。 這個(gè)lock保證runtime并不直接跟GDI rendering交互。因?yàn)檫@個(gè)lock的存在,應(yīng)用程序應(yīng)該盡可能快的釋放GDI device context。而且, 只有device context釋放以后,下面表里的方法才能調(diào)用。
Interface
Method
IDirect3DCubeTexture9
LockRect
IDirect3DDevice9
ColorFill
Present
StretchRect
UpdateSurface
UpdateTexture
IDirect3DSurface9
LockRect
IDirect3DSwapChain9
Present
IDirect3DTexture9
LockRect
Swap Chain
每個(gè)設(shè)備都包含一組默認(rèn)的swap chains。GetNumberOfSwapChains返回設(shè)備swap chains的數(shù)目。GetSwapChain方法返回默認(rèn)swap chain集合里的swap chain的接口。
默認(rèn)swap chain集合的屬性定義在D3DPRESENT_PARAMETERS。Swap chain由1個(gè),2個(gè),3個(gè)back buffer surface 和一個(gè)front buffer surface。front buffer surface不能直接訪問(wèn),但是它仍然參與到swap chain的presentation過(guò)程中。 當(dāng)調(diào)用Present時(shí)back buffer surface顯示在monitor。
exclusive 模式的設(shè)備使用它默認(rèn)的back buffer。window模式的設(shè)備可以使用多個(gè)swap chain,每個(gè)都可以將渲染結(jié)果繪制它自己的窗口。exclusive模式的adapter group 設(shè)備也可以渲染到多個(gè)monitor。
CreateAdditionalSwapChain創(chuàng)建一個(gè)基于D3DPRESENT_PARAMETERS的swap chain,然后返回一個(gè)IDirect3DSwapChain9接口。注意一個(gè)Swap chain只能包含back buffer surface而不是depth/stencil surface。
HRESULT CreateAdditionalSwapChain(D3DPRESENT_PARAMETERS * params, IDirect3DSwapChain9 ** result);
interface IDirect3DSwapChain9 : IUnknown
{
HRESULT GetBackBuffer(UINT buffer, D3DBACKBUFFER_TYPE kind, IDirect3DSurface9 ** value);
HRESULT GetDevice(IDirect3DDevice9  ** value);
HRESULT GetDisplayMode(D3DDISPLAYMODE * value);
HRESULT GetFrontBufferData(IDirect3DSurface9 * destination);
HRESULT  GetPresentParameters(D3DPRESENT_PARAMETERS * value);
HRESULT  GetRasterStatus(D3DRASTER_STATUS * value);
HRESULT Present(CONST RECT * source, CONST RECT * destination, HWND override, CONST RGNDATA * dirty_region, DWORD flags);
}
GetBackBuffer返回一個(gè)back buffer surface的接口指針。back buffer序號(hào)以0開(kāi)始,present首先顯示是back buffer 0里面的內(nèi)容,然后再是back buffer 1, 依此下去...。 D3DBACKBUFFER_TYPE定義了back buffer的類型。DirecX 9.0c 并不支持stereo 渲染,,kind只能是D3DBACKBUFFERTYPE_MONO.
typedef enum _D3DBACKBUFFER_TYPE
{
D3DBACKBUFFER_TYPE_MONO = 0,
D3DBACKBUFFER_TYPE_LEFT = 1,
D3DBACKBUFFER_TYPE_RIGHT = 2
}D3DBACKBUFFER_TYPE;
Present跟device的Present方法一樣,都執(zhí)行同樣的功能。flag的值包括D3DPRESENT_DONOTWAIT和D3DPRESENT_LINEAR_CONTENT。D3DPRESENT_DONOTWAIT表示如果presentation引起應(yīng)用程序阻塞,它將立刻返回D3DERR_WASSTILLDRAWING。 D3DPRESENT_LINEAR_CONTENT 告訴設(shè)備presentation時(shí)源區(qū)域像素應(yīng)該從線性顏色空間轉(zhuǎn)化到sRGB顏色空間。
Presentation
當(dāng)調(diào)用了Present后,back buffer的內(nèi)容將會(huì)被復(fù)制到front buffer,video scan out 電流讀取front buffer的像素把他們顯示在monitor上。如果D3DCAPS9::DevCaps的D3DDEVCAPS_CANRENDERAFTERFLIP被設(shè)置,present發(fā)生以后設(shè)備將繼續(xù)queue渲染命令,也就是在設(shè)備與CPU之間有更多的并發(fā),當(dāng)前幀渲染的時(shí)候,下一幀已經(jīng)queue。但是一個(gè)設(shè)備queue的幀數(shù)最多不能超過(guò)兩幀。
#define D3DDEVCAPS_CANRENDERAFTERFLIP 0x000000800L
HRESULT Present(const RECT * source_rect, const RECT* dest_rect,HWND override_window, const RGNDATA * dirty_region);
Present對(duì)Swap chain的行為使用D3DPRESENT_PARAMETERS的SwapEffect定義的。
typedef enum _D3DSWAPEFFECT
{
D3DSWAPEFFECT_DISCARD = 1,
D3DSWAPEFFECT_FLIP  = 2,
D3DSWAPEFFECT_COPY = 3
} D3DSWAPEFFECT;
在window模式下面,所有的swap effec都是通過(guò)拷貝操作實(shí)現(xiàn)的。使用最近時(shí)間間隔創(chuàng)建的swap chain并不能讓monitor的垂直掃描與拷貝操作同步??截惒僮鬟\(yùn)行在在Video scan out過(guò)程中,這樣導(dǎo)致了artifacts,也稱作圖像tearing。為了避免這種artifacts,我們需要同步video scan out與拷貝操作,以便于當(dāng)video beam還停留在拷貝操作的目的地時(shí),不能有拷貝操作發(fā)生。如果顯卡并不支持video beam 位置信息,拷貝操作將會(huì)立刻發(fā)生。
在exclusive模式下,presentation的頻率是由D3DPRESENT_PARAMETERS的FullScreen_PresentationInterval指定的。默認(rèn)的presentation inverval 對(duì)應(yīng)adapter視頻模式的刷新率。
如果dest_window不是空,dest_window客戶端區(qū)域就是present的Target。如果dest_window空而D3DPRESENT_PARAMETERS的hDeviceWindow不空,則hDeviceWindow就是present的Target。 如果兩者都空,CreateDevice的focus_window參數(shù)將是present的target。
source和dest只能應(yīng)用到拷貝操作方式,F(xiàn)lip 和Discard這兩個(gè)參數(shù)必須是空??罩当硎菊麄€(gè)source surface 和目的surface。dirty_region也只能使用在拷貝操作下。
Lost Devices and Reset
TestCooperativelevel檢查設(shè)備的狀態(tài),Reset重啟設(shè)備。
HRESULT Reset(D3DPRESENT_PARAMETERS * params);
HRESULT TestCooperativeLevel();
Video Scan out
front buffer的內(nèi)容來(lái)自于Present。GetDisplayMode返回了當(dāng)前front buffer的顯示模式。應(yīng)用程序不能直接訪問(wèn)front buffer,但是可以通過(guò)GetFrontBufferData返回一份front buffer的拷貝。GetFrontBufferData的destination參數(shù)必須是一個(gè)存在的surface,它的維度等于adapter當(dāng)前顯示模式,并且像素格式是D3DFMT_A8R8G8B8。在拷貝過(guò)程中數(shù)據(jù)將從adapter的顯示模式格式轉(zhuǎn)化成surface格式。
HRESULT GetDisplayMode(D3DDISPLAYMODE * value);
HRESULT GetFrontBufferData(IDirect3DSurface* destination);
如果D3DCAPS::Caps的D3DCAPS_READ_SCANLINE位被設(shè)置,設(shè)備將它的video scan out scanline和垂直blank狀態(tài)。
GetRasterStatus將使用D3DRASTER_STATUS結(jié)構(gòu)體返回video scan out 狀態(tài)。scanline 成員指定了rater beam的當(dāng)前位置,0是最頂端的scanline。如果是自下而上的垂直掃描,InVBlank成員將為T(mén)RUE。
HRESULT GetRasterStatus(D3DRASTER_STATUS * value);
typedef struct _D3DRASTER_STATUS
{
BOOL InVBlank;
UINT    Scanline;
} D3DRASTER_STATUS;
·            Cursor
在exclusive模式下,Direct3D管理著cursor的顯示。在video scan out的過(guò)程中硬件Cursor可能會(huì)取代cursor圖像。如果硬件cursor不可用,runtime會(huì)提供一個(gè)軟件cursor對(duì)front buffer讀,修改,寫(xiě)操作。在window模式下,應(yīng)用程序可能會(huì)使用GDI cursor 或者Direct3D cursor。Direct3D cursor 能通過(guò)方法ShowCursor顯示或者隱藏cursor。ShowCursor并不返回HRESULT,而是cursor的上一個(gè)隱藏狀態(tài)。如果它是TRUE,cursor在調(diào)用ShowCursor之前是可見(jiàn)的。
BOOL ShowCursor(BOOL Show);
void    SetCursorPosition(UINT x, UINT y, DWORD flags);
HRESULT  SetCursorProperties(UINT hot_spot_x, UINT hot_spot_y, IDirect3DSurface9 * image);
cursor的位置是通過(guò)SetCursorPosition設(shè)定的,flags參數(shù)
·            Gamma Ramp
在exclusive模式下,應(yīng)用cursor以后, 在進(jìn)行A/D轉(zhuǎn)換之前將會(huì)對(duì)像素?cái)?shù)據(jù)應(yīng)用Gamma校正。在窗口模式下,應(yīng)用程序也能使用GDI來(lái)做Gamma校正。如果D3DCAPS9::Caps的D3DCAPS2_FULLSCREENGAMMA設(shè)置,設(shè)備將會(huì)支持exclusive的Gamma Ramp。
GetGammaRamp能讀取Gamma Ramp的屬性,它返回一個(gè)Gamma Ramp的結(jié)構(gòu)體。
void GetGammaRamp(D3DGAMMARAMP * value);
void SetGammaRamp(DWORD Flags, const D3DGAMMARAMP * value);
typedef struct _D3DGAMMARAMP
{
WORD red[256];
WORD green[256];
WORD  blue[256];
} D3DGAMARAMP;
Gamma ramp屬性通過(guò)SetGammaRamp進(jìn)行設(shè)置,并且它能夠立刻產(chǎn)生反應(yīng)。Flags參數(shù)表示設(shè)備是否使用ramp的calibration,它包括D3DSGR_NO_CALIBRATION和D3DSGR_CALIBRATE。
如果D3DCAPS9::Caps2的D3DCAPS2_CANCALIBRATEGAMMA位設(shè)置,設(shè)備將能夠給Gamma Ramp指定一個(gè)calibration。
下面例子顯示了怎樣計(jì)算ramp values。
void compute_ramp(D3DGAMARAMP & ramp, float gamma)
{
for (UINT i = 0;i< 256;i++)
{
const  WORD val = static_cast<int> (65535 * pow(i/255.f, 1.f/gamma));
ramp.red[i] = val;
ramp.green[i] = val;
ramp.blue[i] = val;
}
}
2D Pixel Copies
如果我們申請(qǐng)可鎖住的back buffer,我們能鎖住back buffer的矩形區(qū)域,然后使用軟件直接對(duì)它讀寫(xiě)操作。然而,back buffer surface是video memory的設(shè)備surface。通過(guò)CPU訪問(wèn)video memory將是一個(gè)昂貴的操作,我們應(yīng)該避免。 但是存放系統(tǒng)內(nèi)存池或者scratch內(nèi)存池的圖像surface能輕松的被CPU訪問(wèn)。
拷貝像素操作一般包括:設(shè)備內(nèi)存到設(shè)備內(nèi)存, 系統(tǒng)內(nèi)存到設(shè)備內(nèi)存,設(shè)備內(nèi)存到系統(tǒng)內(nèi)存。StetchRect 能有效的進(jìn)行設(shè)備內(nèi)存之前的拷貝。UpdateSurface和UpdateTexture一般都是將數(shù)據(jù)從系統(tǒng)內(nèi)存轉(zhuǎn)移到設(shè)備內(nèi)存里面。GetRenderTargetData用于從設(shè)備內(nèi)存將像素?cái)?shù)據(jù)轉(zhuǎn)移到系統(tǒng)內(nèi)存。
當(dāng)你想要在設(shè)備資源直接拷貝數(shù)據(jù)時(shí),你可以使用StretchRect。當(dāng)你需要更新默認(rèn)內(nèi)存池的某個(gè)資源(如圖像surface或者紋理資源),你可以使用UpdateSurface和updateTexture,不過(guò)managed池里的資源會(huì)自動(dòng)更新,當(dāng)它的系統(tǒng)內(nèi)存的數(shù)據(jù)變化時(shí),它會(huì)自動(dòng)更新到設(shè)備內(nèi)存里面去)。
·            Pixel Copies Within Device Memory
StretchRect能夠?qū)⒁粋€(gè)矩形區(qū)域的像素從設(shè)備內(nèi)存的一個(gè)surface轉(zhuǎn)移到另一個(gè)上面去。這兩個(gè)surface通常會(huì)是同樣的D3DFORMAT。在拷貝過(guò)程中,StretchRect也能執(zhí)行有限的幾張顏色轉(zhuǎn)換。
HRESULT StretchRect(IDirect3DSurface9 * source , const RECT *source_rect, IDirect3DSurface9 * destination, const RECT * dest_rect,D3DTEXTUREFILTERTYPE filter);
當(dāng)source_rect非空,整個(gè)source 面將會(huì)拷貝到目的surface。當(dāng)source_rect非空,它指向source面的一個(gè)子區(qū)域。dest_rect也是一樣。 當(dāng)需要調(diào)整源像素區(qū)域大小來(lái)適應(yīng)目的像素區(qū)域的時(shí)候,filter參數(shù)將指定調(diào)整的方式,它的值包括D3DTEXF_NONE, D3DTEXF_POINT,D3DTEXF_LINEAR。當(dāng)縮小和放大源像素區(qū)域的時(shí)候,point和linear的過(guò)濾將會(huì)支持。D3DCAPS9結(jié)構(gòu)的StretchRectFilterCaps各個(gè)位標(biāo)記描述了StretchRect的過(guò)濾支持情況。
#define D3DPTFILTERRCAPS_MAGFLINEAR 0x02000000L
#define  D3DPTFILTERCAPS_MAGFPOINT  0x01000000L
#define  D3DPTFILTERCAPS_MINFLINEAR  0x00000200L
#define  D3DPTFILTERCAPS_MINFPOINT   0x00000100L
如果D3DCAPS9::DevCaps的D3DDEVCAPS_CANBLTSYSTONONLOCAL設(shè)置,StretchRect能支持從系統(tǒng)內(nèi)存到non-local視頻存儲(chǔ)(如AGP內(nèi)存)轉(zhuǎn)移數(shù)據(jù)。
設(shè)備像素拷貝的格式轉(zhuǎn)換
StretchRect也能支持拷貝過(guò)程中的顏色轉(zhuǎn)換操作。支持的轉(zhuǎn)換可以是高性能的YUV surface格式到高性能的RGB surface格式。具體支持什么樣的格式轉(zhuǎn)換,你可以通過(guò)CheckDeviceFormatConversion方法來(lái)查看。
HRESULT CheckDeviceFormatConversion(UINT adapter, D3DDEVTYPE device_kind, D3DFORMAT source_fmt, D3DFORMAT target_fmt);
source_fmt可能是FOURCC格式也可能是合理的back buffer格式。 Target格式將是下面中的一種:D3DFMT_A1R5G5B5 , D3DFMT_A8R8G8B8, D3DFMT_A16B16G16R16, D3DFMT_X1R5G5B5,D3DFMT_A8R8G8B8, D3DFMT_A16B16G16R16, D3DFMT_R5G6B5, D3DFMT_X8B8G8R8,D3DFMT_A32B32G32R32F,
D3DFMT_R8G8B8, D3DFMT_X8R8G8B8, D3DFMT_A2R10G10B10, D3DFMT_A2B10G10R10。
設(shè)備像素拷貝限制:
因?yàn)镾tretchRect直接工作在設(shè)備內(nèi)存上,它將面臨很多限制。
restrictions: 1. source和destination不能是相同的surface。 2. 不能從render target surface 到off screen surface。 3. 不能基于壓縮格式stretch。 4.D3DDEVCAPS2_CAN_STRETCH_RECT_FROM_TEXTURES ,如果source是紋理surface。
depth/stencil restrictions:1. 不能是紋理,2. 不能discardable;3. 必須是整個(gè)surface拷貝;4. source和destination必須是同樣的尺寸。5.不支持filtering。6. 不能從一個(gè)場(chǎng)景里面被調(diào)用。
downsampling multisample render target: 1. 創(chuàng)建multisample render target;2. 創(chuàng)建同樣大小的non-multismapled render target; 3. 從non-MS RT拷貝到MS RT。
如下是source和destination的結(jié)合情況:
DX8 Driver no stretching
Source
Destination
Texture
RT Texture
RT
Off-screen Plain
Texture
NO
NO
NO
NO
RT Texture
NO
Yes
Yes
No
RT
NO
Yes
Yes
No
Off-screen Plain
Yes
Yes
Yes
Yes
DX8 Driver no stretching
Texture
RT Texture
RT
Off-screen Plain
Texture
No
No
No
No
RT Texture
No
No
No
No
RT
No
Yes
Yes
No
Off-screen Plain
No
Yes
Yes
No
DX9 Driver no stretching
Texture
RT Texture
RT
Off-screen Plain
Texture
No
Yes
Yes
No
RT Texture
No
Yes
Yes
No
RT
No
Yes
Yes
No
Off-screen Plain
No
Yes
Yes
Yes
DX9 Driver  stretching
Texture
RT Texture
RT
Off-screen Plain
Texture
No
Yes
Yes
No
RT Texture
No
Yes
Yes
No
RT
No
Yes
Yes
No
Off-screen Plain
No
Yes
Yes
No
·            Copies From System Memory To Device Memory
通常你lock一個(gè)surface,然后直接使用CPU為它填充數(shù)據(jù)。但是并且每個(gè)surface都是lockable。設(shè)備內(nèi)存里面的surface通常是不經(jīng)常lock的,因?yàn)閘ock住以后訪問(wèn)速度是非常慢的。所以我們通常的辦法是先使用CPU update系統(tǒng)內(nèi)存的surface,然后使用updateSurface或者UpdateTexture將他們傳給設(shè)備內(nèi)存。
HRESULT UpdateSurface(IDirect3DSurface9 * source, const RECT *source_rect, IDirect3DSurface9 * destination, CONST POINT * offset);
offset參數(shù)指定了目的區(qū)域?qū)?yīng)source 區(qū)域左上角像素的位置偏移。
如果source或者destination的surface用于multisampling或者depth/stencil ,UpdateSurface也將失敗。如下表是updateSurface的source和destinationa的結(jié)合情況。
Source
Destination
Texture
RT Texture
RT
Off-screen Plain
Texture
YES
YES
YES
YES
RT Texture
NO
NO
NO
No
RT
NO
NO
NO
No
Off-screen Plain
Yes
Yes
Yes
Yes
UpdateTexture與UpdateSurface相似,但是它對(duì)于整個(gè)紋理資源而不是單個(gè)surface。runtime 將維護(hù)一個(gè)dirty區(qū)域。
HRESULT UpdateTexture(IDirect3DBaseTexture9 * source , IDirect3DBaseTexture9 * destination);
當(dāng)UpdateTexture被調(diào)用,所有累計(jì)的dirty區(qū)域?qū)?huì)值為level 0的紋理區(qū)域。對(duì)于mipmapped的紋理,每個(gè)mip level對(duì)應(yīng)的區(qū)域同樣也要考慮dirty。 source的levels不能小于destination level數(shù),并且level 0的大小也必須相同。
·            Copies From Device Memory To System Memory
只有兩種方法從設(shè)備里面讀回被渲染的圖片:一種是創(chuàng)建設(shè)備的時(shí)候允許鎖住back buffer,另外一種是 GetRenderTargetData。鎖住back buffer一般比較慢。
HRESULT GetRenderTargetData(IDirect3DSurface9 * source, IDirect3DSurface9 * destination);
如果source 是multisamepled或者不是render target,它將會(huì)失敗。
Filling Rectangles
如果你想直接用某種solid的顏色填充surface的某個(gè)矩形區(qū)域,你可能直接使用colorFill方法,而不是先鎖住再使用CPU填充。
HRESULT  ColorFill(IDirect3DSurface9 * destination, CONST RECT * region, D3DCOLOR color);
Windows Messages
在執(zhí)行過(guò)程中CreateDevice和Reset方法可能會(huì)產(chǎn)生窗口消息。應(yīng)用程序不應(yīng)該在這些方法的執(zhí)行過(guò)程調(diào)用設(shè)備方法來(lái)處理這些消息。 只有設(shè)備窗口完全構(gòu)造完成后,設(shè)備才有方法調(diào)用。
WM_ACTIVATEAPP
當(dāng)active發(fā)生變化時(shí). 中止或者恢復(fù)窗口重畫(huà)。
WM_CLOSE
發(fā)送出去,標(biāo)記應(yīng)用終止。釋放設(shè)備上所有的對(duì)象,釋放設(shè)備然后退出。
WM_COMPACTING
標(biāo)記當(dāng)前內(nèi)存很低。
WM_CONTEXTMENU
當(dāng)用戶點(diǎn)擊context button
WM_CREATE
發(fā)送到一個(gè)被創(chuàng)建的窗口。WM_CREATE一般是在CreateWindow完成之前就發(fā)送出去了。你不應(yīng)該在它里面創(chuàng)建設(shè)備,設(shè)備必須至少在::CreateWindow完成之后再創(chuàng)建。
WM_DISPLAYCHNANGE
當(dāng)桌面分辨率改變的時(shí)候。設(shè)備可能會(huì)reshape,你需要reshape swap chain。
WM_ENTERMENULOOP
當(dāng)進(jìn)入一個(gè)modal菜單。暫停redraw.
WM_ENTERSIZEMOVE
當(dāng)開(kāi)始一個(gè)窗口size 和移動(dòng)操作時(shí)發(fā)送。
WM_ERASEBKGND
當(dāng)窗口北京需要?jiǎng)h除是發(fā)送。
WM_EXITMENULOOP
當(dāng)退出modal菜單是發(fā)送?;謴?fù)連續(xù)的redraw
WM_EXITSIZEMOVE
當(dāng)窗口的size 和move操作完成,reshape swap chain
WM_GETMINMAXINFO
當(dāng)窗口的位置和大小信息將要變化的時(shí)候發(fā)送
WM_MOUSEMOVE
鼠標(biāo)移動(dòng)。
WM_NCHITTEST
當(dāng)鼠標(biāo)移動(dòng)或者鼠標(biāo)pressed或者release的時(shí)候發(fā)送。
WM_PAINT
發(fā)送重畫(huà)窗口damaged的部分。
WM_POWERBROADCAST
電源管理事件
WM_SETCURSOR
設(shè)置一個(gè)cursor。
WM_SHOWWINDOW
當(dāng)窗口將要顯示或者隱藏的時(shí)候
WM_SIZE
當(dāng)窗口大小改變時(shí)
WM_SIZING
當(dāng)窗口正在resize是發(fā)送。
WM_SYSCOMMAND
在系統(tǒng)命令下發(fā)送。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Windows下最簡(jiǎn)單的D3D視頻顯示(YV12)
關(guān)于臟矩形的那些事
Android4.2.2的preview的數(shù)據(jù)流和控制流以及最終的預(yù)覽顯示
微軟 Surface RT 一代平板電腦暴跌至1380元
Android display
降價(jià)的故事
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服