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

天行健 君子當(dāng)自強(qiáng)而不息

Direct3D中的繪制(1)

3.1頂點/索引緩存

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

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

3.1.1創(chuàng)建一個頂點和索引緩存

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

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

);

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

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

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

         D3DUSAGE_DYNAMIC——設(shè)置這個參數(shù)可以使緩存是動態(tài)的。

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

         D3DUSAGE_SOFTWAREPROCESSING——使用軟件頂點處理

         D3DUSAGE_WRITEONLY——指定應(yīng)用程序只能寫緩存。它允許驅(qū)動程序分配最適合的內(nèi)存地址作為寫緩存。注意如果從創(chuàng)建好的這種緩存中讀數(shù)據(jù),將會返回錯誤信息。

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

Pool —— 緩存放置在哪一個內(nèi)存池中

ppVertexBuffer ——返回創(chuàng)建好的頂點緩存的指針。

pSharedHandle ——沒有使用;設(shè)置為0。

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

ppIndexBuffer ——返回創(chuàng)建好的索引緩存的指針。

 

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

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

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

下邊是創(chuàng)建一個靜態(tài)頂點緩存的例子,該緩存能存儲8個頂點。

IDirect3DVertexBuffer9* vb;

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

 

3.1.2 訪問緩沖內(nèi)存

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

HRESULT IDirect3DVertexBuffer9::Lock(

       UINT OffsetToLock,

       UINT SizeToLock,

       BYTE** ppbData,

       DWORD Flags

);

HRESULT IDirect3DIndexBuffer9::Lock(

       UINT OffsetToLock,

       UINT SizeToLock,

       BYTE** ppbData,

       DWORD Flags

);

 

 

這兩個方法的參數(shù)都是完全相同的。

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

 

SizeToLock —— 鎖定的字節(jié)數(shù)。

ppbData —— 一個指向鎖定內(nèi)存開始位置的指針。

Flags —— 標(biāo)記描述怎樣鎖定內(nèi)存。它可能是0或者是下面參數(shù)中的1個或多個的組合:

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

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

       D3DLOCK_READONLY——這個參數(shù)聲明你鎖定的緩存只能從中讀取數(shù)據(jù)而不能寫數(shù)據(jù)。這允許一些內(nèi)在的優(yōu)化。

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

       下邊的例子展示了通常怎樣使用Lock方法。注意當(dāng)我們使用完以后要調(diào)用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(); // 當(dāng)你訪問完緩存時,解鎖緩存

 

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

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

D3DVERTEXBUFFER_DESC vbDescription;

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

 

D3DINDEXBUFFER_DESC ibDescription;

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

 

D3DVERTEXBUFFER_DESC和D3DINDEXBUFFER_DESC結(jié)構(gòu)的定義如下:

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)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


公告

導(dǎo)航

統(tǒng)計

常用鏈接

隨筆分類(178)

