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

posts - 16,  comments - 81,  trackbacks - 0
        首先向大家道歉自3出了以后隔這么久才出4,一方面過年期間我天天在外面走親戚,另一方面我最近確實(shí)有些消沉,我不是個(gè)會(huì)太監(jiān)的人,卻總是有時(shí)會(huì)陷入一種消沉的狀態(tài),因?yàn)橄霃能浖袠I(yè)轉(zhuǎn)型,碰了許多壁,關(guān)起門來看龍書和算法導(dǎo)論,基本保持不上網(wǎng)狀態(tài),偶爾手機(jī)上上人人網(wǎng)分享點(diǎn)日志。

        我也知道我的文章并不是多么的不可或缺,沒了這個(gè)翻譯大家照樣過,目前為止基本都是些入門類的東西,有時(shí)候我會(huì)想到曾小賢的午夜節(jié)目,那個(gè)夜晚被胡一非痛罵才明白原來自己做的并不是沒有意義,消沉的這段時(shí)間,看到陸續(xù)還有幾個(gè)網(wǎng)友留言鼓勵(lì)我,我真的非常感謝你們,我不是什么大神,也不是什么天才,我高數(shù)重修了兩遍才過,非是不努力而是真的智力不足學(xué)起來比別人要多花幾倍的時(shí)間,但我只是一直努力著,欠了38個(gè)學(xué)分的時(shí)候我沒有選擇提前留級(jí)(如果學(xué)年結(jié)束時(shí)欠了36分以上會(huì)退學(xué)),我苦行僧般地過了下半學(xué)年勉強(qiáng)保住不留級(jí)(24學(xué)分),剛來上海的時(shí)候我是C盲(之前一直搞WEB),沒有數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)不懂STL但我還是撐過來了,四個(gè)月以后輕松地完成工作,八個(gè)月以后我覺得我們的代碼到處是問題,不管遇到怎樣的困境,我從來沒有放棄過,就像我經(jīng)常消沉但我總會(huì)走出來結(jié)束太監(jiān)狀態(tài),希望在看這篇翻譯的你,無(wú)論在技術(shù)還是生活上,永遠(yuǎn)不要輕言放棄,不管在怎樣的困境,只要有1%的希望,就值得我們拼盡全力去爭(zhēng)取,人之所以能戰(zhàn)勝神,是因?yàn)槲覀兿嘈胖钠孥E。

課程概述

      有一個(gè)簡(jiǎn)單的方式來學(xué)習(xí)的DirectX。杯具的是,簡(jiǎn)單的方法往往有很多功能上的限制,即使沒有,在一個(gè)比較大型的游戲使用它仍然會(huì)很麻煩。當(dāng)然,更簡(jiǎn)單的 方法是,努力地學(xué)習(xí),本教程會(huì)盡量寫得更易于編程,以便不使理論的部分太艱深晦澀。
在本節(jié)中,您將學(xué)習(xí)如何在屏幕上畫一個(gè)三角形。我們將通過創(chuàng)造一系列頂點(diǎn)來構(gòu)建三角并通過Direct3D設(shè)備在屏幕上繪制之。
     首先,我們將涵蓋如何工作的,那么我們將在代碼本身和生成程序的理論。

靈活頂點(diǎn)格式(Flexible Vertex Formats)

        如果您完成了第3課中的學(xué)習(xí),你會(huì)記得頂點(diǎn)的定義:一個(gè)確定在在三維空間中的點(diǎn)的精確位置和屬性。位置只包含三個(gè)坐標(biāo)數(shù)值以描述頂點(diǎn)在空間中的位置。頂點(diǎn)的屬性也用數(shù)值定義。
        Direct3D使用一種稱為靈活頂點(diǎn)格式(Flexible Vertex Format簡(jiǎn)稱FVF)的技術(shù)。該技術(shù)中一個(gè)頂點(diǎn)格式包含一個(gè)頂點(diǎn)的位置和多個(gè)屬性數(shù)據(jù)。一個(gè)FVF頂點(diǎn)會(huì)是一個(gè)格式化的數(shù)據(jù),您可以根據(jù)您的需要修改和設(shè)置。讓我們來看看究竟丫是如何工作的。
頂點(diǎn)可以用一個(gè)結(jié)構(gòu)體來描述,它包含所有與創(chuàng)建該3D圖像有關(guān)的數(shù)據(jù)。為了展示這個(gè)圖像,我們要把所有的信息復(fù)制到視頻RAM,然后讓Direct3D來復(fù)制數(shù)據(jù)到后臺(tái)緩沖區(qū)。然而,如果我們不得不把一個(gè)頂點(diǎn)所有可能需要的數(shù)據(jù)發(fā)送過去會(huì)怎樣呢?如下圖所示。


Image 4.1 - 一個(gè)頂點(diǎn)格式包含了所有的信息

        當(dāng)然,你可能不會(huì)馬上看到這兒有什么問題,但讓我們不得不說我們只需要這些信息中的兩塊。我們可以看到將其發(fā)送到視頻RAM會(huì)快得多,就像這樣:


