青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

天行健 君子當自強而不息

Direct3D中的繪制(1)

3.1頂點/索引緩存

       頂點和索引緩存有相似的接口并且共享相似的方法;因此我們把它們合在一起講解。一個頂點緩存是一塊連續的存儲了頂點數據的內存。同樣的,一個索引緩存是一塊連續的存儲了索引數據的內存。我們使用頂點和索引緩存保存我們的數據是因為它們能被放置在顯存中。渲染顯存中的數據要比渲染系統內存中的數據快的多。

       在代碼中,一個頂點緩存是通過IDirect3DVertexBuffer9接口來定義的。類似的,一個索引緩存是通過IDirect3DIndexBuffer9接口來定義。

3.1.1創建一個頂點和索引緩存

我們能使用下面兩個方法創建一個頂點緩存和索引緩存:

HRESULT IDirect3DDevice9::CreateVertexBuffer(

       UINT Length,

       DWORD Usage,

       DWORD FVF,

       D3DPOOL Pool

       IDirect3DVertexBuffer9** ppVertexBuffer,

       HANDLE* pSharedHandle

);

 

HRESULT IDirect3DDevice9::CreateIndexBuffer(

       UINT Length,

       DWORD Usage,

       D3DFORMAT Format,

       D3DPOOL Pool,

       IDirect3DIndexBuffer9** ppIndexBuffer,

       HANDLE* pSharedHandle

);

這兩個方法大部分參數是相同的,因此我們一起介紹它們。

Length —— 分配給緩存的字節大小。假如想得到一個能存儲8個頂點的頂點緩存,那么我們就要在頂點結構中設置這個參數為 8 * sizeof ( Vertex ) 。

Usage —— 指定關于怎樣使用緩存的額外信息。這個值可以是0,沒有標記,或者是下面標記的一個或多個的組合:

         D3DUSAGE_DYNAMIC——設置這個參數可以使緩存是動態的。

         D3DUSAGE_POINTS——這個參數指定緩存存儲原始點。這個參數僅僅用在頂點緩沖中。

         D3DUSAGE_SOFTWAREPROCESSING——使用軟件頂點處理

         D3DUSAGE_WRITEONLY——指定應用程序只能寫緩存。它允許驅動程序分配最適合的內存地址作為寫緩存。注意如果從創建好的這種緩存中讀數據,將會返回錯誤信息。

FVF —— 存儲在緩存中的頂點格式

Pool —— 緩存放置在哪一個內存池中

ppVertexBuffer ——返回創建好的頂點緩存的指針。

pSharedHandle ——沒有使用;設置為0。

Format ——指定索引的大小;使用D3DFMT_INDEX16設置16位索引,使用D3DFMT_INDEX32設置32位索引。注意并非所有設備都支持32位索引;請檢查設備能力。

ppIndexBuffer ——返回創建好的索引緩存的指針。

 

注意:不使用D3DUSAGE_DYNAMIC參數創建的緩存被叫做靜態緩存。靜態緩存通常被放置在顯存中,在其中的數據能被很有效的處理。然而,對于靜態緩存,從中讀取和寫入數據是很慢的,因為訪問顯存是很慢的。因為這個原因我們用靜態緩存存儲靜態數據(不需要被經常改變的數據)。地形和建筑物是很好的候選例子,因為在應用程序中他們通常不需要被改變。靜態緩存應該在應用程序初始化的時候就被填充好,而不是在運行時才做。

注意:使用D3DUSAGE_DYNAMIC參數創建的緩存被叫做動態緩存。動態緩存通常被放在AGP內存中,這種內存中的數據能被很快的更新。處理動態緩存中的數據不會比處理靜態緩存中的數據快,因為這些數據必須在渲染前被轉移到顯存中,動態緩存的好處是它們能夠被稍微快點地被更新(比CPU寫快)。因此,假如你需要經常更新緩存中的數據,那么你就應該使用動態緩存。粒子系統是很好的一個應用,因為它們是動態的,并且他們通常每一幀都會被更新。

注意:在程序中讀取顯存和AGP內存都是非常慢的。因此,假如你在運行時需要讀取你的幾何物體,最好的方案是指定一塊系統內存,往其中拷貝并且讀取數據。

下邊是創建一個靜態頂點緩存的例子,該緩存能存儲8個頂點。

IDirect3DVertexBuffer9* vb;

device->CreateVertexBuffer( 8 * sizeof( Vertex ),    0,    D3DFVF_XYZ,  D3DPOOL_MANAGED, &vb, 0);

 

3.1.2 訪問緩沖內存

為了訪問一個頂點/索引緩存,我們需要得到一個指針。我們通過一個指針獲得緩存數據必須使用Lock方法。當我們訪問完緩存后必須對它解鎖。一旦有一個指向內存的指針,我們就能對它進行讀寫。

