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

天行健 君子當自強而不息

效果框架(1)

一個渲染效果一般由以下部分組成:一個頂點和/或像素著色器,一個需要設置的設備狀態(tài)列表,一個或更多的渲染通道(rendering passes)。此外,有一個能在不同級別的圖形硬件上渲染效果的可靠機制通常是值得的(也就是說,有不同的可用的效果版本執(zhí)行同樣的效果或盡可能嘗試執(zhí)行同樣的效果)。顯然,所有這些必要的任務組合在一起成為一個效果。因此,一個合理的做法(步聚)是,設法將這些任務封裝到一個單元中。

Direct3D效果構(gòu)架提供了這樣一個機制:將渲染效果的任務封裝到一個效果文件。在效果文件中實現(xiàn)效果有兩方面優(yōu)勢。其一,它允許我們不必重編譯應用程序就能改變一個效果的執(zhí)行。這是一種更新效果的過程,不管是修正一個bug,一些簡單的加強,或者利用最新的3D硬件特性。第二,它將所有的效果組成部分封裝到一個文件。

 

19.1 手法與通道(Techniques and Passes)

       一個效果文件由一個或多個手法組成。一個手法是用一個特殊的方法渲染一些特效。所以換句話說,一個效果文件提供了渲染相同特效的一個或多個不同的通道。為什么同樣的效果需要幾個不同實現(xiàn)呢?是的,一些硬件可能不支持一個效果的一種特定實現(xiàn)。因此,必需在不同硬件上實現(xiàn)相同效果的不同版本。

注意:例我們可能實現(xiàn)一種效果的兩個版本,一種用著色器實現(xiàn)而一種用固定管線實現(xiàn)。這樣,那些有著色器(shader)支持的顯卡用戶能夠利用著色器實現(xiàn),而那些不支持著色器的用戶仍然可以使用固定管線實現(xiàn)。

可以在一個效果文件中實現(xiàn)所有版本的效果,這讓我們更完整的封裝了所有的效果,也是效果框架的目標之一 封裝(encapsulation)。

每種手法包括一次或多次渲染通道(passes)。一個渲染通道(rendering pass)在特定通道(pass)中封裝了設備狀態(tài)、采樣器、和/或用于渲染幾何體的著色器。

注意:一個效果不僅限于可編程管線使用。例如,它可以使用固定功能管線控制設備狀態(tài),比如燈光、材質(zhì)以及紋理。

       使用多個通道(multiple passes)的理由是,因為對每種特效,是通過使用不同的設備狀態(tài)、著色器等等,對同樣的幾何體進行多次渲染來完成的。舉例來說,我們不得不在每幀里用不同的設備狀態(tài)、多次渲染相同的幾何體,以達到反射效果。

下面這個例子,是一個用兩種手法實現(xiàn)的效果文件的框架,第一種手法包括一次傳遞而每二種手法包括兩次傳遞:

// effect.txt

...

technique T0

{

     // first and only pass for this technique

     pass P0

     {

          ...[specify pass device states, shaders, samplers, etc.]

     }

}

 

 

technique T1

{

     // first pass

     pass P0

     {

          ...[specify pass device states, shaders, samplers, etc.]

}

 

     // second pass

     pass P1

     {

          ...[specify pass device states, shaders, samplers, etc.]

     }

}

 

 

19.2 更多HLSL內(nèi)置對象( More HLSL Intrinsic Objects)

這是一些在HLSL中額外的內(nèi)建對象類型。

 

19.2.1 紋理對象

HLSL內(nèi)建紋理類型描述了一個IDirect3DTexture9對象。通過使用紋理對象我們可以直接地在效果文件中對特定的采樣器階段結(jié)合紋理。紋理對象有下面的可以訪問的數(shù)據(jù)成員:

type—紋理類型 (例如:2D, 3D)

format—紋理的像素格式

width—紋理的寬度(單位像素)

height—紋理的高度(單位像素)

depth—紋理的深度(如果是3D紋理,單位像素)

注意:迄今為止我們僅僅使用紋理來存儲圖形數(shù)據(jù),但當你學到更高級的技術(shù),你會發(fā)現(xiàn)紋理可用來保存任意表格信息。換句話說,紋理僅是數(shù)據(jù)表,不是必須包含圖形數(shù)據(jù)。例如,在碰撞映射(bump mapping)時我們用到一種叫做法線圖的東東(normal map),就是一種在每個點上包括了法向量的紋理。

 