Image 4.2 – FVF格式會(huì)快得多

      這就是在我們使用FVF時(shí)發(fā)生的。我們選擇我們要使用的信息,并發(fā)送之,這樣就可以使我們?cè)诿繋g發(fā)送更多的頂點(diǎn)。

 

FVF 代碼

        在Direct3D中,每個(gè)頂點(diǎn)都是預(yù)先設(shè)定好的頂點(diǎn)格式。正如標(biāo)題聲稱,這種格式是靈活的,是使用的Direct3D提供的某些元素。這些元素通過使用特殊標(biāo)識(shí)來設(shè)置,比如何時(shí)邏輯或在一起,創(chuàng)建一個(gè)頂點(diǎn)的定義,或一個(gè)告訴Direct3D頂點(diǎn)格式代碼的。
        讓我們來看看它如何做到這一點(diǎn)。比方說,我們希望包括位置和我們的頂點(diǎn)漫反射顏色。我們將建立一個(gè)代碼:

#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

        稍后,我們將簡(jiǎn)單地使用CUSTOMFVF,而不是每次都輸出整個(gè)FVF代碼。我們將在一分鐘后來看這樣的一個(gè)例子。
我們可以在這個(gè)表達(dá)式里添加各種標(biāo)識(shí)。以下是一組貫穿本套教程始終的標(biāo)識(shí)表,以及他們做什么的說明。

 

[Table 4.1 - FVF Code Flags]

標(biāo)識(shí)

描述

參數(shù)類型

D3DFVF_XYZ

表示該頂點(diǎn)格式包括X,Y和Z的一個(gè)未轉(zhuǎn)換的頂點(diǎn)坐標(biāo)。未轉(zhuǎn)化意味著頂點(diǎn)尚未轉(zhuǎn)化為屏幕坐標(biāo)。

float, float, float

D3DFVF_XYZRHW

表示該頂點(diǎn)格式包括X,Y和Z坐標(biāo)以及一個(gè)轉(zhuǎn)換過的額外的RHW值。這意味著頂點(diǎn)已經(jīng)在屏幕坐標(biāo)系。Z和RHW會(huì)在構(gòu)建軟件引擎時(shí)使用,我們不會(huì)進(jìn)入。

float, float, float, float

D3DFVF_DIFFUSE

表示頂點(diǎn)格式包含一個(gè)32位顏色代碼,用于表示漫射光顏色。

DWORD

D3DFVF_SPECULAR

表示頂點(diǎn)格式包含一個(gè)32位顏色代碼,用于鏡面高亮使用的顏色。

DWORD

D3DFVF_TEX0
   through
D3DFVF_TEX8

表示頂點(diǎn)格式包含任何將被應(yīng)用到模型紋理坐標(biāo)。

float, float

[Close Table]

 

 


       當(dāng)然了,還有更多的標(biāo)識(shí)沒有被提及,它們已經(jīng)是包含在DirectX文檔中了。而我們只需要本教程中使用到的這些標(biāo)識(shí)。

 

創(chuàng)建頂點(diǎn)

       現(xiàn)在我們需要使用我們的新格式創(chuàng)建頂點(diǎn)。我們不使用任何新函數(shù)或諸如此類的東西,我們通過建立一個(gè)簡(jiǎn)單的結(jié)構(gòu)體裝入FVF代碼中包含的變量。
       例如,我們用在上面的例子用D3DFVF_XYZRHW和D3DFVF_DIFFUSE兩個(gè)標(biāo)識(shí)一起的話,我們應(yīng)該建立如下結(jié)構(gòu):

struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw;    
// from the D3DFVF_XYZRHW flag
    DWORD color;    // from the D3DFVF_DIFFUSE flag
}

         如你所見,前四個(gè)浮點(diǎn)數(shù)是D3DFVF_XYZRHW標(biāo)識(shí)的值,而DWORD是D3DFVF_DIFFUSE標(biāo)識(shí)的值。如果您看看上表,你會(huì)發(fā)現(xiàn)這其中的變量類型與FVF標(biāo)識(shí)。
       現(xiàn)在,讓我們使用我們的新CUSTOMVERTEX結(jié)構(gòu)來構(gòu)建一個(gè)實(shí)際的頂點(diǎn)。我們可以像下面這樣做:

CUSTOMVERTEX OurVertex = {320.0f50.0f1.0f1.0f, D3DCOLOR_XRGB(00255)};

    當(dāng)然了,你也可以弄個(gè)頂點(diǎn)數(shù)組,就像這樣:

CUSTOMVERTEX OurVertices[] =
{
    
{320.0f50.0f1.0f1.0f, D3DCOLOR_XRGB(00255),},
    
{520.0f400.0f1.0f1.0f, D3DCOLOR_XRGB(02550),},
    
{120.0f400.0f1.0f1.0f, D3DCOLOR_XRGB(25500),},
}
;

        結(jié)果會(huì)是一個(gè)三角形,我們很快會(huì)在屏幕上看到。

          這僅僅是一個(gè)靈活頂點(diǎn)格式的示例。我們稍后會(huì)繼續(xù)就如何建立更復(fù)雜的頂點(diǎn)格式,恩,就從現(xiàn)在開始吧。