HRESULT IDirect3DVertexBuffer9::Lock(

       UINT OffsetToLock,

       UINT SizeToLock,

       BYTE** ppbData,

       DWORD Flags

);

HRESULT IDirect3DIndexBuffer9::Lock(

       UINT OffsetToLock,

       UINT SizeToLock,

       BYTE** ppbData,

       DWORD Flags

);

 

 

這兩個方法的參數都是完全相同的。

OffsetToLock —— 偏移量,以字節為單位,從緩存開始位置到鎖定開始位置的距離。如圖3.1。

 

SizeToLock —— 鎖定的字節數。

ppbData —— 一個指向鎖定內存開始位置的指針。

Flags —— 標記描述怎樣鎖定內存。它可能是0或者是下面參數中的1個或多個的組合:

       D3DLOCK_DISCARD——這個參數僅僅會在動態緩存時被使用。它指示硬件丟棄緩存并返回一個指向新分配的緩存的指針。這是很有用,因為當我們存取一個新分配的緩存時它允許硬件繼續從丟棄的緩存渲染。這防止了硬件延遲。

       D3DLOCK_NOOVERWRITE——這個參數僅僅會在動態緩存時被使用。它聲明你將向緩存中添加數據。即你不能向已經渲染的內存中寫數據。這是有好處的因為他允許你在添加新數據到緩存的同時讓硬件繼續渲染。

       D3DLOCK_READONLY——這個參數聲明你鎖定的緩存只能從中讀取數據而不能寫數據。這允許一些內在的優化。

       用參數D3DLOCK_DISCARD和D3DLOCK_NOOVERWRITE表明緩存的一部分被鎖定之后能繼續被使用。假如硬件配置允許這些標記被使用,則在對緩存進行鎖定時,其他的顯示操作就不會中斷。

       下邊的例子展示了通常怎樣使用Lock方法。注意當我們使用完以后要調用Unlock方法。

Vertex* vertices;

_vb->Lock(0, 0, (void**)&vertices, 0); // 鎖定整個緩存

vertices[0] = Vertex(-1.0f, 0.0f, 2.0f); // 向緩存里寫頂點

vertices[1] = Vertex( 0.0f, 1.0f, 2.0f);

vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);

_vb->Unlock(); // 當你訪問完緩存時,解鎖緩存

 

3.1.3 找回頂點和索引緩存信息

有時我們需要得到頂點/索引緩存信息。下面的例子示范了用于獲得這些信息的方法:

D3DVERTEXBUFFER_DESC vbDescription;

_vertexBuffer->GetDesc(&vbDescription); // 取得頂點緩存信息

 

D3DINDEXBUFFER_DESC ibDescription;

_indexBuffer->GetDesc(&ibDescription); //取得索引緩存信息

 

D3DVERTEXBUFFER_DESC和D3DINDEXBUFFER_DESC結構的定義如下:

Describes a vertex buffer.

typedef struct D3DVERTEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
DWORD FVF;
} D3DVERTEXBUFFER_DESC, *LPD3DVERTEXBUFFER_DESC;

Members

Format
Member of the D3DFORMAT enumerated type, describing the surface format of the vertex buffer data.
Type
Member of the D3DRESOURCETYPE enumerated type, identifying this resource as a vertex buffer.
Usage
Combination of one or more D3DUSAGE flags.
Pool
Member of the D3DPOOL enumerated type, specifying the class of memory allocated for this vertex buffer.
Size
Size of the vertex buffer, in bytes.
FVF
Combination of D3DFVF that describes the vertex format of the vertices in this buffer.

Defines resource types.

typedef enum D3DRESOURCETYPE
{
D3DRTYPE_SURFACE = 1,
D3DRTYPE_VOLUME = 2,
D3DRTYPE_TEXTURE = 3,
D3DRTYPE_VOLUMETEXTURE = 4,
D3DRTYPE_CubeTexture = 5,
D3DRTYPE_VERTEXBUFFER = 6,
D3DRTYPE_INDEXBUFFER = 7,
D3DRTYPE_FORCE_DWORD = 0x7fffffff,
} D3DRESOURCETYPE, *LPD3DRESOURCETYPE;

Constants

D3DRTYPE_SURFACE
Surface resource.
D3DRTYPE_VOLUME
Volume resource.
D3DRTYPE_TEXTURE
Texture resource.
D3DRTYPE_VOLUMETEXTURE
Volume texture resource.
D3DRTYPE_CubeTexture
Cube texture resource.
D3DRTYPE_VERTEXBUFFER
Vertex buffer resource.
D3DRTYPE_INDEXBUFFER
Index buffer resource.
D3DRTYPE_FORCE_DWORD
Forces this enumeration to compile to 32 bits in size. Without this value, some compilers would allow this enumeration to compile to a size other than 32 bits. This value is not used.