19.2.2 采樣器對象與采樣器狀態(tài)

效果框架定義了新的關(guān)鍵字:sampler_state。使用sampler_state關(guān)鍵字,我們能初始化一個采樣器對象(即,直接在效果文件中設置采樣器對象的紋理和狀態(tài))。下面的例子說明了這點:

Texture Tex; 

sampler SO = sampler_state

{

Texture = (Tex);  // 紋理

 

// 采樣器狀態(tài)

     MinFilter = LINEAR;

     MagFilter = LINEAR;

     MipFilter = LINEAR;

};

       這里我們給采樣器S0的texture成員關(guān)聯(lián)了紋理 Tex,并給狀態(tài)成員設置了采樣狀態(tài)。我們直接明了的在效果文件中設置所有信息。

 

19.2.3 頂點與像素著色器對象(Vertex and Pixel Shader Objects)

       vertexshader 和 pixelshader是HLSL的內(nèi)建類型,分別表示頂點著色器像素著色器。它們在效果文件中表示特定頂點和/或像素著色器,用于一個特定的渲染通道(pass)。vertexshader和/或pixelshader類型在應用程序中用ID3DXEffect::SetVertexShader和ID3DXEffect::SetPixelShader函數(shù)分別設置。

例如,在效果文件中,Effect是一個有效的ID3DXEffect對象,VS是一個有效的IDirect3DVertexShader9對象,以及VSHandle是一個D3DXHANDLE(是vertexshader 對象的引用)。然后,我們可以通過如下寫法初始化VSHandle所引用的頂點著色器:

Effect->SetVertexShader(VSHandle, VS);

       當在應用程序中設置效果文件中的變量時,多數(shù)時候我們使用SetVertexShader 和 SetPixelShader。

       做為選擇,我們可以直接在效果文件中寫頂點和/或像素著色器。當使用一種特定的編譯語法時,我們可以設置一個著色器變量。下面的例子展示了如何初始化一個pixelshader類型的變量ps。

// 定義入口函數(shù)

OUTPUT Main(INPUT input){...}

 

// 編譯入口函數(shù)

pixelshader ps = compile ps_2_0 Main();

在pixelshader關(guān)鍵字之后的特定的版本名,接下來是著色器入口函數(shù)。注意,當用這種方式(style)初始化一個頂點或像素著色器對象時,入口函數(shù)必須定義在效果文件中。

 

或者更簡潔的: 

pass P0

{

// 設置這個傳遞的頂點著色器,為入口函數(shù)" Main()"的頂點著色器

     vertexshader = compile vs_2_0 Main(); 

     ...

}

注意:你能用這樣的語法來初始化一個vertexshader 和 pixelshader 類型:

vertexshader vs = asm { /*assembly instructions go here */ };

pixelshader ps = asm { /*assembly instructions go here */ };

如果你用匯編語言來寫著色器,你就用這種語法。

 

19.2.4 字符串

最后,這是一個字符串對象,它的用法是這樣地:

string filename = "texName.bmp";

       盡管沒有任何HLSL的內(nèi)建函數(shù)支持字符串類型,但它可以在應用程序中讀取。這樣,我們能進一步封裝效果使用的數(shù)據(jù)文件,比如紋理文件名X文件字

 

19.2.5 注解 (Annotations)

除我們已經(jīng)描述過的語義符之外,注解可以用在變量上。注解在HLSL中是不使用的,但是它們可以被應用程序通過效果框架訪問。它們僅僅服務于一個綁定 “note”的變量,這樣應用程序就能夠訪問這個變量了。為注解加入了<annotation>語法。下面一行舉例說明:

texture tex0 < string name = "tiger.bmp"; >;

在這個例子中的注解是<string name = "tiger. bmp";>。它關(guān)聯(lián)了一個字符串到變量tex0,即保存紋理數(shù)據(jù)的文件名。很明顯,用相應的文件名注解一個紋理是有益的。

       注解可以使用下面函數(shù)被重新得到:

D3DXHANDLE ID3DXEffect::GetAnnotationByName(

     D3DXHANDLE hObject,

     LPCSTR pName

);

       pName是我們要操作的注解的名字,而hObject是注解所在的父塊句柄,如一個technique、pass或者結(jié)構(gòu)塊。一旦我們有了一個注解的句柄,我們就能通過應用ID3DXEffect::GetParameterDesc得到有關(guān)它的信息。查看DirectX SDK文檔以得到更多詳細的內(nèi)容。

Gets the handle of an annotation by looking up its name.

D3DXHANDLE GetAnnotationByName(
D3DXHANDLE hObject,
LPCSTR pName
);

Parameters

hObject
[in] Handle of a technique, pass, or top-level parameter.
pName
[in] String containing the annotation name.

Return Values

Returns the handle of the specified annotation, or NULL if the name was not found. See Handles.

ID3DXBaseEffect::GetParameterDesc

Gets a parameter or annotation description.

HRESULT GetParameterDesc(
D3DXHANDLE hParameter,
D3DXPARAMETER_DESC* pDesc
);

Parameters

hParameter
[in] Parameter or annotation handle.
pDesc
[out] Returns a description of the specified parameter or annotation.

Return Values

If the method succeeds, the return value is S_OK. If the method fails, the return value can be D3DERR_INVALIDCALL.

D3DXPARAMETER_DESC

Describes a parameter used for an effect object.

typedef struct D3DXPARAMETER_DESC {
LPCSTR Name;
LPCSTR Semantic;
D3DXPARAMETER_CLASS Class;
D3DXPARAMETER_TYPE Type;
UINT Rows;
UINT Columns;
UINT Elements;
UINT Annotations;
UINT StructMembers;
DWORD Flags;
UINT Bytes;
} D3DXPARAMETER_DESC, *LPD3DXPARAMETER_DESC;

Members

Name
Name of the parameter.
Semantic
Semantic meaning, also called the usage.
Class
Parameter class. Set this to one of the values in D3DXPARAMETER_CLASS.
Type
Parameter type. Set this to one of the values in D3DXPARAMETER_TYPE.
Rows
Number of rows in the array.
Columns
Number of columns in the array.
Elements
Number of elements in the array.
Annotations
Number of annotations.
StructMembers
Number of structure members.
Flags
Parameter attributes. See Effect Constants.
Bytes
The size of the parameter, in bytes.
 

19.3 效果文件的設備狀態(tài)( Device States in an Effect File)

通常,為了正確執(zhí)行一個效果,我們必須設置設備的狀態(tài),比如渲染狀態(tài)、紋理狀態(tài)、材質(zhì)、燈光和紋理。將全部效果封裝進一個文件使它有支持全部效果的能力,效果框架允許我們在效果文件中設置設備狀態(tài)。設備狀態(tài)在渲染的通道部分(pass block)里設置,語法看起來象這樣:

State= Value;

       考慮FillMode狀態(tài)。值與D3DFILLMODE一樣,但沒有D3DFILL_前綴。如果我們在SDK文檔中查找D3DFILLMODE,我們找到值:D3DFILL_POINT, D3DFILL_WIREFRAME, and D3DFILL_SOLID。因而,對于效果文件我們省略了前綴,并獲得下列狀態(tài)FillMode的有效值:POINT, WIREFRAME, 和 SOLID。例如,你可以在效果文件中這么寫-:

FillMode = WIREFRAME;

FillMode = POINT;

FillMode = SOLID;

 

 

19.4 創(chuàng)建效果

       效果用ID3DXEffect接口表示,我們用下面的D3DX函數(shù)創(chuàng)建它:

HRESULT D3DXCreateEffectFromFile(

     LPDIRECT3DDEVICE9 pDevice,

     LPCSTR pSrcFile,

     CONST D3DXMACRO* pDefines,

     LPD3DXINCLUDE pInclude,

     DWORD Flags,

     LPD3DXEFFECTPOOL pPool,

     LPD3DXEFFECT* ppEffect,

     LPD3DXBUFFER *ppCompilationErrors

);

         pDevice—被創(chuàng)建的ID3DXEffect對象所關(guān)聯(lián)的設備

         pSrcFile—我們要編譯的包括效果源代碼的文本文件的名字(效果文件名)

         pDefines—這個參數(shù)是可選的,這里指定為null

         pInclude—ID3DXInclude接口指針。這個接口被設計成由應用程序執(zhí)行,因而我們可以替換默認行為。通常,默認行為就挺好,我們可以指定null忽略這個參數(shù)。

         Flags—編譯效果文件中的shader的選項標志,指定0為沒有標志。有效選項為:

        D3DXSHADER_DEBUG—指示編譯器寫入調(diào)試信息

        D3DXSHADER_SKIPVALIDATION—指示編譯器不做任何代碼檢測。這只在你正在用到一個已知正常工作的shader時使用。

        D3DXSHADER_SKIPOPTIMIZATION—指示編譯器不執(zhí)行任何優(yōu)化。實際上這只用于調(diào)試時,當你不想讓編譯器對代碼做任何更改時。

        pPool—可選的ID3DXEffectPool接口指針,用于指定效果參數(shù)如何共享其它的效果實例。這里指定null,表示我們不在參數(shù)與效果文件之間共享。

         ppEffect—返回一個ID3DXEffect接口指針,表示被創(chuàng)建的效果。

         ppCompilationErrors—返回一個包含錯誤代碼字符串和消息的ID3DXBuffer指針。

 

這是一個調(diào)用D3DXCreateEffectFromFile的例子:

// 修建效果

ID3DXEffect* Effect = 0;

ID3DXBuffer* errorBuffer = 0;

hr = D3DXCreateEffectFromFile(

     Device,           // 關(guān)聯(lián)的設備

     "effect.txt",     // 效果源文件

     0,                // no preprocessor definitions

     0,                // no ID3DXInclude interface

     D3DXSHADER DEBUG, // 編譯標記

     0,                // 不共享參數(shù)

     &Effect,          // 返回創(chuàng)建效果的指針

     &errorBuffer);    // 返回的錯誤信息

 

// 輸出錯誤信息

if( errorBuffer )

{

     ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0);

     d3d::Release<ID3DXBuffer*>(errorBuffer);

}

 

if (FAILED(hr))

{

      ::MessageBox(0, "D3DXCreateEffectFromFile() - FAILED", 0, 0);

      return false;

}


posted on 2008-04-12 20:52 lovedday 閱讀(1912) 評論(0)  編輯 收藏 引用

公告

導航