頂點(diǎn)緩存


        現(xiàn)在,我們已經(jīng)完成了兩件事情。首先,我們建立了FVF代碼。第二,我們已經(jīng)創(chuàng)建了一個(gè)三角形。現(xiàn)在我們需要得到那個(gè)三角形以準(zhǔn)備給Direct3D使用。要做到這一點(diǎn),我們創(chuàng)建了所謂的頂點(diǎn)緩沖區(qū)。
        一個(gè)頂點(diǎn)緩沖區(qū)是一個(gè)簡(jiǎn)單的接口,它存儲(chǔ)在一段內(nèi)存中(顯存或內(nèi)存),以持有你的游戲中頂點(diǎn)或模型的信息。我們通過函數(shù)CreateVertexBuffer()來創(chuàng)建這個(gè)接口。不過它的參數(shù)有點(diǎn)復(fù)雜。下面是函數(shù)原型:

HRESULT CreateVertexBuffer(
    UINT Length,
    DWORD Usage,
    DWORD FVF,
    D3DPOOL Pool,
    LPDIRECT3DVERTEXBUFFER9 ppVertexBuffer,
    HANDLE
* pSharedHandle);

         我們來逐個(gè)分析一下這些個(gè)參數(shù) 

UINT Length,

    這個(gè)參數(shù)包含將要?jiǎng)?chuàng)建的頂點(diǎn)緩存的大小。我們得到將存儲(chǔ)在緩沖區(qū)中的頂點(diǎn)數(shù)目乘以一個(gè)頂點(diǎn)大小的結(jié)果。例如,一個(gè)三角形包含三個(gè)頂點(diǎn),因此該三角形的緩沖區(qū)大小是:3* sizeof(CUSTOMVERTEX)。 

DWORD Usage,

    有時(shí)候,有些特殊的方法能改變DirectX處理的頂點(diǎn)集。在本教程我們不會(huì)深入討論這些。這個(gè)參數(shù)可以包含標(biāo)志表明這些特殊的方式。因?yàn)槲覀儾粫?huì)使用任何所以我們只要把它設(shè)置為0。 

DWORD FVF,

    這是FVF代碼中我們接觸得比較早的。我們只需填寫CUSTOMFVF。如果我們要改變FVF代碼,這部分也將改變(改變那個(gè)#define)。這是告訴DirectX頂點(diǎn)是什么格式了,這個(gè)參數(shù)很重要。 

D3DPOOL Pool,

    這個(gè)參數(shù)告訴Direct3D在哪創(chuàng)建頂點(diǎn)緩存以及如何創(chuàng)建之。以下是一個(gè)表,說明該參數(shù)的可能的條目。在本教程中,我們將使用標(biāo)志D3DPOOL_MANAGED。
 

[Table 4.2 - D3DPOOL Values]

描述

D3DPOOL_DEFAULT

此標(biāo)志表示該緩存應(yīng)該創(chuàng)建在最適當(dāng)?shù)膬?nèi)存以便設(shè)置和資源可用。然而,強(qiáng)加一些限制并不總是對(duì)游戲有好處。

D3DPOOL_MANAGED

這表明,緩沖將在位于顯存

D3DPOOL_SYSTEMMEM

這表明,緩存將在系統(tǒng)內(nèi)存中。頂點(diǎn)緩存設(shè)在這里通常不能由Direct3D設(shè)備訪問,但可以通過其他更高級(jí)的手段訪問。

D3DPOOL_SCRATCH

這也表明了緩存將坐落在系統(tǒng)內(nèi)存中,但是,又沒有辦法讓顯存訪問它。這種類型一般用于存儲(chǔ)圖像信息,現(xiàn)在我們用不到(但稍后將使用),比如屏幕已經(jīng)轉(zhuǎn)到另一個(gè)地圖但角色暫時(shí)還沒有到達(dá)(不久后就到)。

[Close Table]

 


LPDIRECT3DVERTEXBUFFER9 ppVertexBuffer,   

    如果你理解它,那我告訴你它是我們正在創(chuàng)建的頂點(diǎn)緩存的接口。我們給這個(gè)參數(shù)一個(gè)空指針,函數(shù)會(huì)給他賦值。
 

HANDLE* pSharedHandle

      文檔里說過這個(gè)參數(shù),我引述一下:“保留。設(shè)置這個(gè)參數(shù)為NULL。“我不能說肯定,但顯然微軟希望我們將其設(shè)置為NULL。就這樣吧。我們將它設(shè)置為NULL。
      看完這些參數(shù),讓我們來看看這個(gè)功能在我們的程序中如何寫: 

LPDIRECT3DVERTEXBUFFER9 v_buffer;

d3ddev
->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                           
0,
                           CUSTOMFVF,
                           D3DPOOL_MANAGED,
                           