Describes an index buffer.

typedef struct D3DINDEXBUFFER_DESC {
D3DFORMAT Format;
D3DRESOURCETYPE Type;
DWORD Usage;
D3DPOOL Pool;
UINT Size;
} D3DINDEXBUFFER_DESC, *LPD3DINDEXBUFFER_DESC;

Members

Format
Member of the D3DFORMAT enumerated type, describing the surface format of the index buffer data.
Type
Member of the D3DRESOURCETYPE enumerated type, identifying this resource as an index buffer.
Usage
Combination of one or more of the following flags, specifying the usage for this resource.
D3DUSAGE_DONOTCLIP
Set to indicate that the index buffer content will never require clipping.
D3DUSAGE_DYNAMIC
Set to indicate that the index buffer requires dynamic memory use. This is useful for drivers because it enables them to decide where to place the buffer. In general, static index buffers are placed in video memory and dynamic index buffers are placed in AGP memory. Note that there is no separate static usage; if you do not specify D3DUSAGE_DYNAMIC the index buffer is made static. D3DUSAGE_DYNAMIC is strictly enforced through the D3DLOCK_DISCARD and D3DLOCK_NOOVERWRITE locking flags. As a result, D3DLOCK_DISCARD and D3DLOCK_NOOVERWRITE are only valid on index buffers created with D3DUSAGE_DYNAMIC; they are not valid flags on static vertex buffers.

For more information about using dynamic index buffers, see Using Dynamic Vertex and Index Buffers.

Note that D3DUSAGE_DYNAMIC cannot be specified on managed index buffers. For more information, see Managing Resources (Direct3D 9).

D3DUSAGE_RTPATCHES
Set to indicate when the index buffer is to be used for drawing high-order primitives.
D3DUSAGE_NPATCHES
Set to indicate when the index buffer is to be used for drawing N patches.
D3DUSAGE_POINTS
Set to indicate when the index buffer is to be used for drawing point sprites or indexed point lists.
D3DUSAGE_SOFTWAREPROCESSING
Set to indicate that the buffer is to be used with software processing.
D3DUSAGE_WRITEONLY
Informs the system that the application writes only to the index buffer. Using this flag enables the driver to choose the best memory location for efficient write operations and rendering. Attempts to read from an index buffer that is created with this capability can result in degraded performance.
Pool
Member of the D3DPOOL enumerated type, specifying the class of memory allocated for this index buffer.
Size
Size of the index buffer, in bytes.

posted on 2008-03-14 10:48 lovedday 閱讀(957) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導航

統計

常用鏈接

隨筆分類(178)