3D游戲編程相關(guān)鏈接

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美亚洲三区| 亚洲黄色一区| 六月婷婷久久| 久久网站热最新地址| 欧美一二三区精品| 久久精品网址| 欧美大片免费看| 国产中文一区| 欧美日韩在线播放一区二区| 欧美久久一区| 国产精品成人av性教育| 国产精品久久久久9999高清| 国产精品久久久久久久午夜| 国产伦精品一区二区三区高清| 久久精品在线视频| 亚洲第一视频| 老司机午夜精品视频在线观看| 麻豆国产精品va在线观看不卡 | 久久久久久午夜| 蜜臀av性久久久久蜜臀aⅴ| 欧美视频一区在线观看| 国产一区二区你懂的| 亚洲国产日韩欧美一区二区三区| av成人激情| 久久精品国产99| 欧美高清在线视频| 亚洲一区免费| 老司机aⅴ在线精品导航| 国产精品久久毛片a| 亚洲精品久久7777| 久久久综合免费视频| 日韩一级在线观看| 久久久免费av| 国产精品综合| 一本大道av伊人久久综合| 久久久精品2019中文字幕神马| 亚洲精品一二三区| 久久婷婷丁香| 国产欧美在线观看一区| 夜色激情一区二区| 麻豆精品视频| 欧美一区日本一区韩国一区| 欧美视频一区二区| 日韩视频永久免费| 久久精品中文字幕一区| 在线一区欧美| 欧美成人资源| 亚洲国产精品99久久久久久久久| 欧美一区二区三区久久精品| 日韩系列在线| 欧美成人一区二区在线| 亚洲成人在线网站| 亚洲欧美国产制服动漫| 亚洲精品国产视频| 欧美精品一区二区蜜臀亚洲| 亚洲国产婷婷综合在线精品 | 一本色道久久99精品综合| 欧美插天视频在线播放| 亚洲精选91| 久久久久免费| 欧美日韩精品系列| 91久久久久久| 男女精品视频| 欧美成人日韩| 一区二区三区日韩欧美| 亚洲人成网站精品片在线观看| 久久伊人精品天天| 亚洲日本精品国产第一区| 欧美大片一区| 欧美精品亚洲| 午夜精品美女久久久久av福利| av72成人在线| 国产精品女主播在线观看| 欧美一区网站| 久久久久久有精品国产| 亚洲精品女人| 中国亚洲黄色| 国产亚洲一区二区三区| 猛男gaygay欧美视频| 久久免费视频在线| 亚洲人成欧美中文字幕| 亚洲日本中文字幕区| 国产精品久久久亚洲一区 | 欧美成人精品不卡视频在线观看| 久久久国际精品| 日韩视频不卡| 一区二区欧美精品| 国产拍揄自揄精品视频麻豆| 久久亚洲精品一区| 欧美日韩成人在线播放| 久久国产日韩| 欧美精品亚洲精品| 久久精品2019中文字幕| 欧美大片18| 欧美一区二区三区视频免费| 久久久精品一区| 亚洲资源av| 免费在线成人av| 久久超碰97人人做人人爱| 免费一级欧美片在线观看| 亚洲在线视频观看| 老妇喷水一区二区三区| 亚洲欧美日韩电影| 免费视频一区| 亚洲欧美制服另类日韩| 久久婷婷国产综合尤物精品| 亚洲永久在线| 欧美国产一区二区| 久久精品国产亚洲aⅴ| 欧美日韩国产成人在线| 美国三级日本三级久久99| 欧美日韩在线第一页| 蜜桃伊人久久| 国产亚洲精品久久久久婷婷瑜伽| 亚洲人成免费| 亚洲国产精品久久精品怡红院 | 欧美韩国一区| 免费不卡在线观看av| 国产精品综合不卡av| 一区二区电影免费在线观看| 亚洲精品一区二区三区四区高清| 国产精品视频yy9099| 亚洲高清自拍| 在线观看欧美日韩国产| 亚洲欧美视频在线| 亚洲欧美精品伊人久久| 欧美韩日视频| 免费成人av| …久久精品99久久香蕉国产| 久久国产手机看片| 久久国产欧美| 国产在线国偷精品产拍免费yy| 亚洲视频在线观看视频| 亚洲自拍另类| 欧美色精品天天在线观看视频| 最新亚洲视频| 亚洲视频精品| 欧美日韩一区二区三区免费看| 亚洲人成人一区二区在线观看| 亚洲剧情一区二区| 欧美日韩国产成人精品| 夜夜嗨av一区二区三区| 亚洲综合清纯丝袜自拍| 国产精品人人爽人人做我的可爱| 在线亚洲美日韩| 欧美在现视频| 狠狠色香婷婷久久亚洲精品| 久久精品日产第一区二区三区 | 在线一区二区三区做爰视频网站| 亚洲视频大全| 国产精品一区二区久久久久| 亚洲女性裸体视频| 久久嫩草精品久久久久| 亚洲国产美女| 欧美日本国产精品| 亚洲午夜一区二区三区| 久久国产精品毛片| 亚洲成在人线av| 欧美日本不卡高清| 午夜精品99久久免费| 欧美成熟视频| 一区二区高清在线观看| 国产精品一卡| 麻豆av一区二区三区| 亚洲美女尤物影院| 久久久av水蜜桃| 日韩午夜一区| 国产亚洲亚洲| 欧美日本韩国一区| 午夜精品视频在线观看| 欧美福利专区| 欧美一区二区视频在线观看| 亚洲国内自拍| 国产噜噜噜噜噜久久久久久久久 | 国产精品99久久不卡二区| 久久久999成人| 一区二区av| 尤物九九久久国产精品的特点 | 美脚丝袜一区二区三区在线观看| 亚洲精品欧美一区二区三区| 欧美亚洲视频| 99在线精品视频| 悠悠资源网亚洲青| 国产精品亚洲аv天堂网| 免费看的黄色欧美网站| 一区二区三区精品| 久久亚洲午夜电影| 亚洲六月丁香色婷婷综合久久| 欧美一区二区三区婷婷月色| 亚洲精选久久| 精品成人免费| 国产日韩久久| 国产精品乱码一区二三区小蝌蚪| 免费视频亚洲| 久久久久国产精品厨房| 亚洲欧美日韩一区在线| 亚洲乱码国产乱码精品精可以看 | 久久手机免费观看| 亚洲色图自拍| 亚洲乱码久久|