&v_buffer,
                           NULL);

        現(xiàn)在您已經(jīng)創(chuàng)建了頂點(diǎn)緩存,下面你需要把頂點(diǎn)加載進(jìn)去。你用一個(gè)簡(jiǎn)單的函數(shù)memcpy()就可以完成。但是,在您訪問到頂點(diǎn)緩存之前,你需要將其鎖定。
        基于兩個(gè)原因,你需要鎖定這個(gè)緩存。首先,你需要告訴Direct3D你需要內(nèi)存的完全控制權(quán)。換句話說,它不應(yīng)該由任何可能的其他進(jìn)程使用。第二,你需要告訴視頻硬件別動(dòng)它。否則可沒法保證顯存保持不動(dòng)。鎖定告訴顯存與內(nèi)存當(dāng)你正在使用它時(shí)別干蠢事兒。
        要鎖定一個(gè)緩沖區(qū),可以使用函數(shù)Lock(),它有四個(gè)參數(shù),但都相當(dāng)簡(jiǎn)單:

HRESULT Lock(UINT OffsetToLock,
             UINT SizeToLock,
             VOID
** ppbData,
             DWORD Flags);

   讓我們來看看這些參數(shù): 

UINT OffsetToLock, UINT SizeToLock,

如果我們只是想鎖定我們的頂點(diǎn)緩沖的一部分,我們將表明在這兩個(gè)參數(shù)。第一個(gè)指示自緩存的起始點(diǎn)到開始鎖定位置的偏移量,以字節(jié)為單位。第二個(gè)表示多少字節(jié)被鎖定。因?yàn)槲覀儸F(xiàn)在要鎖定整個(gè)緩沖區(qū),所以我們將設(shè)置這些都為0。 

VOID** ppbData, 

    除非你是至少中等水平以上的C+ +,否則這個(gè)參數(shù)您老還是別動(dòng)了。基本上這是一個(gè)void*指針并且沒有指向特定類型的變量。例如,一個(gè)**double,而一個(gè)int*指向一個(gè)int。每個(gè)指針類型都有它自己的格式,因此它不能轉(zhuǎn)換不會(huì)丟失數(shù)據(jù)為另一種類型。但是一個(gè)void *指針,卻可以轉(zhuǎn)換為任何類型。
    在這里,我們有一個(gè)空指針*.這個(gè)指針被鎖定的存數(shù)去起始位置的指針。頂點(diǎn)緩沖區(qū)接口會(huì)處理其細(xì)節(jié),但我們?cè)谙乱徊綍?huì)需要這個(gè)指針。所以函數(shù)lock()函數(shù)將填充恰當(dāng)?shù)牡刂方o這個(gè)指針。有一個(gè)在下面的例子,看看我們?nèi)绾翁钛a(bǔ)這個(gè)參數(shù)。

DWORD Flags 

        這是一個(gè)很高級(jí)的參數(shù),我們不會(huì)在本教程中深入。本上它提供特殊的方式來處鎖定內(nèi)存。如果你是真正感興趣的,它們可以研究在DirectX文檔。現(xiàn)在,我們只是將它設(shè)置為0。

       讓我們來補(bǔ)完這個(gè)函數(shù),看看它的樣子:

VOID* pVoid;    // the void* we were talking about

v_buffer
->Lock(00, (void**)&pVoid, 0);    // locks v_buffer, the buffer we made earlier

   接下來,我們調(diào)用memcpy()復(fù)制頂點(diǎn)到頂點(diǎn)緩存。

memcpy(pVoid, OurVertices, sizeof(OurVertices));    // copy vertices to the vertex buffer

       最后,我們還有一個(gè)非常復(fù)雜的函數(shù):Unlock()。這個(gè)函數(shù)沒有參數(shù)。它所做的是告訴Direct3D,跟內(nèi)存搞完了,解開束縛吧。寫起來像這樣:

v_buffer->Unlock();    // unlock v_buffer

    由于我們剛剛得知命令的數(shù)量,我們要把我們自己創(chuàng)建的功能放進(jìn)一個(gè)單獨(dú)的函數(shù)里init_graphics()。

void init_graphics(void)
{
    
// create three vertices using the CUSTOMVERTEX struct built earlier
    CUSTOMVERTEX vertices[] =
    
{
        
320.0f50.0f0.5f1.0f, D3DCOLOR_XRGB(00255), },
        
520.0f400.0f0.5f1.0f, D3DCOLOR_XRGB(02550), },
        
120.0f400.0f0.5f1.0f, D3DCOLOR_XRGB(25500), },
    }
;

    
// create the vertex and store the pointer into v_buffer, which is created globally
    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
                               
0,
                               CUSTOMFVF,
                               D3DPOOL_MANAGED,
                               
&v_buffer,
                               NULL);

    VOID
* pVoid;    // the void pointer

    v_buffer
->Lock(00, (void**)&pVoid, 0);    // lock the vertex buffer
    memcpy(pVoid, vertices, sizeof(vertices));    // copy the vertices to the locked buffer
    v_buffer->Unlock();    // unlock the vertex buffer
}

      在這里,我建議您多讀幾次以確保你徹底明白了這一切。這是3D編程中一個(gè)相當(dāng)關(guān)鍵的的部分,我們將在教程的休息時(shí)間使用和修改它。
 

繪制圖元

         現(xiàn)在,我們實(shí)際上已經(jīng)獲得屏幕上的內(nèi)容!但在此發(fā)生之前我們有三個(gè)非常簡(jiǎn)單的函數(shù)要認(rèn)識(shí)一下。每一個(gè)被從Direct3D設(shè)備接口調(diào)用。讓我們來看看。