3D游戲編程相關鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲国产日韩欧美综合久久| 麻豆精品在线视频| 欧美激情视频网站| 欧美14一18处毛片| 欧美成人午夜| 欧美精品在线免费| 欧美视频亚洲视频| 国产精品三级视频| 国产一区二区无遮挡| 一区二区亚洲欧洲国产日韩| 影音先锋日韩资源| 一本久久综合| 久久国产主播精品| 免费在线国产精品| 亚洲精品女av网站| 一区二区毛片| 亚洲欧美一级二级三级| 这里只有视频精品| 欧美在线视频一区二区三区| 久久夜色精品国产欧美乱极品| 欧美黄色免费网站| 国产乱码精品一区二区三| 在线观看视频一区| 亚洲一区二区三区四区在线观看 | 亚洲视频碰碰| 久久av一区二区三区漫画| 亚洲国产精品高清久久久| 亚洲一区国产一区| 蜜桃视频一区| 国产亚洲精品久| 中文久久精品| 欧美国产精品日韩| 午夜国产精品影院在线观看| 欧美乱在线观看| 激情久久五月| 欧美一区二区免费视频| 亚洲精品永久免费| 免费成年人欧美视频| 国模精品一区二区三区| 亚洲欧美一区二区原创| 91久久精品日日躁夜夜躁欧美 | 亚洲高清免费在线| 欧美主播一区二区三区| 国产精品永久入口久久久| 在线一区二区三区四区| 欧美激情1区2区| 久久久亚洲精品一区二区三区| 国产精品美女主播| 亚洲女优在线| 亚洲欧美激情诱惑| 国产精品久久看| 亚洲免费网站| 亚洲一区二区三区精品在线| 欧美色精品天天在线观看视频| 日韩视频免费在线观看| 亚洲第一精品夜夜躁人人躁| 久久一综合视频| 亚洲第一主播视频| 欧美成人午夜剧场免费观看| 久热这里只精品99re8久| 国产一区二区三区在线观看网站| 小黄鸭视频精品导航| 亚洲免费婷婷| 国产视频一区在线| 久久久精品国产一区二区三区| 亚洲欧美激情视频| 国内精品久久久久久久果冻传媒 | 老司机一区二区| 亚洲欧美另类国产| 亚洲欧美乱综合| 亚洲图片欧美一区| 国产欧美一区二区三区在线老狼 | 久久久人成影片一区二区三区观看| 国产精品亚洲美女av网站| 欧美一区二区三区久久精品茉莉花 | 欧美性猛交一区二区三区精品| 一本久久综合亚洲鲁鲁五月天| 日韩视频在线一区| 国产精品自在在线| 麻豆精品精华液| 欧美激情亚洲国产| 亚洲欧美日韩视频二区| 欧美在线一二三四区| 亚洲国产成人精品视频| 日韩视频在线观看国产| 国产日韩一区二区三区在线播放 | 亚洲一级特黄| 欧美亚洲视频在线观看| 最近中文字幕mv在线一区二区三区四区 | 亚洲视频播放| 午夜精品美女自拍福到在线 | 亚洲人成7777| 亚洲视频一区二区| 一区二区三区在线视频播放| 亚洲黄色一区| 国产乱码精品| 亚洲国产经典视频| 国产欧美日韩视频一区二区| 可以看av的网站久久看| 欧美日韩精品一区二区在线播放| 久久不射2019中文字幕| 裸体丰满少妇做受久久99精品| 亚洲深夜福利视频| 久久一区二区三区四区五区| 亚洲专区欧美专区| 另类av导航| 欧美在线播放| 欧美日韩精品不卡| 欧美福利专区| 国产日韩精品久久| 在线亚洲一区二区| 日韩视频在线一区二区| 久久精品九九| 欧美一区中文字幕| 国产精品v欧美精品v日韩精品| 欧美激情第8页| 国产最新精品精品你懂的| 宅男噜噜噜66国产日韩在线观看| 激情五月婷婷综合| 亚洲一区二区三区精品在线| 99精品免费视频| 久久aⅴ乱码一区二区三区| 欧美精品久久天天躁| 中文亚洲视频在线| 欧美大片免费看| 欧美xxxx在线观看| 国产在线播精品第三| 午夜天堂精品久久久久| 亚洲中字在线| 欧美日韩中文精品| 99精品久久久| 在线亚洲欧美视频| 欧美精品在线视频| 亚洲高清不卡在线| 亚洲精品日产精品乱码不卡| 久久五月天婷婷| 美女91精品| 136国产福利精品导航网址| 久久免费偷拍视频| 欧美国产激情| 亚洲毛片在线免费观看| 欧美精品高清视频| 99综合在线| 午夜在线观看欧美| 国产一区二区三区四区在线观看| 久久精品国产久精国产一老狼 | 久久天天综合| 欧美福利小视频| 日韩午夜在线播放| 欧美日韩在线大尺度| 一区二区三区蜜桃网| 亚洲女性裸体视频| 国产一级揄自揄精品视频| 欧美综合国产精品久久丁香| 老巨人导航500精品| 91久久精品国产91久久性色| 欧美日韩国产三区| 亚洲欧美在线aaa| 久久久www免费人成黑人精品| 先锋影音国产精品| 麻豆视频一区二区| 日韩一区二区福利| 久久精品视频网| 亚洲国产精彩中文乱码av在线播放| 免费观看成人| 在线亚洲免费视频| 久久天天躁狠狠躁夜夜av| 91久久精品美女高潮| 欧美精品免费播放| 亚洲欧美视频一区| 亚洲二区免费| 久久国产精品久久国产精品| 亚洲国产精品久久久久秋霞不卡| 欧美日韩在线免费观看| 欧美伊人久久久久久午夜久久久久 | 午夜精品视频在线观看| 免费不卡视频| 亚洲小少妇裸体bbw| 精品999在线播放| 欧美先锋影音| 女同性一区二区三区人了人一| 亚洲视频电影图片偷拍一区| 欧美电影资源| 久久久久久久久蜜桃| 一本色道久久| 亚洲国产mv| 亚洲精品在线免费观看视频| 在线精品国产成人综合| 中日韩美女免费视频网站在线观看| 久久亚洲春色中文字幕| 欧美制服第一页| 极品尤物一区二区三区| 欧美电影在线免费观看网站| 久久久久久久网| 亚洲国产精品成人va在线观看| 欧美成人一区二区在线| 欧美日韩国产一区精品一区| 国产精品99久久久久久有的能看 | 亚洲一区二区三区高清不卡| 国产精品美女999|