統(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>
            99精品视频免费全部在线| 国产精品乱码一区二区三区 | 伊伊综合在线| 国模私拍一区二区三区| 精品999在线播放| 亚洲第一综合天堂另类专| 亚洲人成在线播放| 中文亚洲欧美| 久久久久久夜| 亚洲人在线视频| 在线一区二区视频| 久久丁香综合五月国产三级网站| 久久久久欧美精品| 欧美乱大交xxxxx| 国产欧美日韩视频| 亚洲激情小视频| 亚洲欧美怡红院| 欧美va亚洲va香蕉在线| 亚洲精品自在久久| 久久精品在线观看| 国产精品qvod| 亚洲精品美女免费| 久久精品免费观看| 亚洲毛片在线看| 久久免费少妇高潮久久精品99| 麻豆精品精华液| 国产欧美日本一区二区三区| 亚洲欧洲久久| 久久se精品一区二区| 亚洲级视频在线观看免费1级| 亚洲一区二区在线| 欧美精品三级| 亚洲国产精品久久久久婷婷老年 | 亚洲图片在线| 欧美国产一区视频在线观看| 国产欧美日韩精品a在线观看| 99xxxx成人网| 欧美黄在线观看| 久久久www成人免费毛片麻豆| 国产伦精品一区二区三区免费| 夜夜嗨av一区二区三区免费区| 嫩草影视亚洲| 久久久久国内| 精品成人a区在线观看| 欧美影院视频| 午夜视频一区二区| 国产免费一区二区三区香蕉精| 中文av一区二区| 99re66热这里只有精品4| 欧美激情亚洲自拍| 日韩亚洲一区二区| 亚洲黄色高清| 久久综合电影| 久久精视频免费在线久久完整在线看| 国产精品欧美久久| 亚洲欧美日韩国产一区二区三区 | 久久精品成人欧美大片古装| 一本色道久久综合亚洲精品婷婷| 欧美黄色影院| 一区二区三区视频在线观看| 日韩视频中午一区| 国产精品v片在线观看不卡| 亚洲手机成人高清视频| 一本大道av伊人久久综合| 欧美日韩综合在线| 亚洲在线播放| 香蕉久久夜色精品| 永久免费视频成人| 欧美激情免费在线| 欧美日韩国产不卡| 香港成人在线视频| 久久狠狠亚洲综合| 亚洲日本成人在线观看| 亚洲精品在线电影| 国产精品一区免费在线观看| 久久精品视频网| 蜜桃久久av一区| 在线一区二区三区四区五区| 亚洲天堂免费观看| 激情文学综合丁香| 91久久视频| 国产日韩av一区二区| 免费中文字幕日韩欧美| 欧美极品在线视频| 欧美影院成年免费版| 美国十次成人| 亚洲一区国产| 久久视频在线视频| 亚洲视频 欧洲视频| 欧美在线观看一区二区| 亚洲精品国产系列| 亚洲欧美变态国产另类| 最新69国产成人精品视频免费| 99在线|亚洲一区二区| 国内精品久久久久久久影视蜜臀| 欧美激情精品久久久久久黑人| 欧美三级日本三级少妇99| 美女999久久久精品视频| 欧美日韩久久| 美女网站久久| 国产精品香蕉在线观看| 亚洲黄色成人网| 国内久久视频| 亚洲综合精品一区二区| 亚洲日本在线观看| 久久都是精品| 欧美在线观看视频一区二区| 欧美国产精品人人做人人爱| 欧美一区二区视频免费观看| 欧美成人一区二区三区在线观看| 久久精品在线免费观看| 国产精品国产三级国产aⅴ入口| 欧美成人一品| 欧美成人蜜桃| 久久久久久网| 国产伦精品一区二区三区视频孕妇 | 国产婷婷精品| 日韩小视频在线观看专区| 国产综合久久久久影院| 亚洲一区激情| 亚洲免费在线观看视频| 欧美日韩国产小视频| 亚洲激情av| 亚洲美女色禁图| 欧美国产日产韩国视频| 欧美成黄导航| 亚洲黄色有码视频| 蜜臀久久99精品久久久久久9| 另类专区欧美制服同性| 国内精品伊人久久久久av影院| 性久久久久久久久| 欧美在线观看www| 国产人久久人人人人爽| 午夜精品福利在线观看| 欧美综合二区| 国外视频精品毛片| 久久综合色影院| 亚洲大黄网站| 一区二区三区导航| 国产精品hd| 亚洲综合色丁香婷婷六月图片| 欧美一级理论片| 国模一区二区三区| 免费成人黄色av| 日韩视频二区| 欧美在线影院在线视频| 国产一区二区电影在线观看| 欧美一区日韩一区| 亚洲电影免费观看高清完整版在线观看| 亚洲国产精品久久| 欧美日韩第一区| 亚洲综合色激情五月| 老司机精品久久| 亚洲日本国产| 国产精品亚洲美女av网站| 久久精品国产99国产精品澳门| 美国十次了思思久久精品导航| 亚洲精品乱码久久久久久| 欧美午夜不卡视频| 久久国产主播| 一本色道精品久久一区二区三区| 亚洲永久免费| 在线免费观看日本一区| 欧美日本亚洲视频| 欧美一级专区| 99国内精品| 欧美a级一区二区| 亚洲欧美中文日韩v在线观看| 国产偷久久久精品专区| 欧美电影免费观看| 性色av一区二区怡红| 亚洲高清在线观看| 久久福利资源站| 99亚洲视频| 在线成人h网| 国产精品毛片a∨一区二区三区| 久久久久.com| 亚洲视频在线看| 日韩一级成人av| 久久av资源网| 99国产精品久久久久老师 | 在线看日韩欧美| 国产精品久久国产三级国电话系列| 校园春色综合网| 日韩一级黄色大片| 欧美91大片| 久久九九精品99国产精品| 亚洲精品视频中文字幕| 国产亚洲欧洲| 国产精品夜夜夜一区二区三区尤| 久久亚洲欧美国产精品乐播| 亚洲午夜久久久| 亚洲乱码视频| 亚洲激情社区| 亚洲国产精品美女| 欧美91精品| 欧美成人自拍| 欧美成年人视频| 你懂的国产精品永久在线| 久久久最新网址|