SetFVF()

        這些函數(shù)的第一個(gè)是SetFVF()。 SetFVF()是一種告訴Direct3D使用當(dāng)前使用什么樣的FVF代碼的函數(shù)。我們當(dāng)然可以有多個(gè)FVF代碼并使用在兩個(gè)不同的三維場(chǎng)景。在我們開始畫之前,我們只需要告訴我們的Direct3D使用的是哪一個(gè)。這個(gè)函數(shù)寫出來是這樣的:

d3ddev->SetFVF(CUSTOMFVF);

SetStreamSource()

    下一步,我們的函數(shù)SetStreamSource(),它告訴Direct3D我們從哪個(gè)頂點(diǎn)緩沖取頂點(diǎn)。這其中有一對(duì)參數(shù),讓我們來看看函數(shù)原型:

HRESULT SetStreamSource(UINT StreamNumber,
                        LPDIRECT3DVERTEXBUFFER9 pStreamData,
                        UINT OffsetInBytes,
                        UINT Stride);

    第一個(gè)參數(shù)是要用的頂點(diǎn)緩存的序號(hào)。我們稍后深入它的工作原理,但現(xiàn)在將它設(shè)置為0,因?yàn)槲覀冎挥幸粋€(gè)頂點(diǎn)緩沖區(qū)。
    第二個(gè)參數(shù)是指向我們先前創(chuàng)建的頂點(diǎn)緩存的指針。
    第三個(gè)參數(shù)指應(yīng)該從頂點(diǎn)緩沖的第幾個(gè)字節(jié)開始。這通常是0。
    最后一個(gè)參數(shù)是每個(gè)頂點(diǎn)的大小。我們填寫如下: SizeOf(CUSTOMVERTEX)。
    讓我們來看看在函數(shù)怎樣被調(diào)用:

d3ddev->SetStreamSource(0, v_buffer, 0sizeof(CUSTOMVERTEX));

DrawPrimitive()

       現(xiàn)在我們已經(jīng)告訴Direct3D我們正在使用哪種格式的頂點(diǎn)以及哪里得到它們,我們告訴它請(qǐng)繪制我們已經(jīng)建立的頂點(diǎn)。這個(gè)函數(shù)繪制在選定的頂點(diǎn)緩存的圖元到屏幕上。這里是函數(shù)原型:

HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType,
                      UINT StartVertex,
                      UINT PrimitiveCount);

    第一個(gè)參數(shù)是使用的圖元類型。這些在第3課已經(jīng)講過了,但所用的代碼在這里: 

[Table 4.3 - D3DPRIMITIVETYPE Values]

Value

Description

D3DPT_POINTLIST

點(diǎn)陣

D3DPT_LINELIST

線列表

D3DPT_LINESTRIP

線帶

D3DPT_TRIANGLELIST

三角形列表

D3DPT_TRIANGLESTRIP

三角形帶

D3DPT_TRIANGLEFAN

三角扇形

[Close Table]

 


       第二個(gè)參數(shù)是我們要繪制在屏幕上的第一個(gè)頂點(diǎn)的序號(hào)。如果我們?cè)敢猓覀兛梢栽陧旤c(diǎn)緩沖區(qū)的中間開始。但是,現(xiàn)在我們希望繪制整個(gè)緩沖區(qū),因此我們將在這里把0。
        第三個(gè)也是最后一個(gè)參數(shù)是我們要繪制圖元的數(shù)量。如果我們要畫一個(gè)三角形,我們?cè)O(shè)1(只有一個(gè)三角形)。如果我們畫點(diǎn),我們會(huì)設(shè)為3,有三點(diǎn)。畫線條也是設(shè)為3。
        現(xiàn)在讓我們來看看整個(gè)render_frame()函數(shù),現(xiàn)在我們已經(jīng)修改了它。

// this is the function used to render a single frame
void render_frame(void)
{
    d3ddev
->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(000), 1.0f0);

    d3ddev
->BeginScene();

        
// select which vertex format we are using
        d3ddev->SetFVF(CUSTOMFVF);

        
// select the vertex buffer to display

        d3ddev->SetStreamSource(0, v_buffer, 0sizeof(CUSTOMVERTEX));

        
// copy the vertex buffer to the back buffer

        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 01);

    d3ddev
->EndScene();

    d3ddev
->Present(NULL, NULL, NULL, NULL);
}


        在看整個(gè)程序之前,先來看看最后一個(gè)步驟是很有必要的。

釋放頂點(diǎn)緩存

        就像Direct3D設(shè)備和Direct3D一樣,頂點(diǎn)緩沖區(qū)也必須在程序關(guān)閉之前被釋放。

// this is the function that cleans up Direct3D and COM
void cleanD3D(void)
{
    v_buffer
->Release();    // close and release the vertex buffer
    d3ddev->Release();    // close and release the 3D device
    d3d->Release();    // close and release Direct3D
}

 

         現(xiàn)在讓我們來看看整個(gè)程序,看看我們都干了什么。


