锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 浜庢槸媯鏌3DRS_ZENABLE,D3DRS_ZWRITEENABLE, 緇撴灉閮芥槸TRUE 鏃犲,鍙湁涓庢垜浠ュ墠姝g‘鐨凞emo瀵規瘮210涓覆鏌撶姸鎬? 鏈夐儴鍒嗘覆鏌撲笉鍚岀殑,浣跨敤紜唬鐮佸己琛岀籂姝?緇撴灉: 鏃犳晥 鎬鐤戦《鐐規牸寮忕牬鎹? 閲嶆柊浣跨敤浠ュ墠鐨勬ā鍨嬫牸寮?鎺掗櫎榪欎釜鍙兘鎬? 緇撴灉:澶辮觸 鏃犲涓?媯鏌ヨ澶囬夐」, 紿佺劧娉ㄦ剰鍒癉3DPRESENT_PARAMETERS 緇撴瀯浣撲腑鐨凟nableAutoDepthStencil 璁劇疆鏄疐ALSE 鍥犱負榪欐璁懼綾繪槸閲嶅啓鐨?瀵規瘮浠ュ墠姝g‘浠g爜, 鏈夊樊寮?灝嗗叾鏀逛負 PresentParameters.EnableAutoDepthStencil = TRUE; 浠ュ墠緲婚槄SDK鏃?娉ㄦ剰榪囪繖涓夐」, 榪欐槸鐢盌3D甯綘綆$悊ZBuffer. 嫻嬭瘯, 闂瑙e喅. 鍒嗘瀽: 濡傛灉EnableAutoDepthStencil = FALSE, 鎰忓懗鐫榪瀂Buffer閮芥病鏈?閭f洿涓嶈璇存覆鏌撶姸鎬?
PresentParameters.AutoDepthStencilFormat = D3DFMT_D16;
]]>
鏈枃緲昏瘧鏁寸悊鎬葷粨鑷?a >http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter05.html
濡傛灉鍠滄,璇瘋喘涔版鐗?/p>
澶氭祦鎶鏈湪娓叉煋鏃惰兘瀵規ц兘鍜岀粨鏋勬湁涓瀹氬ソ澶?浣嗘槸鎬庢牱灝嗘ā鍨嬫暟鎹垎閰嶅埌鍚勯《鐐規暟鎹祦榪涜娓叉煋灝辨槸涓涓闂?
瀵逛簬欏剁偣鏁版嵁鍙互鍒嗕負榪欎箞鍑犱釜澶х被:
G: 澶氳竟褰㈡暟鎹? 鍖呭惈vertex position, normal, and vertex color(s).
T: 綰圭悊鏄犲皠, 鍖呭惈澶氬眰綰圭悊鍧愭爣鍙妕angent vectors絳?/p>
A: 鍔ㄧ敾鏁版嵁, 楠ㄩ鍔ㄧ敾涓殑楠ㄩ鏉冮噸鍙婇楠肩儲寮?/p>
I: 鐢ㄤ簬Instance緇樺埗鐨勭敤鎴鋒暟鎹?/p>
浠ヤ笅鏄涓浜涘父鐢ㄦ覆鏌撶殑嫻佹惌閰?
闈欐佹ā鍨?/p>
鍙互鏄? G or G + T
楠ㄩ鍔ㄧ敾妯″瀷
鍙互鏄?G + A or G + T + A
Instance緇樺埗鐨勯楠煎姩鐢繪ā鍨?/p>
鍙互鏄?G + I or G + T + I 鎴栬呭姩鐢葷被鍨嬬殑G + A + I or G + T + A + I
娓叉煋Z-Pass鐗╀歡
鍙互鏄?strong>G, 鎴栬呭姩鐢葷被鍨嬬殑G + A or G + I or G + A + I
榪欓噷鍙傝冧簡mybios鍗氬涓殑鏂囩珷,緇機EGUI瀛楃涓插仛涓涓猵atch
鐒跺悗闇瑕佹壘鍒皏s2008鐨刟utoexp.dat鏂囦歡
XP涓嬩綅浜?C:\Program Files\Microsoft Visual Studio 9.0\Common7\Packages\Debugger\autoexp.dat
鐢ㄨ浜嬫湰絳夊伐鍏鋒墦寮, 鍦ˋutoExpand孌典腑鍍忚繖鏍鋒坊鍔?
[AutoExpand]
; CEGUI String
CEGUI::String = str =<d_quickbuff,su> length =<d_cplength>
鍗沖彲鍦╒C璋冭瘯鍣ㄤ腑鐪嬪埌CEGUI瀛楃涓插唴瀹? 涓嶈繃涓枃榪樻槸鏆傛椂鏃犳硶鏀寔
棣栧厛,鎴戜滑寰楀純鐢–PU钂欑毊, 铏界劧鍏煎鎬уソ,浣嗘槸闈㈠鐜頒粖澶氭牳浣嗗茍涓嶆彁楂樺崟鏍擱熺巼鐨勬儏鍐典笅,GPU榪樻槸鐜嬮亾.鑰屼笖GPU钂欑毊浠g爜鍙兘鏇寸畝鍗?涓嶈繃涔熸湁涓鐐瑰皬緙虹偣, 瀵逛簬灝忓紩鎿庢潵璇?Shader蹇呴』緇欓潤鎬佹ā鍨嬪拰楠ㄩ鍔ㄧ敾妯″瀷鍐欎袱濂?
鍏舵鎴戜滑闇瑕佸姞寮轟竴涓猄ubSkin鐨勯楠兼敮鎸佹暟閲? 楠ㄩ鍔ㄧ敾涓婄殑姣忎釜SubSkin閮芥槸涓嬈raw, 浣嗘槸鎸夌収浼犵粺楠ㄩ鍔ㄧ敾緋葷粺,姣忎釜楠ㄥご瀵瑰簲涓涓煩闃典紶鍏?閭d箞SM2.0淇濆畧璁$畻鍙兘鏀寔50鏍歸澶? 涓嶈繃鍦ㄦ垜鍓嶆鏃墮棿鐨?a href="http://www.shnenglu.com/sunicdavy/archive/2010/04/26/113578.html">鏂囩珷涓湁鎻愬埌榪欎釜鎶鏈?騫朵笖宸茬粡鍦ㄦ垜鐨勯楠煎姩鐢葷郴緇熷強OGRE涓疄鐜?鏁堟灉寰堝ソ.
緹庢湳涔熻寰堝弽鎰熶竴涓漢鐗╁仛1涓猄ubSkin, 浠栦滑鏇存柊濂藉涓猄ubSkin,涔熷氨鏄韜綋姣忎釜閮ㄥ垎閮芥槸涓涓猄ubSkin, 榪欐牱鏂逛究淇敼, 鍚屾椂緋葷粺鏀寔鐨勯楠兼暟閲忚繕鍙互鏈変竴瀹氶噺鐨勪笂鍗?涓嶈繃鎴戜滑榪橀渶瑕佸仛涓涓儲寮曞伐浣? 浼犵粺鐨凣PU楠ㄩ鍔ㄧ敾涓繪槸鍦ㄦ覆鏌揝ubSkin鍓嶄紶鍏ユ墍鏈夎繖浜汼ubSkin闇瑕佺敤鍒扮殑楠ㄩ鐭╅樀. 浣嗘槸姣忎釜SubSkin騫朵笉涓瀹氳兘鐢ㄥ埌鎵鏈夌殑榪欎簺鐭╅樀,榪欐槑鏄炬槸涓縐嶆氮璐? 鍥犳鍦∣GRE涓仛榪囦竴嬈$儲寮曢澶勭悊,涔熷氨鏄皢姣忎釜SubSkin鐢ㄥ埌鐨勯楠肩粺璁″嚭鏉? 鍦ㄦ覆鏌撹繖嬈ubSkin鏃舵墠閲嶆柊浼犲埌GPU. 寰堟槑鏄?榪欐槸鐢ㄩ熷害榪樼┖闂村拰鍏煎鎬? 濡傛灉鍦―X10浠ヤ笂,鏈塁onstantBuffer榪樺ソ. DX9瀹炲湪澶參浜?/p>
浣跨敤Marker鐐圭殑鎹㈣緋葷粺寰堥毦澶勭悊渚嬪璐磋韓琛g墿榪欑被鐗╀歡鎹㈣. OGRE涓湁涓縐嶅叡浜楠肩殑鎶鏈? 鍙互鏀寔, 涓嶈繃浠庝唬鐮佸垎鏋愮湅鏉?榪欑鎶鏈CPU绔楠艱綆楅噺瀹炲湪鏄ぇ鐨勬儕浜? 鍥犳鎴戜滑鍐沖畾灝嗘暣涓猄ubSkin(涔熷氨鏄疭ubEntity)鎹㈡帀,榪欐牱鐢辯編鏈牴鎹笉鍚屾崲瑁呯被鍨嬫潵灝嗚。鏈嶅湪MAX涓洿鎺ョ粦瀹氬ソ鍚庣洿鎺ユ浛鎹㈠師濮嬫ā鍨嬩腑鐨凷ubSkin鍗沖彲杈懼埌鎹㈣鏁堟灉.鍙互璇磋繖鏄粠鍔ㄦ佽綆楀埌闈欐侀澶勭悊鐨勮漿鍙?鏁堢巼鎻愬崌寰堝.
HRESULT DrawIndexedPrimitiveUP(
D3DPRIMITIVETYPE PrimitiveType,
UINT MinVertexIndex,
UINT NumVertices,
UINT PrimitiveCount,
CONST void * pIndexData,
D3DFORMAT IndexDataFormat,
CONST void* pVertexStreamZeroData,
UINT VertexStreamZeroStride
);
榪欓噷鍋囪鎴戜滑瑕佺粯鍒朵竴涓敱2涓笁瑙掑艦緇勬垚鐨勯潰,閭d箞鍙傛暟榪欐牱璁劇疆
MinVertexIndex = 0;
NumVertices = 4;
PrimitiveCount = 2;
pIndexData = { 0,1, 2, 0, 2, 3}
IndexDataFormat = D3DFMT_INDEX16
pVertexStreamZeroData = { 4涓鐨勪綅緗?}
VertexStreamZeroStride = { 緇撴瀯浣撶殑璺ㄥ害 }
鎴戜滑娉ㄦ剰鍒? 娌℃湁浠諱綍涓涓弬鏁扮敤浜庢弿榪?b>CONST void * pIndexData鐨剆ize 澶у皬.
浣嗗叾瀹炰綘鐨勫浘鍏冩槸鍙互姝g‘緇樺埗鐨? 浣嗘槸浣犲茍娌℃湁鍦╥ndexdata鍚庨潰鍔犱笂渚嬪瀛楃涓?鐨勭粨灝懼壇,閭d箞D3D鏄庝箞鐭ラ亾IndexCount鍛?
鎴戜滑鍏堢湅涓嬫庝箞鏍規嵁VertexCount鍙?PrimitveType紜畾 PrimitiveCount
PrimitveType | 鍏紡 |
D3DPT_POINTLIST | PrimitiveCount = VertexCount |
D3DPT_LINELIST | PrimitiveCount = VertexCount/2 |
D3DPT_LINESTRIP | PrimitiveCount = VertexCount-1 |
D3DPT_TRIANGLELIST | PrimitiveCount = VertexCount/3 |
D3DPT_TRIANGLESTRIP | PrimitiveCount = VertexCount-2 |
娉? D3DPT_TRIANGLEFAN鍦ㄤ互鍚庣殑椹卞姩涓凡緇忎笉鍐嶄嬌鐢?鍥犳涓嶅啀閲囩敤
褰撲嬌鐢ㄧ儲寮曠紦鍐叉椂, VertexCount = IndexCount
鍥犳鍦ㄤ笂渚嬩腑 PrimitiveCount = IndexCount/3
涔熷氨鏄 IndexCount = PrimitiveCount * 3
浠e叆PrimitiveCount = 2,鍥犳 IndexCount = 6
鍥犳紼沖畾鐨凙PI鐨勫嚱鏁板弬鏁拌璁℃槸緇濅笉浼氭氮璐逛換浣曚竴涓弬鏁扮殑
float4x4 matBoneArray[40]; // 榪欐槸浼犺緭鐨勭摱棰?/span>
VS_OUTPUT vs_main( SkinnedVS_INPUT In )
{
VS_OUTPUT Out = (VS_OUTPUT)0;
float4x4 skinTransform = 0;
skinTransform += matBoneArray[In.BoneIndices.x] * In.BoneWeights.x;
skinTransform += matBoneArray[In.BoneIndices.y] * In.BoneWeights.y;
skinTransform += matBoneArray[In.BoneIndices.z] * In.BoneWeights.z;
skinTransform += matBoneArray[In.BoneIndices.w] * In.BoneWeights.w;
float4 localpos = mul(In.Position, skinTransform);
Out.Position = mul( localpos, matViewProj );
Out.TexCoord = In.TexCoord;
return Out;
}
matBoneArray榪欎釜鏁扮粍鏄楠肩殑LocalRot鍜孡ocalTranslation 閫氳繃浠ヤ笅鍑芥暟build鍑烘潵
Matrix4& Matrix4::FromTranslationRotation( const Vector3& translation, const Quaternion& rotation )
{
float xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;
float xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;
float yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;
m[0][0] = 1.0f - yy - zz; m[0][1] = xy + zw; m[0][2] = xz - yw; m[0][3] = 0.0f;
m[1][0] = xy - zw; m[1][1] = 1.0f - xx - zz; m[1][2] = yz + xw; m[1][3] = 0.0f;
m[2][0] = xz + yw; m[2][1] = yz - xw; m[2][2] = 1.0f - xx - yy; m[2][3] = 0.0f;
m[3][0] = translation.x; m[3][1] = translation.y; m[3][2] = translation.z; m[3][3] = 1.0f;
return *this;
}
浠庤繖閲屼綘鍙互鍙戠幇, 鏈潵姣忔牴楠ㄥご鍙渶瑕?涓猣loat4 浼犻掑彉鎹俊鎭殑,鐜板湪鍗撮渶瑕?涓猣loat4,涔熷氨鏄竴涓煩闃墊潵浼犻?鐭╅樀涓繕鏈夊緢澶氫笉浣跨敤鐨勫彉閲忎篃琚紶杈撳埌GPU涓?榪欓噷灝辨槸浼樺寲鐨勭偣.
閲嶆柊璋冩暣鍚庣殑Shader浠g爜:
float4x4 BuildFromTransRot( float4 translation, float4 rot )
{
float4 rotation = rot;
float xx = rotation.x * rotation.x * 2.0f, yy = rotation.y * rotation.y * 2.0f, zz = rotation.z * rotation.z * 2.0f;
float xy = rotation.x * rotation.y * 2.0f, zw = rotation.z * rotation.w * 2.0f, xz = rotation.x * rotation.z * 2.0f;
float yw = rotation.y * rotation.w * 2.0f, yz = rotation.y * rotation.z * 2.0f, xw = rotation.x * rotation.w * 2.0f;
float4x4 m = {
{1.0f - yy - zz, xy + zw, xz - yw, 0},
{xy - zw, 1.0f - xx - zz, yz + xw, 0},
{xz + yw, yz - xw, 1.0f - xx - yy, 0},
{translation.x, translation.y, translation.z, 1}
};
return m;
}
float4x4 GetBoneElement( float index )
{
return BuildFromTransRot( vecBoneLocalTrans[index], vecBoneLocalRot[index] );
}
VS_OUTPUT vs_main( SkinnedVS_INPUT In )
{
VS_OUTPUT Out = (VS_OUTPUT)0;
float4x4 skinTransform = 0;
skinTransform += GetBoneElement(In.BoneIndices.x) * In.BoneWeights.x;
skinTransform += GetBoneElement(In.BoneIndices.y) * In.BoneWeights.y;
skinTransform += GetBoneElement(In.BoneIndices.z) * In.BoneWeights.z;
skinTransform += GetBoneElement(In.BoneIndices.w) * In.BoneWeights.w;
float4 localpos = mul(In.Position, skinTransform);
Out.Position = mul( localpos, matViewProj );
Out.TexCoord = In.TexCoord;
return Out;
}
鎴戜滑灝嗛澶寸殑local鏃嬭漿鍙婂亸縐諱紶閫掕嚦GPU,鐒跺悗鍦℅PU鍐呴噸緇?铏界劧瀵笹PU鎬ц兘璁$畻鏈夐儴鍒嗘崯鑰?浣嗘槸楠ㄩ鏁伴噺灝辮兘淇濆畧鎻愰珮鍒?00涓?
http://isdlibrary.intel-dispatch.com/vc/1632/Threading_OGRE3D.pdf
ATI鏈夊叧澶氱嚎紼嬫晥鐜囨彁鍗囩殑娓告垙姣旇緝鍙婁竴浜泃ips
http://developer.amd.com/assets/ATIMThread.pdf
CORE DLL
ENGINE DLL
GAME EXE
D3DRENDER DLL
鍏朵腑D3DRENDER鏄疓AME鍔ㄦ佽澆鍏ョ殑錛屽叾闇瑕侀摼鎺ORE,ENGINE
榪欐槸涓涓緢甯歌鐨勬ā寮忥紝浣嗘槸涓嶅ソ鐨勬槸錛屽洜涓篊ORE鍜孍NGINE鍧囨槸DLL錛屼唬鐮佷腑鐨凷ymbol閮借瀵煎嚭鎵嶅彲浣跨敤銆備換浣曚漢浣跨敤DEPENDENCE宸ュ叿灝卞彲浠ュ皢DLL涓紩鐢ㄧ殑涓滆タ鏌ョ湅鐨勬竻妤氾紝铏界劧榪欎笉鑷充簬閫犳垚鎶鏈硠婕忥紝浣嗕粠閫熷害鍜孌LL澶у皬鏉ヨ閮芥槸涓嶅垝綆楃殑銆?/p>
鐜板湪寰堝娓告垙涓籩xe涓鑸兘鏄?0M+鐢氳嚦20M+鐨勫ぇexe錛岃繖閮芥槸浣跨敤闈欐侀摼鎺ヨ屾垚銆備絾鏄浠g爜緇撴瀯涔熷繀欏誨仛鍑轟竴瀹氱殑璋冩暣銆傛墍鏈夊伐紼嬪繀欏婚兘鏄潤鎬佸簱錛岃繖鏍鋒墠鑳戒繚璇佸儚CORE榪欐牱鐨勯潤鎬佸簱涓殑鍏ㄥ眬/闈欐佸彉閲忎笉鑷充簬琚摼鎺?浠借岄犳垚鍐呭瓨孌甸昏緫閿欒銆?/p>
褰撶劧錛屼嬌鐢ㄥ叏闈欐佸簱榪橀渶瑕佹敞鎰忎竴鐐癸細鎵鏈夌殑lib閮芥槸鍦ㄦ渶鍚庣殑game宸ョ▼閲屾潵鍋氶摼鎺ャ?/p>
UDK鏄痷nrealengine develpoment kit 鐨勭緝鍐欙紝綆鍗曟潵璇村氨鏄ぇ鍚嶉紟榧庣殑铏氬夠錛撳紩鎿庣殑鍏嶈垂鍟嗕笟鐗堟湰錛庝笉榪囪櫄騫伙紦姣曠珶榪樻槸錛斿勾鍓嶇殑dx9鐨勫叆闂ㄧ駭寮曟搸錛屽湪鍟嗕笟涓婂彇寰?br>宸ㄥぇ鎴愬姛錛屾妧鏈笂涔熸樉寰楄惤鍚庯紟鐩墠Epic鎯蟲Θ騫茶櫄騫伙紦鐨勬渶鍚庝竴鐐規綔鍔涳紝浜庢槸騫茶剢鍙戝竷浜嗚繖涓厤璐圭増鏈紟浠諱綍浜洪兘鍙互鐢嫉錛わ極寮鍙戞父鎴忥紝浣嗘槸濡傛灉娓告垙鐗熷埄鐨勮瘽姣忓勾榪樻槸瑕佸悜
Epic浜ょ撼涓瀹氭暟閲忕殑鎶鏈巿鏉冭垂鐢ㄧ殑錛庡厛涓嶇榪欎釜錛岃繕鏄潵鐪嬬湅瀹冪殑瀹樻柟瑙嗛鏁欑▼鍚э紟
銆銆[attach]44[/attach]
閾炬帴濡備笅錛氥銆
http://udn.epicgames.com/Three/VideoTutorials.html
涓鍏憋紩涓暀紼嬨浠庡紩鎿庨厤緗粙緇嶅紑濮嬶紝鍒板叧鍗″拰浜虹墿緙栬緫鍣紝浠ュ強鏈鍚庝竴涓畬鏁寸殑灝忔父鎴忕殑鍒朵綔錛屽浜庡叆闂ㄦ潵璇村畬鍏ㄨ凍澶熶簡錛?br>瑙嗛璇寸殑榪樻瘮杈冭緇嗭紝鍚姏涓嶅ソ鐨勫悓瀛﹀彲浠ュ鐓т笅寮鍙戞枃妗chttp://www.udk.com/documentation銆閲岄潰鍩烘湰璇寸殑寰堣緇嗭紟
鏈鍚庨檮涓婏嫉錛わ極鐨勪笅杞藉湴鍧錛氥March 2010 UDK Beta (548 MB .exe)銆
濂戒簡錛岋嫉錛わ極瀵逛簬鍒濆鑰呮潵璇磋繕鏄瘮杈冮傚悎鐨勶紟瀵逛簬娓告垙鐨勫紑鍙戜漢鍛樻潵璇村紩鎿庣殑鏁翠綋鏋舵瀯榪樻槸寰堝煎緱瀛︿範鐨勶紟甯屾湜浣犲鐨勬剦蹇紟
OGRE鐨凜ompositor鍏跺疄灝辨槸鐢ㄤ簬瑙e喅緇樺埗PostEffect鐨勶紝綆鍗曠殑璇達紝灝辨槸涓縐峈enderTarget鐨勬祦紼嬫帶鍒惰剼鏈?/p>
榪欐槸OGRE compositor鏂囦歡鐨勭墖孌?/p>
compositor Bloom
{
technique
{
// Temporary textures
texture rt_output target_width target_height PF_R8G8B8
texture rt0 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
texture rt1 target_width_scaled 0.25 target_height_scaled 0.25 PF_R8G8B8
target rt_output
{
// Render output from previous compositor (or original scene)
input previous
}
target rt0
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BrightPass2
input 0 rt_output
}
}
target rt1
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BlurV
input 0 rt0
}
}
target rt0
{
// Start with clear texture
input none
// Horizontal blur pass
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BlurH
input 0 rt1
}
}
target_output
{
// Start with clear output
input none
// Draw a fullscreen quad
pass render_quad
{
// Renders a fullscreen quad with a material
material Ogre/Compositor/BloomBlend2
input 0 rt_output
input 1 rt0
}
}
}
}
澶ф鎴戜滑鐭ラ亾錛屼竴涓狢ompositor鍒嗕負璧勬簮瀹氫箟涓庣粯鍒舵楠わ紙target xxx錛?/p>
鑰屼竴涓粯鍒舵楠ゅ張鍒嗗埆瀹氫箟錛?/p>
1. 錛堣緭鍏ワ級緇樺埗鐨勬槸浠涔堜笢瑗匡紵
2. 錛堟晥鏋滐級緇樺埗鎴愪粈涔堟牱瀛愶紵
3. 錛堣緭鍑猴級寰鍝噷緇樺埗錛?/p>
杈撳嚭鏂瑰紡鍦ㄨ繖涓緥瀛愭湁2縐嶏細綰圭悊錛圧T錛夊拰灞忓箷
杈撳叆鏂瑰紡鏈?涓細綰圭悊鍙婂満鏅?/p>
鎴戜滑鍙互浣跨敤涓涓洖璋冩潵瀵逛竴涓粯鍒舵楠ゆ彁渚涚粯鍒惰緭鍏?/p>
緇樺埗鏁堟灉灝辨槸涓澶у爢鐨凷hader錛岃繖浜泂hader閮芥槸鍩轟簬涓涓猶uad鏉ュ仛鐨勶紝涔熷氨鏄竴涓煩褰紝浣跨敤鍙樻崲鍚庣殑欏剁偣鍜屼竴涓汗鐞嗗潗鏍囦綔涓洪《鐐瑰畾涔?/p>
涓嶈繃榪欓噷鏄笉闇瑕佸仛vertexshader鐨勶紝浠呬粎ps瓚崇煟銆?/p>
緇樺埗鐨勬渶鍚庯紝鏄皢鍓嶉潰緇樺埗鐨凴T錛堢汗鐞嗭級娣峰悎璧鋒潵
褰撶劧錛屽鏋滄楠ゆ瘮杈冨鍜屽鏉傛椂錛孯T涔嬮棿璺熷瘎瀛樺櫒涓鏍鳳紝鍙互鍙嶅浣跨敤
鏄劇ず鑼跺6娉曠嚎鐨勫満鏅姞涓?Blur 鐨凱ostEffect
<?xml version="1.0" encoding="gb2312" ?>
<Compositor name = "bloom" >
<Resource>
<RenderTarget name ="rt_source" size="screenquad" />
<RenderTarget name ="rt0" size="screenquad" />
<RenderTarget name ="rt1" size="screenquad" />
</Resource>
<Step target="rt_source">
<Geometry type ="callback" callback = "rt_input"/>
</Step>
<Step target="rt0">
<Geometry type = "screenquad"/>
<Effect name ="material\blurH.xml">
<Texture name ="mTexture" value ="rt_source" />
</Effect>
</Step>
<Step target="rt1">
<Geometry type = "screenquad"/>
<Effect name ="material\blurV.xml">
<Texture name ="mTexture" value ="rt_source" />
</Effect>
</Step>
<Step>
<Geometry type = "screenquad"/>
<Effect name ="material\combine.xml">
<Texture name ="mTexture1" value ="rt0" />
<Texture name ="mTexture2" value ="rt1" />
</Effect>
</Step>
</Compositor>
鍚屾牱閫傜敤鎴戠殑鏂囨湰璁捐鍥炬爣鍑?+涓哄寘鍚? <涓烘淳鐢?
RenderTexture
RenderTarget
<ScreenTarget(寮曟搸鍚姩鏃訛紝鍒濆鍖栧睆騫曞ぇ灝忕殑Viewport)
+RenderView (瀵逛簬涓涓猂T錛屽彲浠ユ槸灞忓箷錛屽彲浠ユ槸綰圭悊RT錛屾墍浠ュ彲浠ユ嫢鏈?1~n涓垏鍒嗚鍥?)
+Camera
+Viewport
浠ヤ笅鏄View緇樺埗鐨勭被XNA浼唬鐮?/p>
Engine.Run()
{
Device.Clear()
// 淇濆瓨褰撳墠鍏ㄥ睆Viewport
ScreenViewport = Device.CurrentViewport
Device.BeginScene()
// 閬嶅巻褰撳墠灞忓箷RT涓嬬殑鎵鏈塚iew
foreach RenderView in ScreenRT
{
// 鏈縺媧葷殑View涓嶇敤緇樺埗
if RenderView not active then continue
// 灝哣iew瀵瑰簲鐨刅iewport鎻愪氦鍒拌澶?
RenderView.CommitViewport()
// 娓叉煋鍥炶皟
foreach RenderEventListener in RenderEventListenerList
{
RenderEventListener.OnRenderFrame()
}
}
Device.EndScene()
Device.Present()
Device.CurrentViewport = ScreenViewport // 鎭㈠鍏ㄥ睆viewport
}
浠ヤ笅鏄疪T闂村祵濂楃粯鍒剁殑浼唬鐮侊細
RenderView.SwitchRenderTarget(stage, RenderTarget)
{
// 淇濆瓨緇樺埗鍓嶇殑RT
PreTarget = Device.GetRenderTarget()
// 璁劇疆涓哄綋鍓嶇殑RT
Device.SetRenderTarget( RenderTarget )
// 鏇存柊RT鎽勫儚鏈?/span>
RenderTarget.UpdateCamera()
// 娓呯┖RT
Device.Clear()
// 緇樺埗鍥炶皟
RenderTarget.OnRender( )
// 鎭㈠涔嬪墠鐨凴T
Device.SetRenderTarget( PreTarget );
}
鎴戠殑鐭╅樀瀹氫箟璺烵GRE鐨勬病浠涔堝尯鍒?/p>
union
{
struct
{
float m11, m12, m13, m14;
float m21, m22, m23, m24;
float m31, m32, m33, m34;
float m41, m42, m43, m44;
};
float m[4][4];
};
涔樻硶涔熻窡OGRE鐨勪竴妯′竴鏍鳳紝浣嗗湪灝唙iew鍙妏roject涔樺ソ鐨勭煩闃甸佺粰HLSL鏃訛紝鍗村繀欏昏漿緗笅錛屾墠鑳藉緱鍒版紜殑緇撴灉
mSkinnedEffect.mMatrix.mValue = (camera.mViewMatrix * camera.mProjectMatrix).Transpose();
shader:
float4 localpos = mul(In.Position, skinTransform);
OGRE涓湁榪欎箞涓孌典唬鐮佸強娉ㄩ噴:
const Matrix4& AutoParamDataSource::getProjectionMatrix(void) const
{
if (mProjMatrixDirty)
{
// NB use API-independent projection matrix since GPU programs
// bypass the API-specific handedness and use right-handed coords
if (mCurrentRenderable && mCurrentRenderable->getUseIdentityProjection())
{
// Use identity projection matrix, still need to take RS depth into account.
RenderSystem* rs = Root::getSingleton().getRenderSystem();
rs->_convertProjectionMatrix(Matrix4::IDENTITY, mProjectionMatrix, true);
}
else
{
mProjectionMatrix = mCurrentCamera->getProjectionMatrixWithRSDepth();
}
if (mCurrentRenderTarget && mCurrentRenderTarget->requiresTextureFlipping())
{
// Because we're not using setProjectionMatrix, this needs to be done here
// Invert transformed y
mProjectionMatrix[1][0] = -mProjectionMatrix[1][0];
mProjectionMatrix[1][1] = -mProjectionMatrix[1][1];
mProjectionMatrix[1][2] = -mProjectionMatrix[1][2];
mProjectionMatrix[1][3] = -mProjectionMatrix[1][3];
}
mProjMatrixDirty = false;
}
return mProjectionMatrix;
}
璨屼技鏄窡宸﹀彸鎵嬭繖涓伓蹇冪殑涓滆タ鏈夊叧緋?/p>
鍥炵湅DirectXSDK涓彁渚涚殑BasicHLSL渚嬪瓙
mWorld = g_mCenterWorld * *g_Camera.GetWorldMatrix();
mProj = *g_Camera.GetProjMatrix();
mView = *g_Camera.GetViewMatrix();
mWorldViewProjection = mWorld * mView * mProj;
V( g_pEffect->SetMatrix( "g_mWorldViewProjection", &mWorldViewProjection ) );
shader錛?/p>
Output.Position = mul(vAnimatedPos, g_mWorldViewProjection);
涓濇鏃犻渶杞疆鐭╅樀,Effect鎺ュ彛涓篃鎻愪緵鏈塖etMatrixTranspose榪欑被鏂規硶銆傛墍浠ユ帓闄ゅ唴閮ㄦ湁鑷姩杞疆鐨勫珜鐤戙?/p>
璇㈤棶榪囬噹鐚繖涓棶棰橈紝閲庣尓絳旀洶:"杞疆鍚庝紶杈撹嚦闇瑕佷紶3涓獀ector, 鏈鍚庝竴涓槸[0 0 0 1]鈥?
鏈夎揪浜虹煡閬撶殑錛屽彲浠ユ寚鐐逛笅榪鋒觸 :)
MAX鎻掍歡瀵煎嚭鐨勬ā鍨嬭祫婧愬垎錛歁esh/Skin, Skeleton, Animation
涓嶅悓鍔ㄤ綔鎸夌収涓嶅悓鐨勫姩鐢繪枃浠朵繚瀛?
ResourceHandle 鍖呭惈鍩烘湰id
>NamedResourceHandle 甯︽湁鍚嶇О璧勬簮錛屽寘鍚玥ashA, hashB錛?浣跨敤鏆撮洩hash鍑芥暟鐢熸垚
>ModelHandle
>MeshHandle
>SkeletonHandle
>AnimationHandle
鑾峰彇璧勬簮錛屽鏋滆祫婧愪笉瀛樺湪鏃訛紝鑷姩鍔犺澆
ModelMaster.ManualCache( &ModelHandle )
鐩存帴璧勬簮璁塊棶錛?br>RawSkeleton = ModelMaster.ManualCache( &SkeletonHandle("a.skl") )
RawSkeleton->GetMarker(...)
寮傛璧勬簮鍔犺澆錛屽紓姝d淇濆瓨浜嶮odelHandle涓紝鍦╟allback涓牴鎹甶d紜
ModelMaster.AsyncCache( &ModelHandle )
鑾峰彇璧勬簮鎸囬拡錛屾湭鍔犺澆鏃訛紝榪斿洖絀?br>ModelResource = ModelMaster.Fetch( &ModelHandle )
妯″瀷璧勬簮鍔犺澆鍣?br> 鍦ㄦā鍨嬪彞鏌勪腑緇戝畾瀵瑰簲鍔犺澆鍣?br> 鍙互鑷緙栧啓甯︽崲瑁呯殑ModelLoader錛岄氳繃璇誨彇鑷繁鐨勯厤緗枃浠訛紝鑷鍔犺澆璧勬簮鍚庣敓鎴怰awModel
ModelLoader
ModelHandle ---mapping---> ModelLoader ---generate--> RawModel
MeshHandle ---mapping---> MeshLoader ---generate--> RawMesh
SkeletonHandle ---mapping---> SkeletonLoader ---generate--> RawSkeleton
AnimationHandle ---mapping---> AnimationLoader ---generate--> RawAnimation
寮曠敤璁℃暟綾?nbsp;
ModelResource
>RawModel
>RawMesh
>RawSkeleton
>RawAnimation
RawModel涓笉淇濈暀Handle錛屽彧淇濈暀鎸囬拡
RawModel
+MeshVB 浠庢ā鍨嬫枃浠朵腑鐩存帴璇誨彇欏剁偣鏍煎紡錛屽寘鍚?闈欐?GPU,CPU綾誨瀷欏剁偣
+RawMesh
+MeshIB 涓嬈℃у~鍏匢B
>GPUMeshVB 涓嬈℃у~鍏匳B
>CPUMeshVB 姣忓撫璁$畻
+Animation 榪愯鏈熸暟鎹紙鏃墮棿/甯э級
+RawAnimation 鍘熷鍔ㄧ敾鍐呭
+Skeleton
+RawSkeleton
1. ASM Shader鏄渶鍏冭佺殑涔熸槸DX8涓昏浣跨敤Shader
2. fxc緙栬瘧鍣ㄥ彲浠ュ悓鏃剁紪璇慉SM,HLSL鍜宖x鑴氭湰,鍏朵腑HLSL鍜宖x鍙互鏌ョ湅緙栬瘧鍚庣殑GPU姹囩紪浠g爜
3. D3D9涓紝fx鏄疕LSL鐨勪竴縐嶆覆鏌撹剼鏈紝綆鍖栦簡HLSL璁劇疆鍙婂父閲忕粦瀹氾紝騫朵笖闄勫甫RenderStateBlock鍙婅緗?/p>
浣嗗彧鑳界敤浜庡埗浣滅畝鍗曠殑Shader
4. DirectXSDK涓湁涓涓蹇墊販娣嗭細C++渚嬪瓙涓殑BasicHLSL浣跨敤鐨勫叾瀹炶繕鏄痜x錛孒LSLwithoutEffects渚嬪瓙鎵嶆槸鐪熸鐨勭函HLSL
5.fx涓嶩LSL紼嬪簭閴村埆錛?/p>
浣跨敤fx紼嬪簭蹇呭畾鍚湁錛欴3DXCreateEffectXXX 緋誨垪鍑芥暟錛?ID3DXEffect瀵硅薄錛屾覆鏌撲腑鑳界湅鍒癝etTechnique錛孊eginPass錛孍ndPass涔嬬被鐨勫瓧鐪?/p>
浣跨敤綰疕LSL紼嬪簭鍚湁錛欴3DXCompileShader錛孖D3DXConstantTable瀵硅薄錛孏etConstantByName錛孏etConstantDesc涔嬬被鐨勫瓧鐪?/p>
6. 鍦╢x涓寘鍚湁 VertexShader錛孭ixelShader浠g爜鍙妏rofile錛宔ntry錛孯enderState璁劇疆鍙婄畝鍗曠殑緇樺埗榪囩▼(pass)銆備竴嬈$紪璇戝悗錛孷S,PS,Texture,Sampler鍙婂父閲忛兘鏄湪ID3DXEffect瀵硅薄涓嚜鍔ㄥ畬鎴愶紝鏃犻渶鎵嬪姩璁劇疆銆?/p>
7. HLSL鍙互灝哣S鍙奝S浠g爜鍐欏叆1涓?hlsl鏂囦歡銆傛敞鎰忥紝浠ヤ笅榪欑浠g爜鍙互鍦℉LSL涓紪璇戣繃錛屼絾瀹為檯娌℃湁浠諱綍鏁堟灉
1: sampler_state
2: {
3: Texture = <tex>;
4: MipFilter = LINEAR;
5: MinFilter = LINEAR;
6: MagFilter = LINEAR;
7: };
榪欑偣鍙互鍙傝傾MD RenderMonkey涓彧鍦╯hader涓嬌鐢╯ampler鑰屽拷鐣exture銆?/p>
8. fx涓線shader璁劇疆綰圭悊浣跨敤鐨勬槸ID3DXBaseEffect::SetTexture涓嬬殑榪欎釜鍑芥暟
1: HRESULT SetTexture(
2: D3DXHANDLE hParameter,
3: LPDIRECT3DBASETEXTURE9 pTexture
4: );
浣嗘槸鍦℉LSL涓紝榪欑偣灝卞彉寰楀緢楹葷儲錛岄渶瑕佹墜鍔ㄨ緗紝鍙互鍙傝冭繖綃?a href="http://www.shnenglu.com/liangairan/articles/57971.html">鏂囩珷
Shader浠g爜鐗囨錛?/p>
1: sampler Samp0 = sampler_state
2: {
3: Texture = <Tex0>;
4: MipFilter = LINEAR;
5: MinFilter = LINEAR;
6: MagFilter = LINEAR;
7: };
緙栬瘧HLSL浠g爜鍚庡緱鍒癈onstantTable錛岀劧鍚庡彇鍑哄彞鏌勶細
1: ScalarHandle = pixelConstTable->GetConstantByName(0, "Scalar");
2:
3: Samp0Handle = pixelConstTable->GetConstantByName(0, "Samp0");
4:
5: Samp1Handle = pixelConstTable->GetConstantByName(0, "Samp1");
鍐嶄粠鍙ユ焺鍙栧嚭symbol鐨勬弿榪幫細
1: UINT count;
2:
3: pixelConstTable->GetConstantDesc(Samp0Handle, & Samp0Desc, &count);
4:
5: pixelConstTable->GetConstantDesc(Samp1Handle, & Samp1Desc, &count);
閫氳繃涓婇潰鐨勬弿榪幫紝灝嗙汗鐞嗗彉閲忕殑瀵勫瓨鍣ㄥ亸縐諱綔涓虹汗鐞嗙殑stage
8. 浼樺寲甯擱噺璁劇疆閫熷害鐨勬柟娉曚竴鑸氨鏄牴鎹瓧絎︿覆鍙栧嚭鍙ユ焺錛屼互鍚庢瘡嬈℃覆鏌撴椂錛屽彧閫氳繃鍙ユ焺璁劇疆銆備絾ID3DXConstantTable鏈鍚庤繕鏄氳繃
IDirect3DDevice9::SetPixelShaderConstantX 緋誨垪鍑芥暟鏉ュ疄鐜扮殑
1: HRESULT SetPixelShaderConstantF(
2: UINT StartRegister,
3: CONST float * pConstantData,
4: UINT Vector4fCount
5: );
9. HLSL灝嗕竴孌靛寘鍚玍S鍜孭S浠g爜緙栬瘧瀹屾垚鍚庯紝灝嗗緱鍒癡S鍜孭S涓や釜鍗曠嫭鐨処D3DXConstantTable
鏈榪戝湪鍐橠3D9妯℃嫙D3D10鎺ュ彛鐨勬覆鏌撶郴緇熶腑紕板埌澶ч噺鐨勬覆鏌撶姸鎬佸璞★紝涓嶄粎鎴愬憳澶氾紝鏋氫婦涔熷鐨勮鍛姐?/p>
struct CORE_API RasterizerState : ResourceHandle { eFillMode mFillMode; eCullMode mCullMode; bool mFrontFaceCCW; float mDepthBias; float mSlopeScaledDepthBias; bool mDepthClipEnable; bool mScissorEnable; bool mMultisampleEnable; RasterizerState(); };
鑰岃浠庨厤緗枃浠朵腑璇誨彇鏁版嵁騫跺~鍏呭埌榪欎釜緇撴瀯浣擄紝瀵逛簬C++鏉ヨ瀹屽叏灝辨槸鍚冨姏涓嶈濂界殑錛屽啓鍑烘潵鐨勪唬鐮佷篃鏄瀬涓鴻繃紼嬶紝淇敼鍜屾墿灞曟瀬涓洪夯鐑︾殑銆?/p>
鍥犳鍐沖畾浣跨敤鍙嶅皠鐨勬柟娉曟潵濉厖鏁版嵁錛屽厛鎬葷粨涓涓嬫垜鐨凜++鍙嶅皠緋葷粺
class RTTIObject // 鍔ㄦ佺被鍨嬭瘑鍒璞″熀綾伙紝瀵硅薄閫氳繃涓浜涘畯鍚庡彲浠ュ緢鏂逛究鐨勯氳繃瀛楃涓插垱寤哄嚭綾誨疄渚嬶紝騫朵笖鍙互鏌ヨ娉ㄥ唽鏃剁殑綾誨瀷鍜屽叾浠栫粦瀹氫俊鎭?/span> class NameRef // 鍚嶅瓧琛紝綾諱技浜庤櫄騫諱腑鐨凢Name錛屽彲浠ュ畾涔塁onst鍜屾櫘閫歂ame錛屾瘮杈冨拰鎷瘋礉鍙槸涓涓猟word鑰楄垂鐨勬椂闂?/span> value_parse錛寁alue_tostring錛寁alue_typename // 涓緋誨垪綾誨瀷妯℃澘鍑芥暟錛屾彁渚涘綾誨瀷鐨凾oString錛孭arse鍙婄被鍨嬪悕鏌ヨ
棣栧厛闇瑕佸鐞嗙殑鏄灇涓炬煡璇紝榪欓噷灝嗘灇涓鵑氳繃瀹忓仛鎴愪竴涓釜鏋氫婦瀵硅薄錛屽茍鍙互閫氳繃鍚嶅瓧鍒涘緩瀹炰緥
#define DECLARE_ENUMOBJECT( TEnum ) \ struct EnumObject_##TEnum : EnumObject\ {\ DECLARE_RTTIOBJECT( EnumObject_##TEnum );\ EnumObject_##TEnum( );\ }; #define IMPLEMENT_ENUMOBJECT_BEGIN( TEnum, TEnum_prefixoffset, TMember_prefixoffset ) \ IMPLEMENT_RTTIOBJECT_STRING( EnumObject_##TEnum, #TEnum + TEnum_prefixoffset, #TEnum + TEnum_prefixoffset, "EnumObject" )\ EnumObject_##TEnum::EnumObject_##TEnum(){ const int member_prefixoffset = TMember_prefixoffset; #define ENUMOBJECT_ADD( enumkey ) AddMember( #enumkey + member_prefixoffset, (dword)enumkey ); #define IMPLEMENT_ENUMOBJECT_END } #define ENUMOBJECT_STATICINIT( TEnum ) EnumObject_##TEnum::StaticInit();
EnumObject 涓氳繃瀹忓皢鏋氫婦鐨勫悕縐板拰鍊間繚瀛樺湪榪欎釜瀵硅薄涓?/p>
IMPLEMENT_ENUMOBJECT_BEGIN( eFillMode, 1, 3 ) // 榪欓噷鐨?錛?鏄皢eFillMode鍙奆M_Point杞垚瀛楃涓插悗鍘繪帀鍓嶇紑 ENUMOBJECT_ADD( FM_Point ) ENUMOBJECT_ADD( FM_Line ) ENUMOBJECT_ADD( FM_Fill ) IMPLEMENT_ENUMOBJECT_END // 娉ㄥ唽鍒癛TTIObject緋葷粺 ENUMOBJECT_STATICINIT( eFillMode )
// 閫氳繃鏋氫婦瀵硅薄鍙互鏌ユ壘鍒板瓧絎︿覆瀵瑰簲鐨勫?/span> dword v; EnumObject::GetEnumValue( "FillMode", "Point", v )
涓嬩竴姝ユ槸灝嗙粨鏋勪綋鎴愬憳淇℃伅璁板綍
void SettingObject::BindMember( const NameRef& objname, void* instancePtr, void* dataPtr, SettingProxy* proxy ) { proxy->mOffset = dword(dataPtr) - dword(instancePtr); MemberList& memberlist = mSettingMap[ objname ]; memberlist[ proxy->mName ] = proxy; }
榪欓噷璁板綍鐨勬槸緇撴瀯浣撴垚鍛樼殑鍐呭瓨鍋忕Щ
浣跨敤澶ч噺鐨勫畯錛屽彲浠ヨ緇撴瀯浣撶粦瀹氬彉寰楁紓浜?/p>
#define BIND_SETTINGOBJECT_BEGIN( TClass ) \ { const NameRef& soname = TClass::StaticGetClassInfo()->mClassName;TClass soobj; #define BIND_SO_MEMBER( TMemberType, TMember ) \ so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(#TMember + 1 ) ); #define BIND_SO_MEMBER_NAME( TMemberType, TMember, TName ) \ so.BindMember( soname, &soobj, &soobj.TMember, new TSettingElement<TMemberType>(TName) ); #define BIND_SO_ENUM( TEnumType, TMember ) \ so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(#TMember + 1, #TEnumType + 1) ); #define BIND_SO_ENUM_NAME( TEnumType, TMember, TName ) \ so.BindMember( soname, &soobj, &soobj.TMember, new TSettingEnum(TName, #TEnumType + 1) ); #define BIND_SETTINGOBJECT_END }
緇戝畾浠g爜濡備笅
BIND_SETTINGOBJECT_BEGIN( RasterizerState ) BIND_SO_ENUM ( eFillMode , mFillMode ) BIND_SO_ENUM ( eCullMode , mCullMode ) BIND_SO_MEMBER ( bool , mFrontFaceCCW ) BIND_SO_MEMBER ( float , mDepthBias ) BIND_SO_MEMBER ( float , mSlopeScaledDepthBias) BIND_SO_MEMBER ( bool , mDepthClipEnable) BIND_SO_MEMBER ( bool , mScissorEnable) BIND_SO_MEMBER ( bool , mMultisampleEnable) BIND_SETTINGOBJECT_END
鎵鏈夌粨鏋勪綋鐨勪俊鎭璁板綍鍦⊿ettingObject涓紝璇誨彇閰嶇疆鏂囦歡濉厖緇撴瀯浣撶殑浠誨姟灝卞彉寰楀紓甯哥殑綆鍗曚簡
SettingObject settings;
// 灝嗘墍鏈夌殑緇撴瀯浣撲俊鎭褰?/span>
InitRenderStateObjectSetting( settings );
const NameRef& rzname = DepthStencilState::StaticGetClassInfo()->mClassName;
DepthStencilState a;
// 榪欓噷灝辨槸灝嗛厤緗枃浠剁殑淇℃伅濉厖鍒扮粨鏋勪綋
settings.SetMember( rzname, &a, "BackFace.StencilFunc", "Equal" );
1. 鍘繪帀Effect緋葷粺錛屾敼鐢℉LSL + 娓叉煋鑴氭湰
2. 浼樺寲娓叉煋鎺ュ彛錛屼嬌鐢ㄦ潗璐ㄧ粺涓shader鍜屾覆鏌撶姸鎬?/p>
闅忓嵆鍙傝冧簡DirectX SDK鐨凣raphics閮ㄥ垎鏂囨。錛欴irectX9 鏃朵唬鐨凟ffect緋葷粺綰補鍙槸涓涓狧LSL鐨勭畝鍗曟覆鏌撹剼鏈疄鐜幫紝闄や簡DXUT錛孎XComposer絳夋瀬灝戠▼搴忎嬌鐢ㄨ繖濂椾笢瑗垮錛屽ぇ鍨嬬殑寮曟搸寰堝皯浣跨敤榪欑鍗婃垚鍝佺郴緇熴傚埌浜咲irectX10鐢氳嚦11錛屽洜涓烘灦鏋勬洿鏀癸紝鍘繪帀鍥哄畾綆$嚎錛屽洜姝ffect鎴愪負杈冧負楂樻晥鍜屼究鎹風殑娓叉煋鑴氭湰錛屽鏋滀笉鏄姹傝緝楂樼殑3d寮曟搸錛屼竴鑸殑娓告垙浣跨敤DirectX10鐨凟ffect娓叉煋鑴氭湰榪樻槸寰堜笉閿欑殑銆?/p>
DX10鐨刦x鑴氭湰涓嶥X9鐨勫樊寮傚湪浜?/p>
娓叉煋鐘舵侊紝閲囨牱鍣ㄧ姸鎬佺瓑閮藉彉涓哄璞★紝騫朵笌API楂樺害緇熶竴
鍦ㄨ剼鏈笌API涓潎鍙互璁劇疆
DepthStencilState EnableDepth
{
DepthEnable = TRUE;
DepthWriteMask = ALL;
DepthFunc = LESS_EQUAL;
};
BlendState NoBlending
{
AlphaToCoverageEnable = FALSE;
BlendEnable[0] = FALSE;
};
technique10 Render
{
pass P0
{
SetDepthStencilState( EnableDepth, 0 );
SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
}
}
鏈漢瑙夊緱錛岃繖鏍風殑璁捐璁╁浘褰PI鏇翠負鏁忔嵎涓庡綊綾誨寲錛屽彟澶栵紝涔熶究浜嶴tateManager鎴栬呰嚜宸卞仛娓叉煋鐘舵佽漿縐誨強宸紓姣旇緝鏃舵洿涓洪珮鏁?
Vista鎿嶄綔緋葷粺鎺ㄥ嚭寰堜箙鍚庯紝DX10鐨勬樉鍗′篃鍗犳湁浜嗗ぇ閲忕殑甯傚満浠介銆備絾鏄敱浜嶥X10浠嶇劧鏄竴涓繃娓PI錛堢被浼間簬DX8)錛屽洜姝わ紝寰堝3D娓告垙瑕佷箞浠嶇劧鏀寔DX9錛岃涓嶇劧鍗蟲敮鎸丏X9涔熸敮鎸丏X10錛岀敋鑷矰X11.
鐪嬪崥瀹笂鏈夎揪浜虹粍鍥㈢紪鍐欑被浼糄X10鎺ュ彛鍜岀郴緇熺殑杞覆鏌擄紝DX10鐨勮璁℃槸浼樼鐨勩傚洜姝わ紝鍦―X9 HLSL鍩虹涓婏紝緇撳悎鑷繁緙栧啓鐨勬覆鏌撹剼鏈細鏄潪甯稿ソ鐨勯夋嫨銆?
娓叉煋鑴氭湰鎴戠殑璁捐鎬濊礬鏄繖鏍風殑錛?
1. 鍙槸涓縐嶉澶勭悊鑴氭湰錛屽茍闈炲疄鏃惰繍琛岃剼鏈?
緙栬瘧鍣ㄥ皢鏂囨湰瑙f瀽鍚庯紝杞寲涓轟竴浜涜繍琛屾寚浠わ紝姣斿錛氭湰pass浣跨敤涓鍧楀皬綰圭悊錛屼笅涓pass鐨則arget鏄繖涓汗鐞嗭紝騫朵笖寮鍚摢浜涙覆鏌撶姸鎬併?
2. 鑷畾涔夋牸寮忕殑瑙f瀽鑴氭湰銆?
浣跨敤lua錛宲ython絳夎剼鏈叾瀹炰篃鏄彲浠ョ殑銆備絾鏄湪鍑虹幇閿欒鏃訛紝鎶ュ嚭鐨勯敊鍙兘浼氳涓嶇啛鎮夎繖涓剼鏈璦鐨勪漢鑾悕鍏跺銆?
浣跨敤鏉鵑紶sq鑴氭湰璇█錛熷彲鎯滃叾鍦╨ua鍩虹涓婏紝瀵箃able鐨剆lot鍒濇璧嬪兼椂蹇呴』浣跨敤<-鑰屼笉鏄粺涓浣跨敤=錛屽洜姝や細璁╀綘鐨勮剼鏈█濂囧彜鎬?
XML鑴氭湰錛?XML鍙互閬垮厤澶嶆潅鐨勮娉曟鏌ワ紝鍐欏畬灝辨槸褰掓暣鐨勶紝浣嗕篃鏄綏鍡︾殑錛屾湰鏉exture[2]鍙互琛ㄨ揪瀹屾瘯鐨勶紝闈炶<Texture index = 2/>鏉ョ綏鍡︿笅銆?
OGRE鐨刢ompositor鑴氭湰鍜屾潗璐ㄨ剼鏈氨鏄嚜宸辮В鏋愮殑錛屼笉榪囧嚭涔庨鏂欑殑浣跨敤浜咮NF鑼冨紡榪欑被杈冧負姝h鐨勬柟娉曘傝繖灝辨槸璇達紝闇瑕佸厛瑙f瀽BNF琛ㄨ揪寮忥紝鐒跺悗鍐嶈緭鍏ヨ剼鏈В鏋愶紝緙栧啓榪囩▼鍜岀郴緇熷鏉傚害浼氬彉寰楀紓甯稿鏉傘?
鏈緇堥夋嫨榪樻槸浣跨敤鑷繁瑙f瀽鐨勮剼鏈紝浣跨敤涓浜涘叿浣撲唬鐮佺粨鏋勬潵鏇夸唬BNF榪欑被楂樻繁鐨勪笢瑗?
鍐沖畾浠ュ悗錛屼笅涓姝ラ渶瑕佸埗瀹氭覆鏌撹剼鏈叿浣撳悇閮ㄥ垎鍙婂埗浣滆繃紼?
1. 鍩烘湰lexer
浠庢枃鏈緱鍒板悇縐峵oken
1. 娓叉煋鐘舵佸璞?
鐓х潃DX10鎶勫氨濂?
2. Shader瀵煎叆鍙?
shader鏂囦歡鏉ヨ嚜浜庝綍澶勶紝鍏ュ彛鎬庢牱瀹氫箟
3. 娓叉煋鑴氭湰VM鍙婃寚浠?
鍐沖畾涓涓汗鐞嗘庢牱璁劇疆錛孯enderTarget鎬庢牱浣跨敤絳夌殑鎸囦護