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

天行健 君子當自強而不息

效果框架(1)

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

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

 

19.1 手法與通道(Techniques and Passes)

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

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

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

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

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

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

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

// 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內置對象( More HLSL Intrinsic Objects)

這是一些在HLSL中額外的內建對象類型。

 

19.2.1 紋理對象

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

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

format—紋理的像素格式

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

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

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

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

 

19.2.2 采樣器對象與采樣器狀態

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

Texture Tex; 

sampler SO = sampler_state

{

Texture = (Tex);  // 紋理

 

// 采樣器狀態

     MinFilter = LINEAR;

     MagFilter = LINEAR;

     MipFilter = LINEAR;

};

       這里我們給采樣器S0的texture成員關聯了紋理 Tex,并給狀態成員設置了采樣狀態。我們直接明了的在效果文件中設置所有信息。

 

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

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

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

Effect->SetVertexShader(VSHandle, VS);

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

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

// 定義入口函數

OUTPUT Main(INPUT input){...}

 

// 編譯入口函數

pixelshader ps = compile ps_2_0 Main();

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

 

或者更簡潔的: 

pass P0

{

// 設置這個傳遞的頂點著色器,為入口函數" 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的內建函數支持字符串類型,但它可以在應用程序中讀取。這樣,我們能進一步封裝效果使用的數據文件,比如紋理文件名X文件字。

 

19.2.5 注解 (Annotations)

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

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

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

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

D3DXHANDLE ID3DXEffect::GetAnnotationByName(

     D3DXHANDLE hObject,

     LPCSTR pName

);

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

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 效果文件的設備狀態( Device States in an Effect File)

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

State= Value;

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

FillMode = WIREFRAME;

FillMode = POINT;

FillMode = SOLID;

 

 

19.4 創建效果

       效果用ID3DXEffect接口表示,我們用下面的D3DX函數創建它:

HRESULT D3DXCreateEffectFromFile(

     LPDIRECT3DDEVICE9 pDevice,

     LPCSTR pSrcFile,

     CONST D3DXMACRO* pDefines,

     LPD3DXINCLUDE pInclude,

     DWORD Flags,

     LPD3DXEFFECTPOOL pPool,

     LPD3DXEFFECT* ppEffect,

     LPD3DXBUFFER *ppCompilationErrors

);

         pDevice—被創建的ID3DXEffect對象所關聯的設備

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

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

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

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

        D3DXSHADER_DEBUG—指示編譯器寫入調試信息

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

        D3DXSHADER_SKIPOPTIMIZATION—指示編譯器不執行任何優化。實際上這只用于調試時,當你不想讓編譯器對代碼做任何更改時。

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

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

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

 

這是一個調用D3DXCreateEffectFromFile的例子:

// 修建效果

ID3DXEffect* Effect = 0;

ID3DXBuffer* errorBuffer = 0;

hr = D3DXCreateEffectFromFile(

     Device,           // 關聯的設備

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

     0,                // no preprocessor definitions

     0,                // no ID3DXInclude interface

     D3DXSHADER DEBUG, // 編譯標記

     0,                // 不共享參數

     &Effect,          // 返回創建效果的指針

     &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 閱讀(1917) 評論(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>
            99精品国产一区二区青青牛奶| 久久精品夜色噜噜亚洲a∨| 免费成人在线观看视频| 久久精品国产综合精品| 新67194成人永久网站| 性刺激综合网| 久久综合电影一区| 欧美日韩精品免费观看| 国产精品一区二区在线观看不卡 | 欧美成人一区二区| 欧美日韩国产在线播放| 国产精品男gay被猛男狂揉视频| 国产香蕉97碰碰久久人人| 亚洲一区二区三区视频| 亚洲欧美精品在线| 久久精品国产999大香线蕉| 美女视频黄 久久| 亚洲国产日日夜夜| 亚洲韩国青草视频| 亚洲综合好骚| 欧美激情一区二区三区高清视频| 国产精品毛片| 日韩午夜黄色| 乱人伦精品视频在线观看| 99视频精品全部免费在线| 久久久xxx| 国产精品夜夜夜| 日韩亚洲一区二区| 久久亚洲精品视频| 亚洲一区日韩| 欧美日韩精品国产| 亚洲精品你懂的| 另类春色校园亚洲| 亚洲欧美日韩视频二区| 欧美日韩亚洲在线| 亚洲久久视频| 欧美va亚洲va国产综合| 亚洲欧美怡红院| 国产精品福利片| 夜色激情一区二区| 欧美华人在线视频| 久久久久久网址| 国产欧美日韩不卡免费| 一区二区三区导航| 亚洲黄色三级| 美日韩精品视频| 在线播放中文一区| 久久中文在线| 久久久五月婷婷| 国内精品久久久久伊人av| 欧美一区二区三区四区在线观看地址 | 久久久久久久久一区二区| 国产精品亚洲一区二区三区在线| 亚洲网站在线观看| 亚洲精品视频免费观看| 欧美黄色视屏| 亚洲精品乱码久久久久| 亚洲第一福利在线观看| 久久亚洲免费| 亚洲国产日韩欧美在线动漫| 久久综合99re88久久爱| 久久国产精品久久久久久久久久 | 亚洲国产天堂久久国产91| 久久精品国产免费观看| 欧美一级欧美一级在线播放| 国产欧美欧美| 久久在精品线影院精品国产| 久久精品国产亚洲a| 狠狠色香婷婷久久亚洲精品| 久久手机免费观看| 久久五月婷婷丁香社区| 亚洲人成人一区二区三区| 欧美激情视频在线免费观看 欧美视频免费一| 久久精品夜色噜噜亚洲aⅴ| 在线观看成人av| 亚洲精品乱码久久久久| 欧美视频一区| 久久人人爽人人| 欧美黄色日本| 久久国产欧美精品| 欧美成人一区二区| 欧美一区二区三区视频在线| 久久久综合视频| 亚洲图片欧美一区| 欧美制服丝袜第一页| 亚洲三级影院| 亚洲一区二区三区影院| 亚洲国产精品www| 国产精品99久久久久久宅男| 伊人久久大香线| 日韩一区二区精品视频| 国产一区白浆| 亚洲日本成人| 极品日韩av| 99re8这里有精品热视频免费 | 在线视频中文亚洲| 精品动漫3d一区二区三区| 日韩午夜一区| 在线观看亚洲精品| 亚洲免费在线视频一区 二区| 91久久精品国产91久久性色tv| 亚洲自拍偷拍网址| 日韩亚洲欧美一区| 久久久视频精品| 久久不射2019中文字幕| 欧美激情久久久| 久久免费少妇高潮久久精品99| 欧美日韩免费观看中文| 欧美国产视频日韩| 国产视频精品va久久久久久| 亚洲三级色网| 亚洲国产精品一区二区第四页av | 久久先锋影音av| 欧美性理论片在线观看片免费| 欧美成人精品一区| 国产一区导航| 亚洲欧美日韩精品久久亚洲区| 免费在线观看精品| 日韩一区二区精品视频| 久久久精品五月天| 久久aⅴ国产欧美74aaa| 国产精品草草| 一区二区久久久久久| 99热在线精品观看| 免费在线视频一区| 欧美高清视频| 亚洲福利国产| 久热这里只精品99re8久| 久久人人爽人人爽爽久久| 国产亚洲观看| 欧美一区二区在线播放| 先锋影音久久| 国产农村妇女毛片精品久久麻豆 | 亚洲福利在线看| 久久久久国产精品一区二区| 久久久精品tv| 红桃视频成人| 久久精品一区二区三区四区| 欧美在线免费一级片| 国产欧美午夜| 久久超碰97中文字幕| 久久午夜羞羞影院免费观看| 在线精品视频一区二区三四| 免费中文日韩| 亚洲理伦电影| 亚洲欧美日本日韩| 国产精品一区二区三区成人| 欧美一区二区在线看| 久久久亚洲一区| 国产一区二区三区久久久| 久久久精品动漫| 亚洲黄色性网站| 销魂美女一区二区三区视频在线| 国产女主播一区| 久久综合色8888| 99国产精品久久久久久久成人热| 性久久久久久久久久久久| 国产原创一区二区| 欧美激情中文字幕乱码免费| 亚洲一二三区精品| 欧美成年网站| 午夜精品国产更新| 在线色欧美三级视频| 欧美午夜视频在线观看| 久久精品视频在线看| 亚洲精品在线免费| 久久蜜桃精品| 亚洲资源av| 最新日韩精品| 国产精品免费看| 麻豆九一精品爱看视频在线观看免费| 亚洲国产欧美久久| 久久不射网站| 中国女人久久久| 激情偷拍久久| 欧美性猛交99久久久久99按摩| 久久久天天操| 亚洲专区国产精品| 亚洲精品欧美| 免费av成人在线| 午夜亚洲影视| 一区二区日本视频| 在线日韩欧美| 国语自产精品视频在线看抢先版结局 | 蜜臀a∨国产成人精品| aa日韩免费精品视频一| 国产综合婷婷| 国产精品免费观看视频| 欧美电影专区| 久久婷婷一区| 欧美一级久久久久久久大片| 亚洲巨乳在线| 91久久久久久| 女女同性女同一区二区三区91| 性欧美1819性猛交| 亚洲视频免费在线观看| 亚洲另类黄色| 最近看过的日韩成人| 一区在线视频观看| 国产有码一区二区|