最終代碼

        好吧,讓我們來看看這個(gè)三角長(zhǎng)啥樣。如果你從來沒有見過三角形,這將是一個(gè)教育的經(jīng)驗(yàn)。否則你可以看到一個(gè)三角形是made in Direct3D。
       無(wú)論如何,讓我們來看看最后的DirectX代碼。在本課程中所涵蓋的新的部分像往常是加粗的。

  1// include the basic windows header files and the Direct3D header file
  2#include <windows.h>
  3#include <windowsx.h>
  4#include <d3d9.h>
  5
  6// define the screen resolution
  7#define SCREEN_WIDTH 800
  8#define SCREEN_HEIGHT 600
  9
 10// include the Direct3D Library file
 11#pragma comment (lib, "d3d9.lib")
 12
 13// global declarations
 14LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
 15LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
 16LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer
 17
 18// function prototypes
 19void initD3D(HWND hWnd);    // sets up and initializes Direct3D
 20void render_frame(void);    // renders a single frame
 21void cleanD3D(void);    // closes Direct3D and releases memory
 22void init_graphics(void);    // 3D declarations
 23
 24struct CUSTOMVERTEX {FLOAT X, Y, Z, RHW; DWORD COLOR;};
 25#define CUSTOMFVF (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

 26
 27// the WindowProc function prototype
 28LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 29
 30
 31// the entry point for any Windows program
 32int WINAPI WinMain(HINSTANCE hInstance,
 33                   HINSTANCE hPrevInstance,
 34                   LPSTR lpCmdLine,
 35                   int nCmdShow)
 36{
 37    HWND hWnd;
 38    WNDCLASSEX wc;
 39
 40    ZeroMemory(&wc, sizeof(WNDCLASSEX));
 41
 42    wc.cbSize = sizeof(WNDCLASSEX);
 43    wc.style = CS_HREDRAW | CS_VREDRAW;
 44    wc.lpfnWndProc = WindowProc;
 45    wc.hInstance = hInstance;
 46    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
 47    wc.lpszClassName = L"WindowClass";
 48
 49    RegisterClassEx(&wc);
 50
 51    hWnd = CreateWindowEx(NULL,
 52                          L"WindowClass",
 53                          L"Our Direct3D Program",
 54                          WS_OVERLAPPEDWINDOW,
 55                          00,
 56                          SCREEN_WIDTH, SCREEN_HEIGHT,
 57                          NULL,
 58                          NULL,
 59                          hInstance,
 60                          NULL);
 61
 62    ShowWindow(hWnd, nCmdShow);
 63
 64    // set up and initialize Direct3D
 65    initD3D(hWnd);
 66
 67    // enter the main loop:
 68
 69    MSG msg;
 70
 71    while(TRUE)
 72    {
 73        while(PeekMessage(&msg, NULL, 00, PM_REMOVE))
 74        {
 75            TranslateMessage(&msg);
 76            DispatchMessage(&msg);
 77        }

 78
 79        if(msg.message == WM_QUIT)
 80            break;
 81
 82        render_frame();
 83    }

 84
 85    // clean up DirectX and COM
 86    cleanD3D();
 87
 88    return msg.wParam;
 89}

 90
 91
 92// this is the main message handler for the program
 93LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
 94{
 95    switch(message)
 96    {
 97        case WM_DESTROY:
 98            {
 99                PostQuitMessage(0);
100                return 0;
101            }
 break;
102    }

103
104    return DefWindowProc (hWnd, message, wParam, lParam);
105}

106
107
108// this function initializes and prepares Direct3D for use
109void initD3D(HWND hWnd)
110{
111    d3d = Direct3DCreate9(D3D_SDK_VERSION);
112
113    D3DPRESENT_PARAMETERS d3dpp;
114
115    ZeroMemory(&d3dpp, sizeof(d3dpp));
116    d3dpp.Windowed = TRUE;
117    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
118    d3dpp.hDeviceWindow = hWnd;
119    d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
120    d3dpp.BackBufferWidth = SCREEN_WIDTH;
121    d3dpp.BackBufferHeight = SCREEN_HEIGHT;
122
123    // create a device class using this information and the info from the d3dpp stuct
124    d3d->CreateDevice(D3DADAPTER_DEFAULT,
125                      D3DDEVTYPE_HAL,
126                      hWnd,
127                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
128                      &d3dpp,
129                      &d3ddev);
130
131    init_graphics();    // call the function to initialize the triangle
132}

133
134
135// this is the function used to render a single frame
136void render_frame(void)
137{
138    d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(000), 1.0f0);
139
140    d3ddev->BeginScene();
141
142        // select which vertex format we are using
143        d3ddev->SetFVF(CUSTOMFVF);
144

145        // select the vertex buffer to display

146        d3ddev->SetStreamSource(0, v_buffer, 0sizeof(CUSTOMVERTEX));
147

148        // copy the vertex buffer to the back buffer

149        d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 01);
150
151    d3ddev->EndScene();
152
153    d3ddev->Present(NULL, NULL, NULL, NULL);
154}

155
156
157// this is the function that cleans up Direct3D and COM
158void cleanD3D(void)
159{
160    v_buffer->Release();    // close and release the vertex buffer
161    d3ddev->Release();    // close and release the 3D device
162    d3d->Release();    // close and release Direct3D
163}

164
165
166// this is the function that puts the 3D models into video RAM
167void init_graphics(void)
168
{
169    // create the vertices using the CUSTOMVERTEX struct

170    CUSTOMVERTEX vertices[] =
171    {
172        400.0f62.5f0.5f1.0f, D3DCOLOR_XRGB(00255), }
,
173        650.0f500.0f0.5f1.0f, D3DCOLOR_XRGB(02550), }
,
174        150.0f500.0f0.5f1.0f, D3DCOLOR_XRGB(25500), }
,
175    }
;
176

177    // create a vertex buffer interface called v_buffer

178    d3ddev->CreateVertexBuffer(3*sizeof(CUSTOMVERTEX),
179                               0
,
180
                               CUSTOMFVF,
181
                               D3DPOOL_MANAGED,
182                               &
v_buffer,
183
                               NULL);
184

185    VOID* pVoid;    //
 a void pointer
186

187    // lock v_buffer and load the vertices into it

188    v_buffer->Lock(00, (void**)&pVoid, 0);
189    memcpy(pVoid, vertices, sizeof
(vertices));
190    v_buffer->
Unlock();
191}

192

 

       來吧,更新您的程序,讓我們看看我們得到的。如果你運(yùn)行這個(gè),你應(yīng)該在屏幕上看到以下內(nèi)容:


   如果你看到這樣的三角,那么恭喜你!你成功了。當(dāng)然,后面還有更多,在開始下一課之前我建議你試著做做下面的小練習(xí),更可讓你更熟悉程序。

      1。改變?nèi)切蔚念伾?br>      2。在程序運(yùn)行時(shí)改變?nèi)堑男螤睢?br>      3。將一個(gè)點(diǎn)的顏色褪色成另一個(gè)點(diǎn)的顏色。

 

       當(dāng)然,你可能會(huì)失望地發(fā)現(xiàn),這一個(gè)三角形算哪門子三維啊?讓我們繼續(xù)下一課的學(xué)習(xí),并使其通過旋轉(zhuǎn),調(diào)整大小和移動(dòng)讓你感覺到它確確實(shí)實(shí)在三維空間中。

下一課:轉(zhuǎn)變頂點(diǎn)

英文原文:http://www.directxtutorial.com/tutorial9/b-direct3dbasics/dx9B4.aspx 

Translate By 王大寶(OneDouble.net)

posted on 2011-02-24 00:46 叫我老王吧 閱讀(3938) 評(píng)論(4)  編輯 收藏 引用 所屬分類: DierectX

FeedBack:
# re: [翻譯]Direct3D Tutrial-04 畫個(gè)三角
2011-02-26 10:14 | lgz
終于等到了,樓主開始一段話,深有同感啊.  回復(fù)  更多評(píng)論
  
# re: [翻譯]Direct3D Tutrial-04 畫個(gè)三角
2011-04-04 13:03 | calvin
感覺這個(gè)教程講的非常好,英文的看不太懂,希望樓主有空能夠繼續(xù)翻譯  回復(fù)  更多評(píng)論
  
# re: [翻譯]Direct3D Tutrial-04 畫個(gè)三角
2011-05-27 04:47 | ole3021
十分欣賞樓主的大愛行為,不知樓主有興趣一起學(xué)習(xí)不,我最近也打算深入學(xué)習(xí)下directX 我已經(jīng)加了樓主qq  回復(fù)  更多評(píng)論
  
# re: [翻譯]Direct3D Tutrial-04 畫個(gè)三角
2011-06-01 16:43 | 叫我老王吧
@ole3021
樓主我最近項(xiàng)目快上線了,忙的一逼,等上線了再說吧,謝謝支持啊  回復(fù)  更多評(píng)論
  

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


<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久一二三国产| 激情综合色丁香一区二区| 中文亚洲免费| 亚洲视频大全| 午夜精品视频在线观看一区二区| 亚洲天堂第二页| 欧美制服丝袜| 久久精品夜色噜噜亚洲aⅴ| 久久夜色精品国产噜噜av| 欧美国产高清| 国产免费观看久久| 好看的日韩视频| 亚洲精品自在久久| 亚洲欧美日韩精品久久亚洲区| 性欧美xxxx大乳国产app| 久热国产精品视频| 亚洲精品视频在线观看免费| 亚洲综合日韩在线| 99精品视频免费全部在线| 国产精品免费看片| 在线精品国产欧美| 在线一区视频| 蜜桃伊人久久| 亚洲一区二区三区精品在线观看 | 久久精品视频免费播放| 欧美福利小视频| 国产亚洲精品成人av久久ww| 亚洲狠狠丁香婷婷综合久久久| 亚洲影视九九影院在线观看| 久久人人97超碰精品888| 亚洲精品美女免费| 性色av香蕉一区二区| 欧美激情女人20p| 激情校园亚洲| 亚洲欧美一区二区在线观看| 亚洲国产欧美一区| 久久精品国语| 国产欧美日韩不卡免费| 99国产成+人+综合+亚洲欧美| 久久久噜噜噜久久人人看| 在线视频欧美一区| 欧美激情四色| 亚洲精品乱码久久久久久久久| 久久久久久久久久久久久久一区| 日韩亚洲在线| 欧美激情亚洲一区| 亚洲国产女人aaa毛片在线| 久久精品99久久香蕉国产色戒| 亚洲国产另类久久精品| 久久久www| 国产一区欧美| 久久国产精彩视频| 亚洲影院在线观看| 国产精品日韩一区二区| 亚洲午夜羞羞片| 99综合视频| 欧美日韩国产免费观看| 亚洲美女一区| 亚洲青色在线| 欧美日韩免费视频| 一区二区三区偷拍| 日韩一级免费观看| 欧美日韩一区在线观看| 制服丝袜激情欧洲亚洲| 日韩亚洲国产欧美| 欧美午夜精品久久久久久孕妇 | 国产欧美一二三区| 欧美一区二区三区播放老司机| 99国产精品99久久久久久| 欧美日韩成人一区二区三区| 一区二区三区 在线观看视| 亚洲精品女av网站| 性欧美18~19sex高清播放| 日韩视频不卡| 欧美国产三级| 一区二区三区日韩| 一个色综合导航| 国产精品一级在线| 久久综合图片| 欧美日韩成人综合天天影院| 亚洲午夜精品福利| 午夜精品999| 1000部精品久久久久久久久| 亚洲国产精品激情在线观看| 欧美日韩www| 久久精品国产亚洲a| 久久综合久色欧美综合狠狠 | 欧美黄色成人网| 欧美日韩免费视频| 久久久在线视频| 欧美成人综合| 亚洲一区在线视频| 久久国产精品久久w女人spa| 亚洲人成毛片在线播放女女| 99精品久久久| 伊人成人在线| 亚洲精品久久久久久下一站| 国产精品欧美日韩| 欧美成人激情在线| 国产精品裸体一区二区三区| 模特精品在线| 欧美午夜精品理论片a级按摩| 久久一区二区三区超碰国产精品| 欧美日韩精品二区| 玖玖玖国产精品| 国产精品网站在线| 亚洲美女黄色| 亚洲人成在线观看| 久久成人18免费网站| 一本色道久久综合亚洲精品不| 午夜国产精品视频免费体验区| 亚洲精品系列| 快射av在线播放一区| 久久国产精品99国产| 欧美日韩亚洲不卡| 亚洲国产日韩在线一区模特| 黄网站免费久久| 午夜久久久久久| 亚洲欧美精品| 欧美日一区二区在线观看| 亚洲激情国产| 亚洲黄色性网站| 欧美一区三区三区高中清蜜桃| 亚洲午夜精品久久久久久浪潮| 免费观看久久久4p| 美女诱惑黄网站一区| 国产一区高清视频| 欧美在线视频免费播放| 久久国产66| 国产一区二区三区视频在线观看| 在线亚洲一区二区| 中文一区字幕| 欧美午夜影院| 一区二区三区回区在观看免费视频| 在线观看一区二区视频| 亚洲先锋成人| 欧美日本高清一区| 亚洲福利电影| 亚洲啪啪91| 欧美~级网站不卡| 亚洲国产91色在线| 最新高清无码专区| 欧美裸体一区二区三区| 亚洲欧洲精品一区| 亚洲永久免费| 国产精品视频内| 午夜一级久久| 久久久精品tv| 影视先锋久久| 久久综合伊人77777蜜臀| 亚洲国产精品va在看黑人| 亚洲国产精品视频一区| 欧美精品一卡二卡| 一区二区三区视频在线观看| 欧美一区深夜视频| 激情久久一区| 欧美成人资源网| 一区二区免费在线观看| 性欧美暴力猛交69hd| 国产农村妇女毛片精品久久莱园子| 久久国产精品色婷婷| 欧美黄色精品| 先锋影音国产一区| **性色生活片久久毛片| 欧美日韩卡一卡二| 久久av最新网址| 亚洲黄色在线视频| 欧美一区亚洲二区| 亚洲经典自拍| 国产精品丝袜白浆摸在线| 久久精品视频va| 亚洲视频视频在线| 久久综合伊人77777| 99视频一区二区三区| 国产伦精品一区二区三区免费迷| 久久综合亚州| 亚洲男人天堂2024| 亚洲黄色毛片| 久久av一区二区| 在线一区二区三区四区| 亚洲一本大道在线| 亚洲成人自拍视频| 亚洲欧美日韩天堂一区二区| 永久91嫩草亚洲精品人人| 国产精品久久福利| 久久午夜精品| 欧美一级成年大片在线观看| 亚洲第一中文字幕| 久久久久久久久久久久久女国产乱| 最新国产精品拍自在线播放| 国产精品亚洲欧美| 欧美欧美天天天天操| 久久婷婷久久| 午夜久久久久久| 亚洲午夜伦理| 亚洲美女少妇无套啪啪呻吟| 欧美电影电视剧在线观看| 欧美一区在线看| 午夜精品一区二区三区电影天堂| 亚洲精品一线二线三线无人区|