锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鍥炲埌涓婚錛岃褰曚竴涓嬮暅闈㈠弽灝勭煩闃電殑鎺ㄥ銆?/p> 鍦ㄧ敤Irrlicht鍜孯TT鍋氶暅闈㈡晥鏋滅殑鏃跺欙紝鐢ㄥ埌浜?jiǎn)鍙崬畡鐭╅橖c(diǎn)?灝辨槸闇瑕佹妸鎽勭浉鏈洪暅鍍忥紝娓叉煋涓涓猂T錛岃創(chuàng)鍒伴暅闈㈡ā鍨嬩笂銆傝繖涓叾瀹炶繕綰犵粨浜?jiǎn)璁镐箙锛屽洜湄?fù)涔嬪墠鍋氭按闈㈡覆鏌撶殑鏃跺欙紝姘撮潰鏄鉤鐨勶紝寰堝ソ璁$畻鎽勭浉鏈哄湪姘撮潰浠ヤ笅鐨勪綅緗?浣嗘槸鎹㈡垚闀滈潰錛屽氨涓嶄竴鏍蜂簡(jiǎn)錛屽洜涓洪暅闈㈠彲鑳芥槸浠繪剰闈€?浜庢槸灝遍渶瑕佷竴涓氱敤鐨勫弽灝勭煩闃點(diǎn)?/p> 鍙嶅皠鐭╅樀鐨勮綆楁槸鍩轟簬騫抽潰鐨勶紝鍥犱負(fù)錛屼換浣曞弽灝勶紝閮介渶瑕佷竴涓弽灝勯潰銆?/p> 鎵浠ワ紝鎴戜滑鍏堢粰鍑哄鉤闈㈣〃紺?Plane(nx,ny,nz,d); 鍏朵腑(nx,ny,nz)宸茬粡鍗曚綅鍖栥?/p> 鐒跺悗錛屾垜浠亣璁劇┖闂翠腑鏈変換鎰忎竴鐐筆(x,y,z,1) 璁捐繖涓偣P浠lane涓哄弽灝勯潰鐨勯暅鍍忕偣涓篜1(x1,y1,z1,w)銆?/p> 錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛嶏紞錛?/p> 鏍規(guī)嵁瀹氱悊錛屾垜浠煡閬擄紝 鑻ヤ袱涓偣浠ユ煇涓鐐逛負(fù)闀滃儚錛屽垯涓や釜鐐圭殑鍧愭爣涔嬪拰闄や互2錛屽氨鍒氬ソ鏄腑鐐廣? 榪欎釜鐞嗚鎴戜滑鐢ㄥ埌榪欓噷鐨勮瘽錛?閭h繖涓腑鐐瑰氨鍒氬ソ鏄鉤闈笂鐨勪竴涓偣銆?騫抽潰涓婄殑榪欎釜鐐瑰氨鏄?P(x,y,z,1) - (nx,ny,nz,0)*D . 鍏朵腑D灝辨槸鐐筆鍒板鉤闈㈢殑璺濈 鑰孌=Plane dot P = (x*nx+y*ny+z*nz+d); 鐢變笂闈㈢殑鎻忚堪錛屾垜浠┈涓婃兂鍒幫紝閭d箞瑕佹眰鐐筆1鐨勮瘽錛屽氨鏄繖鏍?nbsp; (P+P1)/2 = P(x,y,z,1) - (nx,ny,nz,0)*D => P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*D =>P1 = P(x,y,z,1) - 2(nx,ny,nz,0)*(x*nx+y*ny+z*nz+d) 鎹㈡垚鐭╅樀褰㈠紡鍒欎負(fù) 锝?-2*nx*nx -2*nx*ny -2*nx*nz 0 | | -2*ny*nx 1 - 2*ny*ny -2*ny*nz 0 | P1 = {x,y,z,1} x | -2*nz*nx -2*nz*ny 1-2*nz*nz 0 | | -2*d*nx -2*d*ny -2*d*nz 1 | 澶у姛鍛婃垚 btw:榪欐槸琛屼富鐭╅樀琛ㄧず娉?/p> 鐩墠鍦ㄦ鐮斿彂涓殑欏圭洰 銆婂笣鍥芥潵浜?jiǎn)銆?/p> http://v.ku6.com/show/1zMrlsOx0nwpQw3JMoNAjw...html 緇х埞濡堟誨姩鍛樹箣鍚庣殑絎簩涓駭鍝?銆婂ぇ璇濅慨浠欍?錛堝ぉ鍦板姭WEB) 澶勫コ浣?銆婄埞濡堟誨姩鍛樸?鍝庯紝絎竴嬈★紝緇欎簡(jiǎn)瀹冦? http://www.87kd.com/game/dmzdy/ 鍏徃璁╂垜浠涔?fàn)瀹炴垬缁忛獙锛屼复鏃跺弬涓庝簡(jiǎn)涓や釜鏈堢殑銆婁簲铏庝笂灝嗐?/p> 絎竴涓狥ALSH鎶鏈疍EMO KINGDOM RUSH http://www.shnenglu.com/Leaf/archive/2013/02/22/198012.html HALO 3D寮曟搸DEMO婕旂ず http://www.shnenglu.com/Leaf/archive/2013/02/22/198011.html 2閮ㄧ殑銆婂ぉ鍦板姭銆?/p> http://tdj.sjgame.cn/main.html 鍦ㄦ父鎴忓紑鍙戠殑閬撹礬涓婏紝鎴戞兂鎴戜緷鐒朵細(xì)緇х畫鍔姏銆佸鏂椼?鐢熺敓涓嶆伅錛屼笉紱諱笉寮冦傘傘傘?/p>
鏈榪戝湪鐢╥rrlicht鍋氫竴涓?D璇曡。闂寸殑灝忛」鐩紝涓轟簡(jiǎn)緇欓」鐩娣葷偣鑺辨牱錛屼簬鏄兂瀹炵幇涓闈㈤暅瀛愩?/p>
鎴戣寰桪3D榫欎功涓婃湁涓涓嬌鐢ㄦā鏉跨紦鍐插尯瀹炵幇鐨勪緥瀛愩傜綉涓婁篃鏈塐PENGL瀹炵幇鐨勪緥瀛愩?浣嗚繖涓嬈★紝鎴戞兂鐢╥rrlicht鐨凴TT瀹炵幇涓闈㈤暅瀛愭晥鏋溿?/p>
鍏跺疄鍘熺悊鍜屾按闈㈠弽灝勫師鐞嗘槸涓鏍風(fēng)殑錛?鍙槸娌℃湁鍔犳壈鍔ㄨ屽凡
絎竴姝ワ細(xì)娓叉煋鍙嶅皠璐村浘
鍙嶅皠璐村浘鐨勬覆鏌擄紝鍏跺疄灝辨槸灝嗘憚鐩告満閫氳繃闀滈潰闀滃儚鍗沖彲錛宨rrlicht涓垜鎵句簡(jiǎn)鍗婂ぉ錛屾病鏈夊彂鐜伴暅鍍忕煩闃電殑綆楁硶錛屽掓槸鍦ㄧ綉涓婃悳鍒頒簡(jiǎn)涓涓?寰堟槸涓嶉敊銆?/p>
鍚屾椂錛屼篃緲婚槄浜?jiǎn)涓涓嬪厛鍓嶅叕鍙稿紩鎿庨」鐩殑浠g爜錛屽彂鐜板叾瀹炲氨鏄偅涓叕寮忋?鏈夊叴瓚g殑鏈嬪弸鍙互鍙傜湅榪欓噷
http://www.cnblogs.com/glshader/archive/2010/11/02/1866971.html
閫氳繃榪欎釜闀滈潰鍙嶅皠鐭╅樀錛屾垜浠彲浠ュ皢鎽勭浉鏈洪暅鍍忥紝 鐩稿綋浜庢槸浠庨暅瀛愰噷鍚戝鐪嬶紝娓叉煋鍑轟竴涓笘鐣屻?鍦ㄦ覆鏌撶殑鏃跺欙紝瑕佽寰楄緗鍓潰銆?鍦ㄦ垜鐨勬祴璇曚腑鎴戞病鏈夎緗?/p>
絎簩姝ワ細(xì)閲嶆柊娓叉煋涓栫晫
閲嶆柊娓叉煋涓栫晫鐨勬椂鍊欙紝闀滃瓙闇瑕佷竴涓壒孌婄殑綰圭悊鏉ヨ繘琛屽弽灝勮創(chuàng)鍥俱傦紙闀滃儚鎽勭浉鏈虹┖闂寸殑鎶曞獎(jiǎng)綰圭悊鏄犲皠錛夈?榪欎釜璐村浘鏂瑰紡錛屽氨鏄寚蹇界暐闀滃瓙鐨勭汗鐞嗗潗鏍囷紝鑰岄氳繃
闀滃儚鎽勭浉鏈烘潵璁$畻鍑烘姇褰卞潗鏍囷紝鐒跺悗璐村湪闀滃瓙涓娿傚湪鎴戠殑嫻嬭瘯涓紝鏄敤SHADER鏉ュ疄鐜扮殑銆?涓洪暅瀛愬仛浜?jiǎn)涓涓壒孌婄殑綰圭悊銆?/p>
涓嬮潰錛屾垜璐翠竴涓婼HADER錛屽緢綆鍗曪紝濡傛灉瀹炲湪涓嶆竻妤氱殑錛屽彲浠ュ弬鑰冧竴浜涙姇褰辯汗鐞嗙浉鍏崇殑璧勬枡銆?/p>
欏剁偣鐫鑹插櫒浠g爜 HLSL
float4x4 WorldViewProj;
float4x4 MirrorWorldViewProj;
struct VS_OUTPUT
{
float4 position :POSITION;
float3 uv: TEXCOORD0;
};
struct VS_INPUT
{
float4 position : POSITION;
float4 color : COLOR0;
float2 texCoord0 : TEXCOORD0;
};
VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT output;
float4 pos = mul(input.position, WorldViewProj);
output.position = pos;
//璁$畻鍙嶅皠綰圭悊鐨勫潗鏍?
pos = mul(input.position,MirrorWorldViewProj);
output.uv.x = 0.5 * (pos.w + pos.x);
output.uv.y = 0.5 * (pos.w - pos.y);
output.uv.z = pos.w;
return output;
}
鍍忕礌鐫鑹插櫒浠g爜 HLSL
sampler2D colorMap;
struct PS_OUTPUT
{
float4 color : COLOR0;
};
struct PS_INPUT
{
float4 position : POSITION;
float3 uv: TEXCOORD0;
};
PS_OUTPUT main( PS_INPUT input )
{
PS_OUTPUT output;
float2 uv = saturate(input.uv.xy / input.uv.z);
output.color = tex2D(colorMap,uv);
return output;
}
RTT鐩稿叧鐨勬搷浣滐紝irrlicht鐨凴enderToTexture宸茬粡寰堟槑鐧戒簡(jiǎn)錛屽啀姝や笉鍦ㄦ暦榪般?/p>
涓婂浘錛屾敹宸?/p>
鏈潵璇存槸鍋氶暅瀛愭晥鏋滅殑錛岀粨鏋滄墜宸ヨ綆楃殑闀滈潰鍙嶅皠鐭╅樀搴旂敤鍦╥rrlicht鐩告満涓婄殑鏃跺欙紝濮嬬粓鏃犳硶鍑虹幇鏁堟灉錛屽彧鑳藉幓緗戜笂鎼滅儲(chǔ)
鍦╥rrlicht official wiki涓婂彂鐜頒簡(jiǎn)榪欎釜鎵╁睍鐨刉aterNode錛屼笅杞戒笅鏉ワ紝鏀逛簡(jiǎn)鐐笲UG錛屾暣鍚堣繘浜?jiǎn)Terrain Demo閲岋紝 灝辨槸涓婂浘鐨勬晥鏋溿?/p>
鍦ㄦ垜鐨勬満鍣ㄤ笂,HLSL鐗堟湰鏄病鏈夐棶棰樼殑錛孏L鐗堟湰璨屼技RTT鏈夌偣闂銆?/p>
http://supertuxkart.sourceforge.net/
鐢變簬澧欑殑鍘熷洜錛岄渶瑕佸悇浣嶆惌姊瓙銆?/p>
涓婂懆鏈紝鍦ㄥ紕鎹㈣鐨勬椂鍊欙紝鍙戠幇irrlicht寮曟搸鏈韓鏄笉鏀寔紜歡钂欑毊鐨勶紝澶氬皯浠や漢鏈変簺澶辨湜銆?蹇?jī)閲尀兏鐩村鎬濈潃鎬庝箞鎵╁睍涓涓嬶紝灝嗗畠寮勫嚭鏉ャ?/p>
鍊煎緱璇存槑鐨勬槸STK瀵筰rrlicht寮曟搸鐨勭敤娉曟槸寰堢畝鍗曠殑錛屽熀鏈笂鍙互璇存槸瑁哥敤錛屽茍鏈湪irrlicht鎺ュ彛涓婂仛淇敼銆?鑰屾槸瀵瑰榪涜浜?jiǎn)涓浜涘繀瑕佺殑鎵╁睍銆?/p>
褰撶劧錛孲TK涔熷澶栧紑鏀句簡(jiǎn)涓涓猧rrlicht.dll錛岃鏄慨鏀逛簡(jiǎn)鍏朵腑鐨凚UG銆?浣嗙洿鎺ヤ嬌鐢╥rrlicht鏄彲浠ョ殑銆?/p>
搴熻瘽涓嶅璇達(dá)紝鏉ヨ璇村浣曚笉淇敼irrlicht涓琛屼唬鐮侊紝閫氳繃澶栭儴鎵╁睍鏉ュ疄鐜扮‖浠墮楠煎姩鐢誨惂
棣栧厛錛岃兘澶熶嬌鎴戜滑涓嶄慨鏀筰rrlicht浠g爜鐨勫師鍥狅紝鏄洜涓篒SkinnedMesh鎻愪緵浜?jiǎn)涓涓猻etHardwareSkinning鎺ュ彛錛岄粯璁や負(fù)false.
铏界劧榪欎釜鎺ュ彛鐨勮鏄庢槸"(This feature is not implemented in irrlicht yet)”錛屼絾騫朵笉浠h〃錛岃緗笌涓嶈緗棤宸埆銆?
鏌ョ湅浠g爜鍙互鍙戠幇錛屽綋浣犺緗簡(jiǎn)榪欎釜涓簍rue浠ュ悗錛宨rrlicht灝卞畬鍏ㄤ笉綆′綘鐨勫姩鐢諱簡(jiǎn)銆?鎰忔濆氨鏄紝瑕佹槸浣犻潪瑕佽鎴戝共鎴戜笉騫蹭笉浜?jiǎn)鐨勪簨锛岄偅灏卞彧鏈夋?zhèn)ㄥ彟璇烽珮鏄庝簡(jiǎn)銆?/p>
irrlicht榪濩PU璁$畻閮戒笉浼?xì)鍙備笌銆?榪欐濂借鎴戜滑鏈夋満鍙箻錛屽畬鍏ㄧ敤GPU鎺ョ銆?/p>
鑰岃璁╀竴涓《鐐瑰弬涓庨楠艱綆楋紝閭i楠肩儲(chǔ)寮曞垯鏄皯涓嶄簡(jiǎn)鐨勩傛墍浠ワ紝鎴戜滑闇瑕佹兂鍔炴硶璁╅《鐐規(guī)暟鎹兘澶熷皢楠ㄩ绱㈠紩浠e叆SHADER涓?/p>
鍦⊿TK涓敤浜?jiǎn)涓縐嶅閥濡欑殑鏂規(guī)硶錛?灝辨槸浣跨敤浜?jiǎn)椤剁偣鐨勯鑹叉暟鎹Q?铏界劧榪欐牱涓鏉ワ紝欏剁偣棰滆壊灝辯敤涓嶄簡(jiǎn)浜?jiǎn)銆?浣嗗湪妯″瀷娓叉煋鏃訛紝欏剁偣棰滆壊寰堝皯琚嬌鐢ㄥ埌鐨勩?涔熷氨鏄錛岄《鐐歸鑹插湪STK鐨勫姩鐢繪ā鍨嬩腑錛岃鐢ㄤ綔浜?jiǎn)楠ㄩ鐑?chǔ)寮曘?/p>
鍒濆鍖栭楠肩儲(chǔ)寮曠殑鏂規(guī)硶寰堢畝鍗曪紝鐢ㄤ笅闈㈢殑浠g爜閬嶅巻鍗沖彲銆?/p>
璁撅細(xì)鎴戜滑鏈変竴涓楠煎姩鐢繪ā鍨嬫槸 ISkinnedMesh* pSkinnedMesh = …
閭d箞錛氬垵濮嬪寲浠g爜濡備笅
for(u32 i = 0;i < pSkinnedMesh ->getMeshBuffers().size();++i)
{
for(u32 g = 0;g < pSkinnedMesh ->getMeshBuffers()[i]->getVertexCount();++g)
{
pSkinnedMesh ->getMeshBuffers()[i]->getVertex(g)->Color = video::SColor(0,0,0,0);
}
}
//鍒濆鍖栧畬姣曚互鍚庯紝灝辨槸闇瑕佺湡姝g殑绱㈠紩璧嬪間簡(jiǎn)錛岄氳繃浠ヤ笅浠g爜鍙互瀹屾垚
const core::array<scene::ISkinnedMesh::SJoint*>& joints = pSkinnedMesh ->getAllJoints();
for(u32 i = 0;i < joints.size();++i)
{
const core::array<scene::ISkinnedMesh::SWeight>& weights = joints[i]->Weights;
for(u32 j = 0;j < weights.size();++j)
{
int buffId = weights[j].buffer_id;
int vertexId = pSkinedMesh->getAllJoints()[i]->Weights[j].vertex_id;
video::SColor* vColor = &pSkinedMesh->getMeshBuffers()[buffId]->getVertex(vertexId)->Color;
if(vColor->getRed() == 0)
vColor->setRed(i + 1);
else if(vColor->getGreen() == 0)
vColor->setGreen(i + 1);
else if(vColor->getBlue() == 0)
vColor->setBlue(i + 1);
else if(vColor->getAlpha() == 0)
vColor->setAlpha(i + 1);
}
}
//緇忚繃浠ヤ笂涓や釜姝ラ錛岄《鐐規(guī)暟鎹敼閫犲畬鎴愩?鍊煎緱娉ㄦ剰鐨勬槸錛?鍦ㄨ繖閲岋紝 绱㈠紩 0 鏄璁や負(fù)鏄棤鏁堢殑
鐒跺悗錛屾垜浠潵鍒涘緩涓涓猄HADER浣滀負(fù)娓叉煋銆?/p>
鍋囪 鎴戜滑灝嗚繖涓猵SkinnedMesh緇戝畾浜?jiǎn)鍒颁簡(jiǎn)涓涓狪AnimatedSceneNode* node 涓娿?/p>
閭o紝鎴戜滑涓鴻繖涓粨鐐瑰垱寤轟竴涓潗璐?鍦ㄥ垱寤烘潗璐ㄥ墠錛屾垜浠渶瑕佸噯澶囦竴涓猄HADER鍥炶皟銆?SHADER鍥炶皟?yōu)鍍忎笅闈竴鏍峰氨鍙互浜?jiǎn)銆?/p>
class HWSkinCallBack:public video::IShaderConstantSetCallBack
{
scene::IAnimatedMeshSceneNode* m_pNode;
public:
HWSkinCallBack(scene::IAnimatedMeshSceneNode* node):m_pNode(node)
{
}
virtual void OnSetConstants(video::IMaterialRendererServices* services,
s32 userData)
{
scene::ISkinnedMesh* mesh = (scene::ISkinnedMesh*)m_pNode->getMesh();
f32 joints_data[55 * 16];
int copyIncrement = 0;
const core::array<scene::ISkinnedMesh::SJoint*> joints = mesh->getAllJoints();
for(u32 i = 0;i < joints.size();++i)
{
core::matrix4 joint_vertex_pull(core::matrix4::EM4CONST_NOTHING);
joint_vertex_pull.setbyproduct(joints[i]->GlobalAnimatedMatrix, joints[i]->GlobalInversedMatrix);
f32* pointer = joints_data + copyIncrement;
for(int i = 0;i < 16;++i)
*pointer++ = joint_vertex_pull[i];
copyIncrement += 16;
}
services->setVertexShaderConstant("JointTransform", joints_data, mesh->getAllJoints().size() * 16);
}
};
濂戒簡(jiǎn)錛岀幇鍦ㄦ垜浠潵鍒涘緩涓涓潗璐?/p>
s32 hwskm = gpu->addHighLevelShaderMaterialFromFiles(
"../../skinning.vert","main",video::EVST_VS_2_0,
"","main",video::EPST_PS_2_0,&hwc,video::EMT_SOLID);
//鐢ㄦ柊鍒涘緩鍑烘潵鐨勬潗璐ㄨ祴鍊肩粰榪欎釜緇撶偣
node->setMaterialType((video::E_MATERIAL_TYPE)hwskm );
//鍒版錛岃緗畬姣曘?/p>
//鏈鍚庯紝灝辨槸skinning.vert鏈韓鐨勫唴瀹逛簡(jiǎn)銆?璐村嚭鏉ュ嵆鍙紝娌℃湁澶鎶宸э紝灝辨槸涓涓櫘閫氱殑钂欑毊銆?/p>
// skinning.vert
#define MAX_JOINT_NUM 36
#define MAX_LIGHT_NUM 8
uniform mat4 JointTransform[MAX_JOINT_NUM];
void main()
{
int index;
vec4 ecPos;
vec3 normal;
vec3 light_dir;
float n_dot_l;
float dist;
mat4 ModelTransform = gl_ModelViewProjectionMatrix;
index = int(gl_Color.r * 255.99);
mat4 vertTran = JointTransform[index - 1];
index = int(gl_Color.g * 255.99);
if(index > 0)
vertTran += JointTransform[index - 1];
index = int(gl_Color.b * 255.99);
if(index > 0)
vertTran += JointTransform[index - 1];
index = int(gl_Color.a * 255.99);
if(index > 0)
vertTran += JointTransform[index - 1];
ecPos = gl_ModelViewMatrix * vertTran * gl_Vertex;
normal = normalize(gl_NormalMatrix * mat3(vertTran) * gl_Normal);
gl_FrontColor = vec4(0,0,0,0);
for(int i = 0;i < MAX_LIGHT_NUM;i++)
{
light_dir = vec3(gl_LightSource[i].position-ecPos);
n_dot_l = max(dot(normal, normalize(light_dir)), 0.0);
dist = length(light_dir);
n_dot_l *= 1.0 / (gl_LightSource[0].constantAttenuation + gl_LightSource[0].linearAttenuation * dist);
gl_FrontColor += gl_LightSource[i].diffuse * n_dot_l;
}
gl_FrontColor = clamp(gl_FrontColor,0.3,1.0);
ModelTransform *= vertTran;
gl_Position = ModelTransform * gl_Vertex;
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
/*
// Reflections.
vec3 r = reflect( ecPos.xyz , normal );
float m = 2.0 * sqrt( r.x*r.x + r.y*r.y + (r.z+1.0)*(r.z+1.0) );
gl_TexCoord[1].s = r.x/m + 0.5;
gl_TexCoord[1].t = r.y/m + 0.5;
*/
}
//娉細(xì)榪欐槸GLSL 2.0錛?鍦ㄧ敤IRR鍋氭祴璇曠殑鏃跺欙紝瑕侀塆L椹卞姩鏂瑰紡銆?/p>
榪樻槸涓婁釜鍥懼惂錛屼笉涓婂浘鎰熻娌℃湁鐪熷儚銆?铏界劧鍥劇湅涓嶅嚭鏉ヤ粈涔堝姩浣?/p>
涓轟簡(jiǎn)璇存槑瀹冪湡鐨勫湪鍔紝涓嶅緱涓嶄笂絎簩寮犮?
鍦ㄦ錛屽崄鍒嗘劅璋uper Tux Kart. 鎻愪緵浜?jiǎn)涓涓涔?fàn)鍜屾墿灞昳rrlicht鐨勬鏍?
閭e氨浠庝粖澶╄繖涓敤irrlicht鍋氬ぉ榫欏叓閮ㄧ殑妯″瀷鎹㈣璇磋搗鍚с?/p>
涔熶笉鐭ラ亾鏄負(fù)浠涔堬紝鏈榪戝張鎹i紦璧蜂簡(jiǎn)OGRE鍜宨rrlicht. 騫朵笖錛屾繪兂鐢╥rrlicht瀹炵幇涓浜汷GRE涓殑涓滆タ銆?/p>
褰撶劧錛岃繖涓嶆槸鍟嗕笟欏圭洰錛屼篃娌℃湁鍟嗕笟鐩殑錛岀函灞炶泲鐤艱屽凡銆?/p>
涓鍒囪鍔ㄧ殑鐢辨潵錛岄兘鏉ヨ嚜浜巚czh閭eぉ鏅氫笂鐨勪婦鍔ㄣ?/p>
璁板緱鏈変竴澶╂櫄涓婂湪緹ら噷鑱婂ぉ錛屽ぇ浼欏氨縐拌禐鍚勪綅鑿?qiáng)鑻f槸澶氫箞鐨勫帀瀹炽?/p>
鏈鍚巚c鍙戜簡(jiǎn)涓涓嚜宸辯殑妗岄潰鎴浘璇達(dá)細(xì)璁╀綘浠湅鐪嬭強(qiáng)鑻f槸濡備綍緇冩垚鐨勶紙榪欎笉鏄師璇濓紝鍜岃瘽鐨勫瓧鐪兼湁鍑哄叆錛屽湪姝や笉鎯寵礋浠諱綍璐d換錛屽鏋滅湡鏈夋兂鐪嬬殑錛屽幓緲葷兢鐨勮亰澶╄褰曪級(jí)
閭eぉ鏅氫笂錛屾垜鎯充簡(jiǎn)寰堜箙銆傛兂鎯寵嚜宸辮嚜浠庤漿鍋氶〉娓鎬互鍚庯紝鏄浣曡櫄娓″厜闃寸殑銆?/p>
緇堜簬蹇嶄笉浣忎簡(jiǎn)錛岀炕寮浜?jiǎn)鑷忿q殑縐誨姩紜洏錛岀湅鐪嬭嚜宸辨浘緇忓仛榪囩殑灝忎笢瑗褲?0%鏄緩濂藉伐紼嬪氨娌$悊浜?jiǎn)銆?/p>
榪欐墠鏄庣櫧錛屾垜鑺卞湪鎬濊冧笂鐨勬椂闂磋繙榪滃ぇ浜庝簡(jiǎn)琛屽姩銆?浜庢槸錛屾垜鍐沖畾鏀瑰彉鑷繁錛屾壘鍥為偅涓湡鐨勬垜銆?/p>
3D娓告垙鏄垜鐨勭湡鐖憋紝 鐪熺埍鍒板氨綆楃敾闈㈠樊涓鐐癸紝鍙鏄?D錛屾垜涔熶細(xì)寰堝枩嬈€?/p>
浜庢槸錛屾垜瑙夊緱鑷繁榪樻槸搴旇鎺ョ潃鍏堝墠鐨勮礬璧頒笅鍘匯?浠涔堟湇鍔″櫒錛屼粈涔?AS3. 閮芥槸嫻簯錛?涓嶅枩嬈㈠氨鏄笉鍠滄銆?/p>
縐佷笅鍙堝紑濮嬬爺絀秈rrlicht浜?jiǎn)銆?/p>
鐚涘湴涓鍙戠幇錛岃嚜宸辨槸澶氫箞鐨勬悶絎戯紝 浠?9騫村埌11騫達(dá)紝涓鐩村湪鍋氬紩鎿庡紑鍙戯紝 涔熺炕榪噄rrlicht鍜宱gre鏃犳暟閬嶃?鍗翠粠鏉ュ氨娌℃湁鍐欏畬榪囦竴涓畬鏁寸殑DEMO銆?/p>
榪炲姛鑳芥祴璇曠敤渚嬮兘娌℃湁鍐欒繃銆傜獊鐒惰寰椾箣鍓嶇殑涓浜涜璁′技涔庢湁浜涜劚紱諱簡(jiǎn)瀹為檯銆傛病鏈夌湡姝d嬌鐢ㄨ繃錛屽張鎬庣煡濡備綍鏄ソ錛屽浣曟槸鍧忓憿錛?/p>
榪欎竴嬈℃槸鐪熺殑鐜﹊rrlicht浜?jiǎn)锛?涓棿涔熺籂緇撹繃鏄笉鏄疧GRE鏇撮傚悎銆?浣嗗湪鐩墠榪欎釜鏃墮棿鏈夐檺鐨勭┖闂翠笅錛屾垜鏇存効鎰忕帺irrlicht.灝忓閥錛岃交渚褲?褰撶劧錛屾剰鍛崇潃鏇村涓滆タ瑕佽嚜宸卞疄鐜般?涓嶈繃瀵逛簬涓涓唬鐮佹帶鏉ヨ錛屼篃鍙嶈屾洿鑷緱鍏朵箰銆?姝eソ鍙互鍦ㄧ煭璺殑鏃跺欙紝鍘誨弬鑰冧竴涓嬪叾瀹冨紩鎿庯紝鐢ㄦ潵鎵╁厖irrlicht.
鎴戣鍋氱殑涓嶆槸鎶奿rrlicht鏁村緱鐗汢錛岃屾槸鎯寵嚜宸卞紕寮勶紝鍔犱笂縐誨姩騫沖彴鐨勫礇璧鳳紝鎴戣寰梚rrlicht鏇村姞閫傚悎鍚с?鎹gameloft涔熸湁浣跨敤錛堜粎鏄嵁璇達(dá)級(jí)銆?/p>
鍙兘寰堝鍏勫紵浼?xì)璇存垜杩欒鐨勪笢瑗垮Q屽叾瀹炲氨鏄竴鍧ㄥ睅浜?jiǎn)銆?涓嶈繃錛屾垜瑙夊緱鍐嶅潖鐨勮瘎璁猴紝涔熻〃紺轟竴縐嶅叧娉ㄣ?鎵硅瘎濂借繃浜庢棤瑙嗗晩~~~~
----------------------------------------------------------涓嬮潰璇磋鎴戦亣涓婄殑綰犵粨------------------------------------------------
綰犵粨1:鎹㈣闇瑕佸満鏅妭鐐歸厤鍚?/strong>
鍦╥rrlicht涓紝騫舵病鏈夋彁渚涙櫘閫氬紩鎿庝腑鐨剆ubmesh鎴栬卋odypart榪欑涓滆タ錛岀敤浜庣洿鎺ユ敮鎸佹崲瑁呫?鍦╥rrlicht涓紝濡傛灉鎯寵鎹㈣錛屾渶鐩存帴鐨勬柟娉曞氨鏄緷璧栦簬鍦烘櫙緇撶偣
姣斿,鍦ㄦ垜鐨勭ず渚嬩腑錛屽彲浠ユ洿鎹㈠ご鍙戯紝甯藉瓙錛岃。鏈嶏紝鎶よ厱錛岄澊瀛愶紝闈㈠銆?閭e氨闇瑕?涓満鏅妭鐐癸紝1涓綔涓烘牴鑺傜偣錛岀敤浜庢帶鍒舵暣涓鑹茬殑涓栫晫鍧愭爣錛屽鉤縐伙紝緙╂斁錛屾棆杞瓑灞炴с傚彟澶?涓満鏅妭鐐瑰垯鍒嗗埆緇戞湁鍚勪釜閮ㄤ歡鐨勬ā鍨?/p>
璐翠竴涓嬫垜鐨勮鑹茬被鐨勪唬鐮侊紝琛屾暟涓嶅
class CCharactor
{
IrrlichtDevice* m_pDevice;
IAnimatedMeshSceneNode* m_pBodyParts[eCBPT_Num];
ISceneNode* m_pRoot;
public:
CCharactor(IrrlichtDevice* pDevice)
:m_pDevice(pDevice)
{
memset(m_pBodyParts,0,sizeof(m_pBodyParts));
m_pRoot = pDevice->getSceneManager()->addEmptySceneNode(NULL,12345);
}
void changeBodyPart(ECharactorBodyPartType ePartType,stringw& meshPath,stringw& metrialPath)
{
ISceneManager* smgr = m_pDevice->getSceneManager();
IAnimatedMeshSceneNode* pBpNode = m_pBodyParts[ePartType];
IAnimatedMesh* pMesh = smgr->getMesh(meshPath.c_str());
if(pMesh==NULL)
return;
if(pBpNode==NULL)
{
pBpNode = smgr->addAnimatedMeshSceneNode(pMesh,m_pRoot);
m_pBodyParts[ePartType] = pBpNode;
}
else
{
pBpNode->setMesh(pMesh);
}
ITexture* pTexture = m_pDevice->getVideoDriver()->getTexture(metrialPath.c_str());
if(pTexture)
pBpNode->setMaterialTexture(0,pTexture);
}
};
//鐒跺悗錛屾垜鐢ㄤ簡(jiǎn)涓涓粨鏋勪綋鏉ユ瀯寤洪儴浠朵俊鎭?/p>
struct SBodyPartInfo
{
stringw Desc;
ECharactorBodyPartType Type;
stringw MeshPath;
stringw MeterialPath;
};
綰犵粨2錛氬叡浜楠?/strong>
棣栧厛錛宨rrlicht 1.8涓OGRE妯″瀷鐨勬牸寮忔敮鎸佸湪浠g爜涓紝鏈楂樺彧鐪嬪埌浜?.40鐗堟湰鐨勮В鏋愶紝鏇撮珮鐨勫氨浼?xì)琚棤瑙嗐?澶╅緳鍏儴鐨勬ā鍨嬫湁鍑犱釜鏄?.30鐨勶紝鑰岀敤浜庢崲瑁呭拰涓昏鐨勶紝閮芥槸1.40鐨勩?鍙兘鏄В鏋愪笉鍏ㄧ殑鍘熷洜錛屽鑷?.40鐨勯楠煎姩鐢繪棤娉曟甯告挱鏀俱?榪欎釜闂鏁翠簡(jiǎn)鍑犱釜灝忔椂錛屾病鏈夎В鍐籌紝鏄庡ぉ緇х畫
鍏舵錛屽涓ā鍨嬪叡浜楠煎彧鑳介氳繃鍦烘櫙鑺傜偣鐨剈seAnimationFrom鏉ュ畬鎴愶紝騫朵笖浼犲叆鐨勬槸涓涓狹esh鍙傛暟銆傝繖鐐硅浜鴻泲鐤鹼紝 澶╅緳鍏儴鐨勮鑹插姩浣滄槸鍒嗗紑浜?jiǎn)鐨勫Q屼笉鍚岀殑鏀誨嚮鍔ㄤ綔鏄竴涓猻keleton鏂囦歡銆?鎯寵瀹炵幇鍏變韓錛屾湁鐐歸夯鐑?chǔ)銆?/p>
綰犵粨3錛氭ā鍨嬫枃浠舵牸寮?/strong>
irrlicht涓嶅儚OGRE閭f牱鏈変竴涓己澶т笖鎴愮啛鐨勬ā鍨嬫枃浠舵牸寮?铏界劧鎻愪緵浜?irr鏍煎紡錛屼絾浠呮槸鐢ㄤ簬irrEdit鐨勫満鏅俊鎭緭鍑恒傚厛鐪嬩竴寮犲浘
榪欏紶鍥炬槸irrlicht samples涓殑MeshViewer鐨勬彁紺烘鍐呭銆?涓婇潰鍒楀嚭浜?jiǎn)鍙互鏀寔鐨勬ā鍨嬫枃錃g綾誨瀷銆?澶у鍙互鐪嬬湅錛屽張鏈夊灝戞ā鍨嬫牸寮忔槸鍙互鐩存帴鎷挎潵鏀懼埌欏圭洰涓婄敤鐨勫憿錛?mdl鍜宮s3d鍙互鑰冭檻錛宒ae鐨勮瘽錛屾垜鍦ㄥ紑婧愭父鎴? A.D. 涓鍒頒嬌鐢ㄨ繃銆?鍏跺畠鐨勮瘽錛屽氨瀹屽叏涓嶇啛鎮(zhèn)変簡(jiǎn)銆?OGRE鐨?.mesh鏀寔涔熶笉瀹屽叏銆?闅鵑亾鐪熻鑷繁鏁翠竴涓?
鎴戣兘鎯沖埌鐨勶紝灝辨槸閫変竴涓彃浠跺畬鏁村拰妯″瀷鍜屽姩鐢繪牸寮忛兘姣旇緝濂界殑浣滀負(fù)涓庣編鏈伐鍏蜂氦浜掔殑鏍煎紡銆?鑷繁鍐嶅啓涓涓伐鍏鳳紝杞崲鎴愯嚜宸辯殑鏍煎紡銆?/p>
綰犵粨4錛氱‖浠惰挋鐨?/strong>
鎴戜互涓哄儚NIKO閭f牱鐨勬妧鏈媯錛屾庝箞浼?xì)鏀炬帀杩欎竴涓壒鎬с?寰堥珮鍏村湴鍦ㄥ満鏅妭鐐逛笂鍙戠幇浜?jiǎn)纭欢钂欑毊鐨勫嚱鏁版帴鍙c備絾涓鐪嬫敞閲婏紝鎶婃垜鍜界潃浜?jiǎn)銆?/p>
//! (This feature is not implemented in irrlicht yet)
virtual bool setHardwareSkinning(bool on);
鍏跺畠鍦版柟錛岃繕娌℃湁鍘繪暣錛屽氨鍏堜笉鍙戣〃璦璁轟簡(jiǎn)銆?緇х畫鐫榪欎釜寰堝偦B,寰堝ぉ鐪熺殑鎹i紦涔嬭礬銆?
涓婁釜鍥撅紝綰康涓涓嬫垜鐨刬rrlicht浜х墿銆?/p>
甯冭。
鎹簡(jiǎn)韜洈鐢?/p>
鎹簡(jiǎn)甯藉瓙鍜岄澊瀛?/p>
PS:澶村彂娌℃湁綰圭悊錛屾墍浠ユ槸鐧界殑銆?/p>
鐢∟VPerfHUD鎸傜▼搴忛渶瑕佽鎸傜殑紼嬪簭鑷韓鏀寔錛屼絾鏄綉涓婃湁涓涓佸厔鍐欑殑涓涓狽VPerfHUD Any紼嬪簭鍙互甯綘瀹屾垚榪欎釜鍔熻兘銆傚澶у鏁癉9鐨勯兘鏈夋晥銆傞櫎闈炴湰韜仛浜?jiǎn)鐮磋В銆?/p>
緇欏ぇ瀹惰繖涓摼鎺ワ紝鑷繁鍘昏В鍐充釜浜洪棶棰樸?/p>
http://www.thecodeway.com/blog/?p=433
瀹岀編鏃剁┖鐨勫紩鎿庡緢涓嶉敊錛屼緷鐒跺潥鎸哄湴鐢ㄧ潃D8銆傚叾瀹炴尯鎯蟲寕鏉ョ湅鐪嬬殑錛屽彲鎯滃競(jìng)闈笂涓繪祦鐨勫伐鍏烽兘涓嶆敮鎸丏8錛屽彧鏈塂9浠ュ強(qiáng)浠ュ悗鐨勭増鏈?/p>
WOW鍦–TM鐨勭増鏈腑鍗囩駭浜?jiǎn)瀹冪殑娓叉煋寮曟搸锛屽厜浠庢按闈㈠拰鐏劙灏辩湅寰楀嚭鏉ャ傘浣哤OW涓鍚戞槸浠ヨ礋杞藉拰嫻佺晠搴︿負(fù)涓伙紝騫朵笖WOW鏈韓鍗栫殑涓嶆槸鐢婚潰銆傛墍浠ヨ嫢涓嶈兘甯姪鎻愬崌娓告垙鎬х殑娓叉煋鎹熻楀熀鏈笂琚棤瑙嗕簡(jiǎn)銆傘鍏跺疄鍚э紝涓漢瑙夊緱錛屽仛娓告垙鏃犻潪灝變笁縐嶄簡(jiǎn)銆傘涓縐嶆槸榪芥眰鐢婚潰錛岃繖涓鐐規(guī)瀛愬緢鏈夊績(jī)寰椼備簩鏄拷姹傚彲鐜╂э紝榪欎竴鐐規(guī)垜鎯砏OW搴旇閬ラ仴棰嗗厛浜?jiǎn)鍚с傘鍙﹀涓縐嶈拷姹傚氨鏄懼緱寰堝崟綰簡(jiǎn)錛嶏紞錛嶉挶銆傘榪欎竴鐐瑰浗鍐呰澶氭父鎴忓仛寰楀緢濂斤紝鍦ㄦ灝變笉鍒楀悕瀛椾簡(jiǎn)錛屽洜涓烘瘮杈冨銆?/p>
鐢變簬涓婃槦鏈熷湪鍏徃嫻嬭瘯鏂板啓濂界殑鏉愯川鍜岃祫婧愮鐞嗘椂錛屽彂鐜癆LPHA嫻嬭瘯鐨勮崏涓涙晥鏋滃緢涓嶇悊鎯籌紝浜庢槸灝嗚崏鐨凙LPHA娣峰悎寮鍚簡(jiǎn)錛屼竴鏃墮棿錛屾劅瑙変笘鐣岃棰犲掍簡(jiǎn)銆傚洜涓鴻崏鏄寜綈囩敾鐨勶紝鎺掑簭涔熷彧鑳芥槸鎸夌皣鎺掑簭錛屽綋寮鍚簡(jiǎn)ALPHA娣峰悎鍚庯紝鑽変笡涓庤崏涓涗箣闂存病鏈夊お澶氶棶棰橈紝鍙槸鑽変笡鏈韓鍑虹幇浜?jiǎn)鍍忕礌娓叉煋閿欒銆傘涓嶇鏄痁鍐欏拰Z嫻嬭瘯濡備綍閫夋嫨寮鍚拰鍏抽棴銆傞兘浼?xì)鏈夐棶棰樸?/p>
紿佺劧鍙戠幇鑽夎繖涓笢瑗垮緢鐗瑰埆銆?/p>
鑽変笡鐨勫緩妯″拰GPU GEMS 1涓婄殑寤烘ā鏂瑰紡涓鏍鳳紝銆涓変釜鐭╁艦浜ゅ弶鐨勬柟寮忋?/p>
錛戙佸畠闇瑕佺敤ALPHA娣峰悎鏉ュ疄鐜版晥鏋?/p>
鐢ˋLPHA娣峰悎鐨勬晥鏋滄槸寰堜笉閿欑殑銆傚洜涓哄彲浠ヤ嬌杈圭紭鏌斿拰銆傛瘯绔烝LPHA嫻嬭瘯浼?xì)鍥犱负鍥剧墖ALPHA鍊奸噰鏍峰紩璧風(fēng)殑璇樊瀵艱嚧涓ラ噸鐨勯挏榻褲傚叾嬈″氨鏄緹庢湳瑕佹眰澶珮浜?jiǎn)锛岄渶瑕佷弗鏍兼帶鍒禔LPHA涓庨潪ALPHA浜ょ晫澶勩?/font>
錛掋佷絾瀹冪殑琛屼負(fù)灞炴у嵈鏄竴涓潪閫忔槑鐗╀綋銆傘
榪欐槸鍥犱負(fù)瀹冨繀欏繪湁娣卞害鍏崇郴錛屽繀闇鍐橺銆傘鍥犱負(fù)鍙湁鍐欎簡(jiǎn)Z錛屾墠鑳藉姝g‘鍦頒笌鐗規(guī)晥絳夐忔槑鐗╂販鍚堬紝騫朵笖涔熷彧鏈夊啓浜?jiǎn)Z錛屽悓涓鑽変腑鐨勫涓潰鐗囨墠鑳藉姝e父娣峰悎銆?/font>
鍦ㄥ拷鐣ュ叾瀹冩儏鍐典笅錛屾垜璇曡繃浜?jiǎn)Z嫻嬭瘯鍜孼鍐欑殑鍥涚緇勫悎錛屼篃鏈兘杈懼埌鑽変笡鏈韓鍜屽崟媯佃崏閮藉悓鏃惰揪鍒版紜殑鏁堟灉銆?/p>
榪樻槸澶氱湅鐪嬪埆浜烘庝箞鍋氱殑鍚э紝鎵浠ヤ笂鏉ュ氨姣旇緝鍏沖績(jī)WOW鐨勬琚覆鏌撲簡(jiǎn)銆傘褰撶湅鍒頒笅闈㈣繖鏍風(fēng)殑綰圭悊鐨勬椂鍊欙紝鎴戠瑧浜?jiǎn)銆傛病鎯沖埌BLZ鐨勭編鏈祫婧愯妭綰﹀埌浜?jiǎn)杩欐狅L(fēng)殑紼嬪害錛岀湡鏄粏鑷村叆寰晩錛堣繖涓嶆槸鎷嶉┈灞侊紝璇曢棶鏈夊灝戠編鏈祫婧愭槸榪欐牱鍋氱殑錛夈傘鍙互鐪嬪嚭錛岃嫢涓嶉噰鐢ㄨ繖鏍風(fēng)殑鍗婂紶錛岃岀敤鏁村紶錛岄偅涔堝氨鏄?28X128鐨勫ぇ灝忋?/p>
宸﹁竟涓哄師鍥撅紝鍙寵竟涓篈LPHA閫氶亾鏌ョ湅鍥?/p>
鑰屽浜庢爲(wèi)鐨勬覆鏌擄紝鍒欏緢鏅氫簡(jiǎn)銆傝緗ソ綰圭悊錛岃緗ソ鏁版嵁鍜屾覆鏌撶姸鎬侊紝鎻愪氦緇樺埗鍗沖彲銆?/p>
涓轟簡(jiǎn)鐪嬪埌ALPHA娣峰悎鐨勬晥鏋滐紝鎴戝己蹇嶇潃鎶奧OW鍦ㄦ垜7300鐨勬樉鍗′笂寮瀹屼簡(jiǎn)鏁堟灉銆備互涓轟細(xì)鍜嬬殑錛岀粨鏋滃暐涔熸病鍙戠敓銆?/p>
WOW鐨勬琚殑紜病鏈夌敤鍒癆LPHA娣峰悎銆傛垜澶辨湜浜?jiǎn)銆?/p>
鍙兘璁稿浜鴻寰楋紝鎶婂寮犵汗鐞嗘暣鍚堝湪涓寮犱笂鏇村ソ鍚с傘褰撶劧浜?jiǎn)锛寴q欐槸鑷劧鐨勩傘涓嬮潰灝辨槸WOW涓粡甯鎬竴璧峰嚭鐜扮殑妞嶈鐨勭汗鐞嗘墦鍖呭浘銆?/p>
澶у鍙互鐪嬪埌錛屽彸杈圭殑鍥懼茍娌℃湁琚鍓紝鍏跺師鍥犱笉璦鑰岃皶錛堝洜涓烘兂浠ラ潪瀵圭О钀ラ犳劅瑙夛紝騫朵笖灝忎歡鐗╀綋綰圭悊鏈韓姣旇緝?yōu)畯銆傦級(jí)銆?/p>
鍙戠幇榪欒崏鐢ㄧ殑鏄袱鐗囷紝騫朵笖澶у皬榪樹笉涓鏍楓傘涓嶇煡鏄惁鐪熺殑鏈夋蹇呰銆?/p>
鎴戞渶鍚庤璇存槑鐨勬槸錛岃繖鏂囩珷灝辯畻瀹屼簡(jiǎn)銆傛病鏈夌粨璁猴紝涔熸病鏈夋劅璦銆傚洜涓洪偅鏍峰お淇楀錛?/p>
緹庡伐鎶婄墿浣撹創(chuàng)鍥懼拰鐗╀綋棰滆壊錛岄珮鍏夌瓑緇熺О涓烘潗璐ㄣ侱3D鍜孫PENGL榪欐牱鐨勫浘褰㈡帴鍙e垯鎶婄墿浣撹〃闈㈣創(chuàng)鍥懼崟鐙彨鍋氱汗鐞嗭紝鑰屾妸婕弽灝勶紝楂樺厜絳夊彨鍋氭潗璐ㄣ?/p>
鑰屽湪娓告垙寮曟搸鎴栧浘褰㈠紩鎿庝腑鎻愬埌鐨勬潗璐紝鍒欎笌姝や笉鍚屻?寮曟搸涓彁鍒扮殑鏉愯川涓嶄粎涓婇潰鐨勭殑鍐呭銆?寮曟搸涓墍璋撶殑鏉愯川錛屾槸鎸囩墿浣撳湪娓叉煋鏃朵竴緋誨垪鐨勭姸鎬佹帶鍒躲?濡傦紝ALPHA娣峰悎寮鍏充互鍙?qiáng)ALPHA娣峰悎鍥犲瓙銆佺汗鐞嗚繃铏戞柟寮忥紝綰圭悊閫氶亾鐘舵併佺汗鐞嗙煩闃點(diǎn)佽鍓ā寮忕瓑錛屽湪D3D涓紝灝辨槸SetRenderState,SetTextureStageState,SetSamplerStateState絳夋墍鎺у埗鐨勩傚湪OPENGL涓紝鍒欏ぇ澶氭暟鐢眊lEnable鎵鎺у埗銆?/p>
鎴戜滑鎵鎻愬埌鐨勬潗璐ㄧ郴緇燂紝鍒欐槸浠ユ涓哄熀紜灞曞紑鐨勩?涓婇潰鎻愬埌鐨勮繖浜涘洜瀛愶紝緇勬垚浜?jiǎn)鎴戜滑鐨勬潗璐ㄣ?涔熸槸鎴戜滑鍦ㄦ覆鏌撲竴涓墿浣撶殑鏃跺欙紝鎻愪氦鍒拌澶囩殑鐘舵佹帶鍒跺箋?涓涓墿浣撶殑涓嬈℃覆鏌擄紝鎴戜滑縐頒綔涓涓狿ASS銆備簬鏄垜浠『鍏惰嚜鐒跺湴灝嗚繖涓覆鏌撴椂鐨勬潗璐ㄦ帶鍒剁殑鏈灝忓崟浣嶅懡鍚嶄負(fù)Pass,鍒欙細(xì)
struct TextureState
{
void* Texture;
int ColorOp;
int ColorAgr1;
int ColorAgr2;
int AlphaOp;
int AlphaAgr1;
int AlphaAgr2;
.....//鏇村鍐呭
};
class CPass
{
CColor mAmbient;
CColor mDiffuse;
....鏇村鍐呭
bool mAlphaEnable;
int mScrBlend;
int mDstBlend;
int mCullMode;
TextureState[4] mTextureStates;
...鏇村鍐呭
};
褰撴垜浠覆鏌撲竴涓墿浣撶殑鏃跺欙紝鍙渶瑕佸皢榪欎釜綾婚噷闈㈢殑鐘舵佸簲鐢ㄥ埌璁懼錛屽嵆鍙畬鎴愬鐗╀綋鐨勭粯鍒躲?/p>
鏉愯川緋葷粺鐨勫熀鏈唴瀹瑰氨鏄繖浜涳紝榪欎篃鏄渶瀹規(guī)槗鍋氬埌鐨勪簨鎯呫?/p>
浣嗘槸錛屾垜浠兘鐭ラ亾錛屽儚D3D鎴朞PENGL榪欐牱鐨勫浘褰㈡帴鍙f瘡璁劇疆涓嬈PU鐘舵佺殑鏃跺欙紝閮戒細(xì)鏈変竴瀹氱殑寮閿錛堥氳繃鏌ョ湅鐩稿叧鏂囨。鍙互鐪嬪埌鏌愪簺鍑芥暟鐨勫叿浣撳紑閿鍊鹼級(jí)銆傝屼負(fù)浜?jiǎn)淇濊瘉鎴戜滑鐨勬覆鏌搵箒鐣呭Q屾垜浠笉寰椾笉鍑忓皯榪欐牱鐨勫紑閿銆?/p>
寰堣嚜鐒跺湴錛屾垜浠細(xì)鎯沖埌錛屽敖閲忓噺灝戝垏鎹€傝屽浣曞噺灝戝垏鎹㈠憿銆傛垜浠彲浠ヨ褰曚笅鑷繁鐨勭‖浠剁姸鎬侊紝鍦ㄨ緗笅涓涓殑鏃跺欙紝鍏堝垽鏂綋鍓嶇‖浠剁姸鎬佹槸鍚︾浉鍚岋紝濡傛灉鐩稿悓銆傚垯涓嶇敤鍐嶈緗?铏界劧鏌愪簺鍥懼艦鎺ュ彛鍦ㄥ叾灞傚簳鍋氫簡(jiǎn)綾諱技鐨勫姛鑳姐備絾鎴戜滑澶栭儴鍒ゆ柇涓涓嬶紝涔熸湭灝濅笉鍙備粠D3D涓婃潵璁詫紝澶栭儴鍒ゆ柇姣旇鍏跺唴閮ㄥ垽鏂晥鐜囨洿浣熾傞渶瑕佹敞鎰忕殑鏄紝鐢變簬鎴戜滑鍦ㄨ嚜宸辯殑紼嬪簭閲屽仛浜?jiǎn)鐩稿悓鍒ゆ柇銆傚洜姝わ紝褰撴湁鍙︿竴涓▼搴忎篃淇敼璁懼鐘舵佺殑鏃跺欙紝灝變細(xì)浜х敓鎰忔兂涓嶅埌鐨勬晥鏋溿傛墍浠ワ紝鎴戜滑搴旇閫傚綋鐨勬煡璇竴涓嬭澶囩姸鎬侊紝騫舵洿鏂拌嚜宸辯殑鐘舵佽褰曡〃銆傝嚦浜庤繖涓煡璇㈤棿闅旓紝灝辮鏍規(guī)嵁鑷繁鐨勫疄闄呮儏鍐墊潵嫻嬭瘯浜?jiǎn)銆?/p>
閫氳繃璁板綍鐘舵佺殑鏂規(guī)硶鏉ユ彁鍗囩殑鏁堢巼鏄緢涓嶆槑鏄劇殑錛屽洜姝わ紝鎴戜滑闇瑕佸鏉愯川榪涜鎺掑簭錛岃嚦浜庢庝箞鎺掑簭錛岃繖綆楁硶涓婄殑闂錛屽湪姝ゅ厛涓嶄綔榪囧瑙i噴銆?鎬諱箣錛屾垜浠皢鐩鎬技鐨勬潗璐ㄦ帓鍦ㄤ竴璧楓傜敱浜庢潗璐ㄥ緢鐩鎬技錛岀粯瀹屼竴涓啀緇樹笅涓涓殑鏃跺欙紝鍑忓皯浜?jiǎn)鍒囨崲锛屼粠鑰屽ぇ澶ф彁鍗囦簡(jiǎn)鏁堢巼銆?/p>
鏃㈢劧宸茬粡鏄秹鍙?qiáng)鍒拌畱证囦簡(jiǎn)锛屾垜浠誨緱鑰冭檻涓涓嬭澶囬棶棰樸?濡傛灉璁懼涓嶆敮鎸佹垜浠綋鍓嶇粰瀹氱殑鏉愯川鐘舵侊紝鎬庝箞鍔烇紵 榪斿洖FALSE涓嶆覆鏌撱傝繕鏄紼嬪簭DOWN鎺夛紵 瀵逛簬涓浜涢噸瑕佺殑鎬ц兘錛岃澶囦笉鏀寔璁╃▼搴廌OWN鎺夋槸鏈濂界殑鍋氭硶錛屼絾鏄紝瀵逛簬鍍忕汗鐞嗘販鍚堥氶亾涓嶈凍鐨勬儏鍐碉紝璁╁叾DOWN鎺夊氨鏄懼緱鍒掍笉鏉ヤ簡(jiǎn)銆傛瘯绔熸垜浠璁$殑娓告垙紼嬪簭鏄兂璁╂洿澶氱殑鐜╁鑳界帺涓嶆槸錛?榪欐牱灝變細(xì)娑夊強(qiáng)鍒癙ASS鐨勬媶鍒嗛棶棰樸?/p>
瀵逛簬PASS鐨勬媶鍒嗭紝OGRE宸茬粡鍋氬緱寰堝ソ浜?jiǎn)銆傛牴鎹敤鎴風(fēng)殑璁懼鎬ц兘錛屽鏋滀笉婊¤凍錛屽氨涓鐩存媶鍒嗭紝鎷嗗埌鐢ㄦ埛婊¤凍涓烘錛屾渶鍚庤涓涓墿浣撴覆鏌撳嬈★紝鏉ュ疄鐜板涓汗鐞嗛氶亾娣峰悎鐨勬晥鏋溿?鑰屽PASS鍒欐槸鍦ㄦ覆鏌撶殑鏃跺欎笉寰椾笉鑰冭檻鐨勫湴鏂癸紝姣曠珶鏈変簺鐗╂畩鏁堟灉闈炲緱鐢ㄥPASS涓嶅彲銆?/p>
瀵逛簬澶歅ASS鐨勮璁★紝鎴戜滑鍙互鍙傝僌GRE鐨勬潗璐ㄦ柟娉曟垨鏄疍3DX鐨勬晥鏋滄鏋躲傛垜浠妸瀹屾垚涓涓渶緇堟晥鏋滅殑鏂規(guī)縐頒綔涓涓覆鏌撴妧鏈?Technique 錛屼竴涓妧鏈彲鐢卞涓狿ass鏉ュ畬鎴愩?/p>
class Technique
{
...鏇村鍐呭
vector<CPass*> mPasses;
};
榪欐牱灝辨弧瓚充簡(jiǎn)鎴戜滑鐨勯渶姹傘?nbsp; 瀵逛簬鍚屼竴縐嶆晥鏋滐紝鎴戜滑鍙互鎻愪緵澶氱Technique渚涚▼搴忛夋嫨銆?鑰岃繖涓夋嫨鐨勬潯浠跺垯鍙互鏄牴鎹‖浠舵ц兘錛屾垨鏄帺瀹舵墜鍔ㄩ夋嫨鐨勯厤緗潵瀹炵幇銆?/p>
鏈鍚庣粨鏋勫涓嬶細(xì)
class CMaterial
{
public:
...鏇村鍐呭
vector<CTechnique*> mRenderTechs
};
涔變竷鍏碂鍦拌浜?jiǎn)涓閫氾紝甯屾湜娌℃檿姝諱漢錛侊紒錛?/p>
鍦ㄦ垜浠殑娓告垙寮鍙戜腑錛岄氬父浼?xì)閬囧堫C袱涓ā鍧椾箣闂寸殑閫氫俊銆?鍥炶皟浼拌鏄渶甯哥敤鐨勬柟寮忎簡(jiǎn)銆?鍥炶皟鐨勮璁℃濇兂寰堢畝鍗曪紝灝辨槸涓や釜瀵硅薄鐩鎬簰娉ㄥ唽錛岀劧鍚庡湪闇瑕佺殑鏃跺欒皟鐢ㄥ鏂圭殑鍑芥暟銆?/p>
濡備笅錛?/p>
榪欐牱錛屽綋A鎵ц鑷繁鐨勬煇浜涘姩浣滅殑鏃跺欙紝灝辮皟鐢˙鐨勫嚱鏁幫紝榪欐牱B灝變細(xì)榪涜鑷繁鐨勬洿鏂版垨鏄竴浜涘鐞嗐?/p>
浣嗘槸錛岀敱浜庝袱涓璞$殑鐩存帴鍥炶皟錛屽鑷翠簡(jiǎn)璁稿涓嶆柟渚夸箣澶勩傜壒鍒槸褰揂鍜孊鐨勫姛鑳介渶瑕佹墿灞曠殑鏃跺欍備緥濡傦細(xì)鐜板湪A鍦ㄦ墽琛岃繃紼嬩腑錛岄渶瑕佽皟鐢˙涓叾瀹冪殑鍔熻兘鍑芥暟銆傝繖鏃跺欏氨涓嶅緱涓嶄慨鏀笰鍜孊鐨勬帴鍙c傜劧鍚庡ぇ瀹墮兘閲嶆柊緙栬瘧錛岃繛鎺ワ紝鎵ц銆?/p>
浜庢槸錛屾垜浠氨浼?xì)鎯充細(xì)涓嶄細(xì)鏈変竴縐嶆洿濂界殑鏂規(guī)硶鏉ヨВ鍐寵繖涓闂銆?澶у鍙互鎯蟲兂錛學(xué)INDOWS涓殑閫氫俊鏈哄埗錛氶氳繃瑙f瀽娑堟伅綾誨瀷鏉ヨ繘琛屽鐞嗐傛槸鐨勶紝娑堟伅鍥炶皟鐨勫ソ澶勫氨鏄柟渚挎墿灞曘?褰撶劧鎴戜滑榪欓噷瑕佽鐨勪笉鏄儚WINDOWS涓偅鏍風(fēng)殑娑堟伅閫氫俊鏈哄埗錛屽浜庢垜浠潵璇達(dá)紝閭g鍋氭硶榪囩箒鐞愩?/p>
鍋囪鐜板湪鏄兂璁〢閫氱煡B涓浜涗簨鎯呫傞偅涔堬紝鎴戜滑鍙互鎶夿鐨剉oid DoB();鍑芥暟浣滀竴鐐圭偣淇敼錛?/p>
鍚岀悊錛屽綋B瑕侀氱煡A鐨勬椂鍊欙紝涔熻繖鏍峰仛灝辮浜?jiǎn)銆?/p>
浣嗘槸錛岃繖鏍蜂篃寰堥夯鐑?chǔ)锛屽叧閿湪浜庡Q屽鏋滅幇鍦ㄥ啓綾籄鐨勪漢騫朵笉鐭ラ亾綾籅鐨勪漢浼?xì)鎬庝箞鍐欙紝鎴栬呰錛岀被B涓嶇煡閬撲粈涔堟椂鍊欒鍐欍傚彟澶栵紝濡傛灉鎴戜滑寮哄埗綾籅瑕佸疄鐜拌繖鏍風(fēng)殑鎺ュ彛錛屼細(xì)鏈夌偣涓嶇幇瀹炪?
姝ゆ椂錛屾垜浠喅瀹氫嬌鐢ㄤ竴涓腑闂村璞℃潵榪炴帴浠栦滑銆?/p>
榪欏氨鏄垜浠紶璇翠腑鐨勭洃鍚櫒浜?jiǎn)銆?鍦∣GRE鎴栨槸涓浜涘箍娉涢噰鐢ㄩ潰鍚戝璞℃濇兂鐨勬簮紼嬪簭涓紝闅忓鍙榪欐牱鐨勬ā寮忋?/p>
榪樻槸鍋囪鏄疉闇瑕侀氱煡B涓浜涗簨鎯呫傞偅涔堬紝鍙互鍦ˋ涓敞鍐岃繖涓璞★紝鐒跺悗璋冪敤瀹冪殑鏂規(guī)硶灝卞彲浠ヤ簡(jiǎn)銆?/p>
鑰屾垜浠湪瀹炵幇B鐨勬椂鍊欙紝闄や簡(jiǎn)瑕佸疄鐜癇鑷繁鐨勪笢瑗夸互澶栵紝榪橀渶瑕佸皢ICallBack媧劇敓騫跺疄鐜?void Do(int Msg)鍑芥暟錛?/p>
榪欐牱錛屽弻鏂逛究寰堣嚜鐒跺湴閫氫簡(jiǎn)淇°傝屽啓綾籄鐨勪漢鏍規(guī)湰涓嶉渶瑕佺悊浼?xì)绫籅鐨勪漢浼?xì)鎬庝箞鍐欙紝涔熶笉鐢ㄥ幓綆$被B浼?xì)鏄粈涔堟牱鐨勭被鍚嶃傚彧瑕佸憡璇夊啓綾籅鐨勪漢錛屼綘闇瑕佸疄鐜拌繖涓狢allback鎺ュ彛錛屽茍涓斿搴旂殑MsgID鏄共浠涔堢敤鐨勫氨O(jiān)K浜?jiǎn)銆?/p>
涔熻鍒濆垵鐨勪竴鐪嬶紝榪欐槸鍚冨姏涓嶈濂界殑宸ヤ綔銆傛瘯绔熶竴涓啓A鐨勪漢錛屼細(xì)鍘繪兂閭d箞澶氫簨鎯呫?鑰屼竴涓啓B鐨勪漢錛岃繕瑕佸幓瀹炵幇涓涓狢allback綾匯備絾鏄紝浠庡彲鎵╁睍鎬э紝鍜岄檷浣庤﹀悎涓婃潵璁詫紝鐨勭‘浼?xì)钃v涓嶅皯鐨勪綔鐢ㄣ?
鑰屼笂闈㈢殑void Do(int MsgID);鍑芥暟錛屽彲浠ュ仛寰楁洿寮哄ぇ涓鐐廣?/p>
鍐欐垚void Do(void* pData); 鑰岃繖涓猵Data鎬庝箞浣跨敤錛屽氨瑕佺湅A鍜孊閫氫俊鐨勫叿浣撳唴瀹逛簡(jiǎn)銆?
鎴戞灝藉姏鍦拌瘯鐫鎶婅嚜宸辨兂瑕佽鐨勮娓呮錛岃阿璋紒
榪戞棩寰堝鏈嬪弸鍜ㄨOverlay涓枃鏄劇ず闂錛屽洖絳旂殑澶氫簡(jiǎn)鎯崇儲(chǔ)鎬у啀鍐欎釜鏂囨。綆椾簡(jiǎn)錛屾斁鍦ㄧ綉涓婂叡浜紝浜庢槸灝辨湁浜?jiǎn)鏈媷銆?/span>
鍦?span>Ogre1.2.5鐗堟湰涓紝閫氳繃涓?span>Ogre瀹樻柟璁哄潧鐨勫紑鍙戣呰璁哄疄鐜頒簡(jiǎn)Overlay鐨勪腑鏂囨樉紺猴紝褰撳垵鐨勫疄鐜伴潪甯哥殑鎬紓錛屽叿浣撶殑瀹炵幇鍙互鍙傝Ogre瀹樻柟璁哄潧銆?/span>
闅忕潃Ogre鐨勬洿鏂幫紝鐜板湪Ogre宸茬粡鍙戝竷浜?span>1.4.7錛?span>1.4緋誨垪鐗堟湰鏈変竴涓噸瑕佺殑鏀硅繘錛屽氨鏄姞鍏ヤ簡(jiǎn)UTFString錛岃繖涓?span>Ogre涓枃鏄劇ず浜堜互寰堝ぇ鐨勫府鍔┿備負(fù)浜?jiǎn)渚夸簬婕斀C猴紝鎴戠洿鎺ヤ嬌鐢?span>Ogre鑷甫鐨?span>Overlay錛屼篃灝辨槸澶у鐔熸?zhèn)夌?span>DebugOverlay錛屾祴璇曞伐紼嬫垜閫夋嫨Demo_ParticleFX錛岄夋嫨鍏朵粬鐨勪篃娌℃湁鍏崇郴銆傜幇鍦ㄧ紪璇戝畠錛岃繍琛屽悗寰楀埌涓嬪浘錛?/span>
鍥劇殑鏈宸︿笅瑙掓樉紺虹殑灝辨槸鑻辨枃DebugOverlay錛屾帴涓嬫潵鎴戜滑鐨勪換鍔″氨鏄妸瀹冪紪紼嬩腑鏂囩殑錛?span>^_^銆?/span>
Overlay涓枃鍖栨搷浣滄楠ゅ涓?/span>
1. 鎵撳紑OgreSDK\media\packs\ OgreCore.zip銆?/span>
2. 鎵撳紑C:\WINDOWS\Fonts錛屾妸simhei.ttf娣誨姞鍒?span>OgreCore.zip錛岋紙浠涔堬紝娌℃湁simhei.ttf榪欎釜鏂囦歡錛岄偅灝辮繕鍏朵粬鐨勪腑鏂?span>ttf瀛椾綋鍚э級(jí)銆?/span>
3. 鎵撳紑OgreCore.zip涓殑Ogre.fontdef錛岄噷闈㈡湁BlueHighway榪欎釜瀛椾綋瀹氫箟鍧楋紝鍦ㄤ粬鐨勪笅闈㈡坊鍔犳垜浠殑SimHei錛?span>code_points閲岄潰鐨勪竴澶у爢鏁板瓧鐪嬩笉鏄庣櫧娌″叧緋伙紝闅忓悗鏂囩珷浼?xì)瑙i噴銆?/span>
SimHei
{
type truetype
source simhei.ttf
size 16
resolution 96
code_points 33-166 24403-24403 21069-21069 24103-24103 36895-36895 29575-29575 24179-24179 22343-22343 26368-26368 39640-39640 20302-20302 19977-19977 35282-35282 24418-24418 25968-25968 37327-37327 25209-25209 27425-27425
}
4. 鎵撳紑OgreCore.zip涓殑OgreDebugPanel.overlay錛屾妸BlueHighway鍏ㄩ儴鏇挎崲鎴?span>SimHei錛屾垜浠浣跨敤涓枃瀛椾綋浜?jiǎn)锛屽樋鍢裤?/span>
5. 淇敼瀹屾垚鍚庯紝紜繚鎵鍋氱殑淇敼宸茬粡淇濆瓨鍒?span>OgreCore.zip銆?/span>
6. 榪涘叆Ogre瑙e喅鏂規(guī)錛屾墦寮鏂囦歡ExampleFrameListener.h錛屾妸54-59琛岀殑浠g爜鏇挎崲濡備笅錛?/span>
static String currFps = "Current FPS: ";
static String avgFps = "Average FPS: ";
static String bestFps = "Best FPS: ";
static String worstFps = "Worst FPS: ";
static String tris = "Triangle Count: ";
static String batches = "Batch Count: ";
static DisplayString currFps = L"褰撳墠甯ч熺巼: ";
static DisplayString avgFps = L"騫沖潎甯ч熺巼: ";
static DisplayString bestFps = L"鏈楂樺撫閫熺巼: ";
static DisplayString worstFps = L"鏈浣庡撫閫熺巼: ";
static DisplayString tris = L"涓夎褰㈡暟閲?span>: ";
static DisplayString batches = L"鎵規(guī): ";
7. 鏈鍚庨噸鏂扮紪璇戝伐紼嬶紝涓嬮潰鏄垜榪愯鐨勬埅鍥撅紝鏄笉鏄凡緇忔樉紺轟腑鏂囦簡(jiǎn)錛?span>^_^銆?/span>
鐜板湪鍐嶆潵鐪嬬湅SimHei涓殑code_points鏄浣曠敓鎴愮殑錛岃繖涓彲浠ュ弬鑰冩垜涓婃鍐欑殑榪欑瘒鏂囩珷http://www.cnblogs.com/gogoplayer/archive/2008/05/09/1189795.html錛岃嚦姝わ紝瀹炵幇Overlay涓枃鏄劇ず銆?/span>
杞澆璇鋒敞鏄庡嚭澶勶細(xì)
浣滆咃細(xì)gogoplayer
E-mail : gogoplayer@163.com
QQ : 78939328
http://www.gogoplayer.com.cn璋紵浜?nbsp; feiyurainy@163.com
杞澆璇鋒敞鏄庡嚭澶?/p>
寰堟棭浠ュ墠灝辨兂鍐欎竴浜涘叧浜?span>OGRE鐨勬枃绔犱簡(jiǎn)錛屼竴鐩存病鏈轟細(xì)銆?/span>
鐞嗚В涓涓覆鏌撳紩鎿庯紝鎴戣寰楁渶閲嶈鐨勬槸鍏堟姄浣忎簡(jiǎn)瀹冪殑涓繪灦鏋勶紝瀹冪殑涓葷嚎錛屾覆鏌撴祦紼嬶紝涓嶇劧鐨勮瘽錛屼竴涓紩鎿庡嚑涓囪錛岀敋鑷沖嚑鍗佷竾琛岀殑浠g爜錛屽厜鏄墦寮solution灝辮兘鍚撲綘涓璺充簡(jiǎn)錛?/span>OGRE涔熸湁鍗佸嚑涓囪鐨勪唬鐮侀噺錛屾垜涓寮濮嬬湅瀹冪殑鏃跺欎篃鏄棤浠庝笅鎵嬶紝鎰熻浠g爜澶浜?jiǎn)锛屼笉鐭ラ亾浠庡摢寮濮嬬湅濂斤紝榪欎釜class鐪嬬湅錛岄偅涓?/span>class鐪嬬湅錛岀敱浜庡鏁翠釜寮曟搸娌℃湁涓涓竻鏅扮殑璁よ瘑錛岀湅榪囦簡(jiǎn)涔熷嵃璞′笉娣憋紝鎵浠ワ紝鏈鍚庯紝榪樻槸鍐沖畾鍏堟壘鍑哄畠鐨勪富綰匡紝浜?jiǎn)瑙e畠鐨勬覆鏌搵箒绋嬪Q岃繖鏍鋒墠鑳芥湁鏈哄湴鎶婂悇涓儴鍒嗚仈緋昏搗鏉ャ?/span>
榪欑瘒鐭枃涔熸槸瀵?/span>OGRE鐨勪富瑕佹覆鏌撴祦紼嬬殑涓涓粙緇嶏紝鍙兘瀵逛竴浜?/span>class涓嶄細(xì)澶鍦板幓浠嬬粛鍏蜂綋鐨勫疄鐜扮粏鑺傘傛垜鎵鐢ㄧ殑浠g爜閮芥槸鍙栬嚜浜?/span>OGRE鐨勬渶鏂扮殑CVS鐗堟湰銆?/span>
璇昏呮渶濂藉OGRE鏈変竴瀹氱殑浜?jiǎn)瑙eQ岃嚦灝戝緱鐪嬫噦瀹冪殑example錛屼笉鐒跺彲鑳戒竴浜涗笢瑗跨悊瑙h搗鏉ユ瘮杈冨洶闅俱傚D3D錛?/span>OPENGL鏈変竴瀹氫簡(jiǎn)瑙f洿濂姐?/span>
濡傛灉浣犵湅榪?/span>D3D SDK涓甫鐨勪緥瀛愶紝浣犱竴瀹氱煡閬撲竴涓瘮杈冪畝鍗曠殑3D紼嬪簭瑕佽繍琛岃搗鏉ワ紝鑷沖皯閮戒細(xì)娑夊強(qiáng)浠ヤ笅鐨勫嚑閮ㄥ垎錛?/span>
棣栧厛鏄暟鎹殑鏉ユ簮錛屽寘鎷《鐐規(guī)暟鎹紝綰圭悊鏁版嵁絳夛紝榪欎簺鏁版嵁鍙互浠庢枃浠朵腑璇誨彇錛屼篃鍙互鍦ㄧ▼搴忚繍琛屾椂鐢熸垚銆?/span>
鎺ヤ笅鏉ワ紝鎴戜滑浼?xì)寰忕珛椤剁偣缂撳啿鍖烘妸椤剁偣淇濆瓨钃v鏉ワ紝寤虹珛texture瀵硅薄鏉ヨ〃紺?/span>texture錛屽欏剁偣緇勬垚鐨勭墿浣撹緗畠鍦ㄤ笘鐣屽潗鏍囩郴涓嬬殑鍧愭爣錛岃緗憚鍍忔満鐨勪綅緗紝瑙嗙偣錛岃緗?/span>viewport鐨勪綅緗拰澶у皬錛岀劧鍚庡氨鍙互鍦ㄦ覆鏌撳驚鐜腑寮濮嬭皟鐢ㄦ覆鏌撴搷浣滀簡(jiǎn)錛岀粡榪囦簡(jiǎn)front buffer鍜?/span>back buffer鐨勪氦鎹紝鎴戜滑灝辮兘鍦ㄥ睆騫曚笂鐪嬪埌3D鍥懼艦浜?jiǎn)锛屼吉浠g爜濡備笅锛?xì)
setupVertexBuffer
setWorldTransform
setCamera
setProjectionTransform
setViewport
beginFrame
setTexture
drawObject
endFrame
浠ヤ笅灝辨槸娓叉煋涓涓墿浣撶殑涓昏姝ラ錛屽湪鎴戠湅鏉ワ紝榪欏氨鏄?/span>3D紼嬪簭鐨勪富綰匡紝鍚屾牱閬撶悊錛屾棤璁轟綘澶氬鏉傜殑娓叉煋寮曟搸錛岄兘寰楀疄鐜頒笂榪扮殑榪欎簺姝ラ錛屽叾浠栫殑涓浜涙晥鏋滃闃村獎(jiǎng)錛屽厜鐓х瓑錛岄兘鏄檮鐫鍦ㄨ繖鏉′富綰夸笂鐨勶紝鎵浠ワ紝濡傛灉浣犺兘鍦ㄤ綘鎵鐮旂┒鐨勬覆鏌撳紩鎿庝笂涔熸竻鏅板湴鐪嬪埌榪欐潯涓葷嚎錛屽彲鑳藉浣犳繁鍏ュ湴鐮旂┒瀹冧細(xì)澶ф湁甯姪錛屼笅闈紝鎴戜滑灝變竴璧鋒潵鎵懼埌OGRE涓殑榪欐潯涓葷嚎銆?/span>
OGRE鐨勬覆鏌撳驚鐜兘鏄搗婧愪簬Root::renderOneFrame錛岃繖涓嚱鏁板湪OGRE鑷甫鐨?/span>example涓槸涓嶄細(xì)鏄懼紡璋冪敤鐨勶紝鍥犱負(fù)example閮借皟鐢ㄤ簡(jiǎn)Root::startRendering錛岀敱startRendering鏉ヨ皟鐢?/span>renderOneFrame錛屽鏋滀綘鐢?/span>OGRE鏉ュ啓鐪熸鐨勬父鎴忥紝鎴栬呯紪杈戝櫒錛屼綘鍙兘灝遍渶瑕佸湪鐨勬秷鎭富寰幆涓皟鐢?/span>renderOneFrame浜?jiǎn)锛寵鍛謵嶆濅箟錛岃繖涓嚱鏁板氨鏄鏁翠釜OGRE榪涜涓甯х殑鏇存柊錛屽寘鎷姩鐢伙紝娓叉煋鐘舵佺殑鏀瑰彉錛屾覆鏌?/span>api鐨勮皟鐢ㄧ瓑錛屽湪榪欎釜鍑芥暟涓紝浼?xì)鍖呮嫭浜?jiǎn)鎴戜滑涓婅堪浼唬鐮佺殑鍑犱箮鍏ㄩ儴鍐呭錛屾墍浠ユ槸鏈枃鐨勯噸鐐規(guī)墍鍦ㄣ?/span>
榪涘叆renderOneFrame錛屽彲浠ョ湅鍒板ご灝句袱涓?/span>fire鍑芥暟錛岃繖縐嶅嚱鏁板湪OGRE涓粡甯稿嚭鐜幫紝涓鑸兘鏄?/span>fire…start鍜?/span>fire…end涓璧峰嚭鐜扮殑錛屽湪榪欎簺鍑芥暟涓紝鍙兘浼?xì)澶勭悊涓浜涚敤鎴瘋嚜瀹氫箟鐨勬搷浣滐紝濡?/span>_fireFrameStarted灝變細(xì)瀵規(guī)墍浠ョ殑frameListener榪涜澶勭悊錛岃繖浜?/span>fire鍑芥暟鍙互鏆傛椂涓嶇敤鐞嗕細(xì)錛岀戶緇湅_updateAllRenderTargets錛屽湪榪欎釜鍑芥暟涓紝浼?xì)濮攱z懼綋鍓嶆墍鐢ㄧ殑renderer瀵規(guī)墍鏈夊垱寤哄嚭鏉ョ殑render target榪涜update錛?/span>render target涔熷氨鏄覆鏌撶殑鐩殑鍦幫紝涓鑸細(xì)鏈変袱縐嶏紝涓縐嶆槸render texture錛屼竴縐嶆槸render buffer錛屾帴鐫榪涘叆RenderSystem::_updateAllRenderTargets錛屽彲浠ョ湅鍒板湪render system涓紝瀵瑰垱寤哄嚭鏉ョ殑render target鏄敤RenderTargetPriorityMap鏉ヤ繚瀛樼殑錛屼互渚挎寜鐓т竴瀹氱殑欏哄簭鏉ュrender target榪涜update錛屽洜涓哄湪娓叉煋鐗╀綋鍒?/span>render buffer鏃訛紝涓鑸細(xì)鐢ㄥ埌涔嬪墠娓叉煋濂界殑render texture錛屾墍浠?/span>render texture褰㈠紡鐨?/span>render target闇瑕佸湪render buffer涔嬪墠榪涜鏇存柊銆?/span>
榪涘叆render target鐨?/span>update錛屽彲浠ョ湅鍒幫紝瀹冧粛鐒舵妸update鎿嶄綔緇х畫浼犻掍笅鍘伙紝璋冪敤鎵鏈夋寕鍦ㄨ繖涓?/span>render target涓婄殑viewport鐨?/span>update銆?/span>
Viewport鍏跺疄灝辨槸瀹氫箟浜?/span>render target涓婄殑涓鍧楄榪涜鏇存柊鐨勫尯鍩燂紝鎵浠ヤ竴涓?/span>render target鏄彲浠ユ寕澶氫釜viewport鐨勶紝浠ュ疄鐜板浜哄鎴樻椂鍒嗗睆錛屾垨鑰呮槸鐢諱腑鐢葷瓑鏁堟灉錛屽彲浠ユ妸OGRE涓殑viewport鐪嬫垚鏄繚瀛?/span>camera鍜?/span>rendertarget榪欎袱鑰呯殑緇勫悎錛屾妸viewport涓墍瀹氫箟鐨?/span>camera鎵鐪嬪埌鐨勫満鏅唴瀹規(guī)覆鏌撳埌viewport鎵瀹氫箟鐨?/span>render target鐨勫尯鍩熼噷銆?/span>
Viewport榪樻湁涓涓噸瑕佷俊鎭槸ZOrder錛屽彲浠ョ湅鍒?/span>RenderTarget涓殑ViewportList甯︽湁涓涓瘮杈冨嚱鏁幫紝鎵浠ュ湪RenderTarget::update涓紝ZOrder瓚婂皬鐨勶紝瓚婂厛琚覆鏌擄紝鎵浠ワ紝濡傛灉涓や釜viewport鎵瀹氫箟鐨勫尯鍩熶簰鐩擱噸鍙犱簡(jiǎn)錛岃屼笖ZOrder鍙堜笉涓鏍鳳紝鏈緇堢殑鏁堟灉灝辨槸ZOrder灝忕殑viewport鐨勫唴瀹逛細(xì)琚?/span>ZOrder澶х殑viewport鐨勫唴瀹規(guī)墍瑕嗙洊銆?/span>
緇х畫榪涘叆Viewport::update錛屽氨鍍忓墠闈㈡墍璇達(dá)紝瀹冭皟鐢ㄥ畠鎵寮曠敤鐨?/span>camera鏉ユ覆鏌撴暣涓満鏅紝鑰屽湪Camera::_renderScene涓紝鏄皟鐢?/span>SceneManager::_renderScene(Camera* camera, Viewport* vp, bool includeOverlays)銆?/span>SceneManager::_renderScene閲屽氨鏄叿浣撶殑娓叉煋嫻佺▼浜?jiǎn)銆備粠鍑芥暟鍚嶇О榪樻湁鍙傛暟涔熷彲浠ョ湅鍑烘潵錛岃繖涓嚱鏁扮殑浣滅敤灝辨槸鍒╃敤鎵鎸囧畾鐨?/span>camera鍜?/span>viewport錛屾潵鎶婂満鏅腑鐨勫唴瀹規(guī)覆鏌撳埌viewport鎵鎸囧畾鐨?/span>render target鐨勬煇鍧楀尯鍩熶腑銆傛牴鎹?/span>camera錛屾垜浠彲浠ュ畾鍑?/span>view matrix錛?/span>projection matrix錛岃繕鍙互榪涜瑙嗛敟鍓旈櫎錛屽彧娓叉煋鐪嬪緱瑙佺殑鐗╀綋銆傛敞鎰忥紝鎴戜滑榪欓噷鍙湅鏍囧噯鐨?/span>SceneManager鐨勬柟娉曪紝涓嶇湅BspSceneManager媧劇敓綾葷殑鏂規(guī)硶錛岃屼笖錛屾垜浠細(xì)鎶涘紑璺熶富綰挎棤鍏崇殑鍐呭錛屽瀵?/span>shadow鐨?/span>setup錛岄楠煎姩鐢葷殑鎾斁錛?/span>shader鍙傛暟鐨勪紶閫掔瓑錛屽洜涓烘垜浠彧娉ㄩ噸娓叉煋鐨勪富嫻佺▼銆?/span>
鍦?/span>SceneManager::_renderScene涓墍搴旂湅鐨勭涓涓噸瑕佸嚱鏁版槸_updateSceneGraph錛?/span>OGRE瀵瑰満鏅殑緇勭粐鏄氳繃鑺傜偣鏍?wèi)鏉ゾl勭粐鐨勶紝涓涓妭鐐癸紝浣犲彲浠ョ湅鎴愭槸絀洪棿涓殑鏌愪簺鍙樻崲鐨勭粍鍚堬紝濡備綅緗紝緙╂斁錛屾棆杞瓑錛岃繖浜涘彉鎹紝浼?xì)浣滅敤鍒版寕鎺ュ湪杩欎簺鑺傜偣涓婄殑鍏蜂綋鐨勭墿浣撶殑淇℃伅锛屼篃灏辨槸璇村Q岃妭鐐逛繚瀛樹簡(jiǎn)world transform錛屽鍏蜂綋鐨勭墿浣擄紝濡備竴涓漢錛屽湪絀洪棿涓殑瀹氫綅錛岄兘鏄氳繃鎿嶄綔鑺傜偣鏉ュ畬鎴愮殑銆傚悓鏃惰妭鐐硅繕淇濆瓨浜?jiǎn)涓涓笘鐣屽潗鏍囩殑AABB錛岃繖涓?/span>AABB鑳藉綰蟲墍鏈夊畠鎵鎸傛帴鐨勭墿浣撶殑澶у皬錛屼富瑕佹槸鐢ㄤ簬瑙嗛敟瑁佸噺鐨勶紝濡傛灉褰撳墠鎽勫儚鏈虹湅涓嶈鏌愪釜鑺傜偣鐨?/span>AABB錛岄偅涔堣鏄庢憚鍍忔満鐪嬩笉瑙佽妭鐐規(guī)墍鎸傛帴鐨勬墍鏈夌墿浣擄紝鎵浠ュ湪娓叉煋鏃跺彲浠ュ榪欎釜鑺傜偣瑙嗚屼笉瑙併?/span>
_updateSceneGraph鐨勫唴閮ㄥ鐞嗘瘮杈冪箒鐞愶紝鎴戜滑鍙渶鐭ラ亾錛岀粡榪囦簡(jiǎn)_updateSceneGraph錛屽満鏅妭鐐規(guī)爲(wèi)涓殑姣忎釜鑺傜偣閮界粡榪囦簡(jiǎn)鏇存柊錛屽寘鎷綅緗紝緙╂斁錛屽拰鏂逛綅錛岃繕鏈夎妭鐐圭殑鍖呭洿鐩掋?/span>
緇х畫鍥炲埌SceneManager::_renderScene錛屾帴涓嬫潵瑕佺湅鐨勬槸setViewport錛屽畠浼?xì)璋冪敤鍏蜂綋鐨?/span>renderer鐨?/span>setviewport鐨勬搷浣滐紝璁劇疆viewport涓墍鎸傛帴鐨?/span>render target涓哄綋鍓嶆墍瑕佹覆鏌撶殑鐩爣錛?/span>viewport涓殑鍖哄煙涓哄綋鍓嶆墍瑕佹覆鏌撶殑鐩爣涓殑鍖哄煙銆?/span>
鎺ヤ笅鏉ヨ紕板埌OGRE娓叉煋嫻佺▼涓殑涓涓噸瑕佺殑姒傚康錛?/span>Render Queue銆傝繖涓笢瑗垮疄鍦ㄥ唴瀹規(guī)瘮杈冨錛岃繕鏄互鍚庢湁鏈轟細(xì)鍗曠嫭鎻愬嚭鏉ヨ鍚э紝浣犲彲浠ョ畝鍗曟妸瀹冩兂鎴愭槸涓涓鍣紝閲岄潰鐨勫厓绱犲氨鏄?/span>renderable錛屾瘡涓?/span>renderable鍙互鐪嬫垚鏄瘡嬈¤皟鐢?/span>drawprimitive鍑芥暟鎵娓叉煋鐨勭墿浣擄紝鍙互鏄竴涓ā鍨嬶紝涔熷彲浠ユ槸妯″瀷鐨勪竴閮ㄥ垎銆傚湪RenderQueue涓紝瀹冧細(xì)鎸夋潗璐ㄦ潵鍒嗙粍榪欎簺renderable錛岃繕浼?xì)瀵?/span>renderable榪涜鎺掑簭銆?/span>
鍦ㄦ瘡涓嬈¤皟鐢?/span>SceneManager::_renderScene鏃訛紝閮戒細(xì)璋冪敤SceneManager::prepareRenderQueue鏉ユ竻鐞?/span>RenderQueue錛岀劧鍚庡啀璋冪敤SceneManager::__findVisibleObjects鏉ユ妸褰撳墠鎽勫儚鏈烘墍鑳界湅瑙佺殑鐗╀綋閮藉姞鍏ュ埌RenderQueue涓?/span>
SceneManager::__findVisibleObjects鏄竴涓掑綊鐨勫鐞嗚繃紼嬶紝瀹冧粠鍦烘櫙鐨勬牴鑺傜偣寮濮嬶紝鍏堟鏌ユ憚鍍忔満鏄惁鑳界湅瑙佽繖涓妭鐐圭殑鍖呭洿鐩掞紙鍖呭洿鐩掑湪_updateSceneGraph鏃跺凡緇忚綆楀ソ浜?jiǎn)锛?jí)錛屽鏋滅湅涓嶈錛岄偅涔堣繖涓妭鐐癸紝榪樻湁瀹冪殑瀛愯妭鐐歸兘涓嶇敤綆′簡(jiǎn)銆傚鏋滆兘鐪嬭錛屽啀媯(gè)嫻嬫寕鍦ㄨ繖涓妭鐐逛笂鐨勬墍鏈?/span>MovableObject錛屽鏋滃綋鍓嶆墍媯(gè)嫻嬬殑MovableObject鏄彲瑙佺殑錛屽氨浼?xì)璋冪敤瀹冪?/span>_updateRenderQueue鏂規(guī)硶錛屼竴鑸湪榪欎釜鏂規(guī)硶閲屽氨鍙互鎶婂拰榪欎釜MovableObject鐩稿叧鐨?/span>renderable閫佸叆RenderQueue浜?jiǎn)銆?/span>
榪欓噷瑕佽璇?/span>MovableObject錛?/span>MovableObject涓昏鏄敤浜庤〃紺哄満鏅腑紱繪暎鐨勭墿浣擄紝濡?/span>Entity錛岄【鍚嶆濅箟錛岃兘縐誨姩鐨勭墿浣擄紝涓嶈繃瀹冪殑“鑳界Щ鍔?#8221;榪欎釜鑳藉姏鏄閫氳繃SceneNode鏉ュ疄鐜扮殑錛屾墍浠?/span>MovableObject鏉ヨ兘鏄劇ず鍑烘潵錛岄鍏堝緱鍏堟寕鎺ュ湪鏌愪釜鍦烘櫙鑺傜偣涓婏紝閫氳繃鍦烘櫙鑺傜偣鏉ュ畾浣嶃備綘鍙互鎺у埗MovableObject鐨勪竴浜涘睘鎬э紝濡傛煇涓?/span>MovableObject鏄惁瑕佹樉紺猴紝鏄惁瑕侀殣钘忥紝閮藉彲浠ラ氳繃MovableObject::setVisible鏂規(guī)硶鏉ュ疄鐜般?/span>
媯(gè)嫻嬪畬璇ヨ妭鐐逛笂鐨?/span>MovableObject涔嬪悗錛屽氨緇х畫璋冪敤鎵鏈夊瓙鑺傜偣鐨?/span>_findVisibleObjects鏂規(guī)硶錛屼竴鐩撮掑綊涓嬪幓銆傝繖鏍鳳紝灝辮兘鎶婂満鏅腑鎵鏈夎娓叉煋鐨?/span>renderable鎵鍔犲叆鍒?/span>RenderQueue涓簡(jiǎn)銆?/span>
鑷蟲錛屾垜浠氨鎷ユ湁浜?jiǎn)瑕佹覆鏌撶殑鐗╀綋鐨勪俊鎭簡(jiǎn)锛屾帴涓嬫潵灏辨槸瀵箻q欎簺鐗╀綋榪涜娓叉煋浜?jiǎn)锛屼綘浼?xì)鍙戠幇璺?/span>D3D鎴?/span>OpenGL鐨勪唬鐮佸緢綾諱技鐨勮皟鐢細(xì)
mDestRenderSystem->clearFrameBuffer
mDestRenderSystem->_beginFrame
mDestRenderSystem->_setProjectionMatrix
mDestRenderSystem->_setViewMatrix
_renderVisibleObjects();
mDestRenderSystem->_endFrame();
榪欎簺api鐨勪綔鐢ㄥ拰D3D涓殑綾諱技璋冪敤鐨勪綔鐢ㄩ兘宸笉澶氾紝榪欓噷鍐嶈涓涓?/span>_renderVisibleObjects()錛屽湪榪欎釜鍑芥暟涓紝浼?xì)瀵?/span>RenderQueue涓殑姣忎釜renderable榪涜娓叉煋錛岀敤鐨勬槸visitor妯″紡鏉ラ亶鍘嗘搷浣滄瘡涓?/span>renderable錛屾渶緇堝湪SceneManager::renderSingleObject涓彇鍑烘瘡涓?/span>renderable鎵淇濆瓨鐨勯《鐐癸紝绱㈠紩錛屼笘鐣岀煩闃電瓑淇℃伅錛屾潵榪涜娓叉煋銆傝繖鍏朵腑榪樺寘鎷簡(jiǎn)鏌ユ壘紱昏renderable鏈榪戠殑鍏夋簮絳夋搷浣滐紝姣旇緝澶嶆潅銆?/span>
鍒拌繖閲岋紝SceneManager::_renderScene鐨勬祦紼嬪熀鏈蛋瀹屼簡(jiǎn)錛屼篃灝辨槸璇達(dá)紝OGRE涓甯т腑鐨勬覆鏌撴祦紼嬪樊涓嶅涔熺粨鏉熶簡(jiǎn)錛屼綘搴旇涔熷彂鐜幫紝榪欎釜嫻佺▼璺熶綘鐢?/span>D3D鍐欎竴涓畝鍗曠▼搴忕殑嫻佺▼鍩烘湰鏄竴鏍風(fēng)殑錛屽湪榪欎釜嫻佺▼鐨勫熀紜涓婏紝鍐嶅幓鐪嬪叿浣撶殑瀹炵幇錛屽鎬庝箞鏍瘋緗汗鐞嗭紝鎬庝箞鏍瘋皟鐢ㄤ綘鐔熸?zhèn)夌?/span>D3D鎴?/span>OpenGL鐨?/span>API鏉ユ覆鏌撶墿浣擄紝搴旇浼?xì)绠鍗曞緱澶氥?/span>
瀵?/span>OGRE鐨勬覆鏌撴祦紼嬬殑澶ф浠嬬粛鍒拌繖閲屼篃緇撴潫浜?jiǎn)锛屽緢澶毦l嗚妭閮芥病娑夊強(qiáng)錛屼互鍚庢湁鏈轟細(xì)鍐嶅啓鍚с?/span>
銆婃父鎴忎腑鐨勮祫婧愮鐞嗏曗曡祫婧愰珮閫熺紦瀛樸?br>杞澆璇鋒敞鏄庡嚭澶勶細(xì)http://groups.google.com/group/jianguhan
1.浠涔堟槸璧勬簮楂橀熺紦瀛?
璧勬簮楂橀熺紦瀛樼殑鍘熺悊涓庡叾瀹冨唴瀛橀珮閫熺紦瀛樼殑宸ヤ綔鍘熺悊鏄浉浼肩殑銆傚湪娓告垙鐨勭姸鎬佽漿鎹㈣繃紼嬩腑錛屾湁浜涙暟鎹槸鍒氭墠浣跨敤榪囩殑錛岄偅涔堢洿鎺ヤ粠璧勬簮楂橀熺紦瀛樹腑杞藉叆鍗沖彲銆備緥濡傦紝RPG娓告垙涓富瑙掍粠澶у湴鍥捐繘鍏ヤ竴涓埧闂達(dá)紝鎺㈢儲(chǔ)涓鐣悗涓昏閫鍑烘埧闂達(dá)紝姝ゆ椂鍙鐩存帴浠庣紦瀛樹腑杞藉叆澶у湴鍥炬暟鎹嵆鍙紝鑺傜渷浜?jiǎn)浠幖嫭鐩樿浇鍏ユ暟鎹殑鏃堕椷_(dá)紝瑕佺煡閬撲粠紜洏杞藉叆鏁版嵁鏄潪甯?shy;鎱㈢殑銆傚綋鐒?dòng)灱屽鏋滀綘鐨勬父鎴忔墍浣跨敤鐨勬暟鎹枃浠跺緢灝戯紝閭d箞浣犲彲浠ュ湪娓告垙榪愯榪囩▼涓妸榪欎簺鏁版嵁瀹屽叏鍌ㄥ瓨鍦ㄥ唴瀛樹腑錛岃屼笉浣跨敤璧勬簮楂橀熺紦瀛樸?
2.涓涓畝鍗曠殑璧勬簮楂橀熺紦瀛樼鐞嗗櫒
涓嬮潰鎴戝皢鍚戜綘灞曠ず涓涓瘮杈冪畝鍗曠殑璧勬簮楂橀熺紦瀛樼鐞嗗櫒錛屾簮浠g爜鏉ヨ嚜鎴戜笂涓涓父鎴忥紝濡傛灉浣犻渶瑕佺煡閬撴洿澶氬叧浜庤祫婧愰珮閫熺紦瀛樻柟闈㈢殑鐭ヨ瘑錛岃鍙傝?lt;<Game Coding Complete>>鐨勭鍏珷銆?
棣栧厛錛岄渶瑕佷竴涓満鍒舵潵鍞竴鏍囪瘑涓涓祫婧愶紝鎴戜滑鐢ㄤ笅闈㈣繖涓粨鏋勬潵鍋氳祫婧愬彞鏌勶細(xì)
struct ResHandle
{
ResHandle(std::string &resName, void *buffer, int size)
{
m_resName = resName;
m_size = size;
m_buffer = buffer;
}
~ResHandle()
{
if (m_buffer != 0) delete[] m_buffer;
}
std::string m_resName; //璧勬簮鍚?
void *m_buffer; //璧勬簮鍙ユ焺鎵鏍囪瘑鐨勮祫婧?
DWORD m_size; //璧勬簮鎵鍗犲唴瀛樺ぇ灝?
};
濂戒簡(jiǎn)錛岀幇鍦ㄦ垜浠彲浠ヤ粠璧勬簮鍚嶆潵鎵懼嚭榪欎釜璧勬簮浜?jiǎn)锛屾帴涓嬫潵瀹炵幇杩欎釜璧勬簮楂橀熺紦瀛樼鐞嗗櫒錛?
class CacheManager
{
public:
CacheManager();
~CacheManager();
//杞藉叆璧勬簮錛宺esName涓鴻祫婧愬悕錛岃嫢杞藉叆鎴愬姛size琚涓鴻璧勬簮鐨勫ぇ灝?
//娉ㄦ剰錛岀鐞嗕腑鐨勮祫婧愪笉鑳藉湪綆$悊鍣ㄥ鐢╠elete鏄劇ず鐨勫垹闄ゅ畠
void* Load(std::string resName, DWORD *size = 0);
//璁劇疆緙撳瓨澶у皬錛屽崟浣峂B
void SetCacheSize(int sizeMB) { m_cacheSize = sizeMB * 1024 * 1024; }
//寰楀埌緙撳瓨澶у皬錛屽崟浣峂B
int GetCacheSize() { return m_cacheSize / 1024 /1024; }
private:
void Free(); //閲婃斁lru閾捐〃涓渶鍚庝竴涓祫婧?
void *Update(ResHandle *res); //鏇存柊l(fā)ru閾捐〃
ResHandle *Find(std::string &resName); //鎵懼嚭璇ヨ祫婧愬悕鐨勮祫婧愬彞鏌?
private:
DWORD m_cacheSize; //緙撳瓨澶у皬
DWORD m_allocated; //宸蹭嬌鐢ㄧ殑緙撳瓨澶у皬
//lru閾捐〃錛岃褰曟渶榪戣浣跨敤榪囩殑璧勬簮
std::list<ResHandle*> m_lru;
//璧勬簮鏍囪瘑鏄犲皠
std::map<std::string, ResHandle*> m_resources;
};
CacheManager:: CacheManager ()
{
m_cacheSize = 0;
m_allocated = 0;
}
CacheManager::~ CacheManager ()
{
while (!m_lru.empty()) Free(); //閲婃斁鎵鏈夌鐞嗕腑鐨勮祫婧?
}
void * CacheManager::Load(std::string resName, DWORD *size)
{
ResHandle *handle = Find(resName); //鏌ユ壘璇ヨ祫婧愭槸鍚﹀湪緙撳瓨涓?
if (handle != 0) //濡傛灉鎵懼埌璇ヨ祫婧愬彞鏌勶紝鍒欒繑鍥炶璧勬簮騫舵洿鏂發(fā)ru閾捐〃
{
if (size != 0) *size = handle->m_size;
return Update(handle);
}
else
{
//鍏堟嫻嬭祫婧愬ぇ灝?
DWORD _size = 璧勬簮澶у皬;
//鏄惁鏈夎凍澶熺┖闂?
while (_size > (m_cacheSize - m_allocated))
{
if (m_lru.empty()) break;
Free();
}
m_allocated += _size;
buffer = new char[_size];
//鍦ㄨ繖閲岀敤浠諱綍浣犺兘鎯沖埌鐨勫姙娉曡澆鍏ヨ祫婧愭枃浠跺埌buffer
…
…
//璁板綍褰撳墠璧勬簮
ResHandle *handle = new ResHandle(resName, buffer, _size);
m_lru.push_front(handle);
m_resources[resName] = handle;
if (size != 0) *size = _size;
return buffer;
}
return 0;
}
void CacheManager::Free()
{
std::list<ResHandle*>::iterator gonner = m_lru.end();
gonner--;
ResHandle *handle = *gonner;
m_lru.pop_back();
m_resources.erase(handle->m_resName);
m_allocated -= handle->m_size;
delete handle;
}
void * CacheManager::Update(ResHandle *res)
{
m_lru.remove(res);
m_lru.push_front(res);
m_size = res->m_size;
return res->m_buffer;
}
ResHandle * CacheManager::Find(std::string &resName)
{
std::map<std::string, ResHandle*>::iterator it = m_resources.find(resName);
if (it == m_resources.end()) return 0;
return (*it).second;
}
鑷蟲錛屼綘宸茬粡鍙互鍦ㄦ父鎴忎腑緙撳瓨浠諱綍浣犳兂緙撳瓨鐨勮祫婧愪簡(jiǎn)^_^
3. 璧勬簮綆$悊榪涢樁
鑷蟲浣犲凡緇忓彲浠ュ湪娓告垙涓紦瀛樹換浣曚綘鎯崇紦瀛樼殑璧勬簮浜?jiǎn)锛屼絾鏄綘鐨勪徽d姟榪樻病瀹屾垚錛屽綋浣犺姹傜殑璧勬簮瀛樺湪浜庣紦瀛樹箣澶栨椂錛岄偅涓棯鑰鐨勭‖鐩樼伅鍙兘灝辨槸鐜╁鏈鎰熷叴瓚g殑涓滆タ浜?jiǎn)銆?
鍥犳浣犲繀欏繪牴鎹笉鍚岀殑娓告垙綾誨瀷浣跨敤涓嶅悓鐨勮澆鍏ユ柟寮忥細(xì)
涓嬈¤澆鍏ユ墍鏈変笢瑗匡細(xì)閫傜敤浜庝換浣曚互鐣岄潰鎴栧叧鍗″垏鎹㈢殑娓告垙
鍙湪鍏抽敭鐐硅澆鍏ヨ祫婧愶細(xì)寰堝灝勫嚮娓告垙閮戒嬌鐢ㄨ繖鏍風(fēng)殑璁捐錛屽“鍗婃潯鍛?#8221;
鎸佺畫杞藉叆錛氶傜敤浜庡紑鏀懼瀷鍦板浘鐨勬父鎴忥紝濡?#8220;渚犵洍鐚庤濺鎵?#8221;
濡傛灉鏈夊彲鑳界殑璇濓紝浣犺繕鍙互浣跨敤緙撳瓨棰勬祴鏈哄埗錛屽綋CPU鏈夐澶栨椂闂寸殑鏃跺欏彲浠ユ妸鏈潵鍙兘鐢ㄥ埌鐨勮祫婧愯澆鍏ュ埌璧勬簮楂橀熺紦瀛樸?
鏈鍚庯紝灝界鍦ㄦ父鎴忕殑璧勬簮綆$悊涓祫婧愭墦鍖呬笉鏄繀欏葷殑錛屼絾浠嶇劧寤鴻澶у鎶婅祫婧愭枃浠舵寜綾誨瀷鍒嗗埆鎵撳寘鍒板崟涓鐨勬枃浠朵腑錛岃繖灝嗕負(fù)浣犺妭鐪佺鐩樼┖闂達(dá)紝騫跺姞蹇父鎴忕殑杞藉叆閫熷害銆?
鍑?guó)檱猦ttp://blog.csdn.net/duzhi5368/archive/2008/04/22/2314232.aspx
浣跨敤璁捐妯″紡鏉ユ彁楂樼▼搴忓簱鐨勯噸澶嶅埄鐢ㄦф槸澶у瀷紼嬪簭欏圭洰寮鍙戝繀欏葷殑銆備絾鏄湪“鍥涗漢甯?#8221;鐨勮璁℃ā寮忔榪頒腑鎻愬埌浜?/span>23縐嶆爣鍑嗚璁℃ā寮忥紝涓嶄絾闅句互璁頒綇錛岃屼笖鏈変簺璁捐妯″紡鏇村鐨勯傜敤浜庡簲鐢ㄧ▼搴忓紑鍙戯紝瀵規(guī)父鎴忛」鐩紩鎿庤璁″茍娌℃湁寰堝鐨勫埄鐢ㄤ環(huán)鍊箋傛牴鎹粡楠岋紝綺炬寫緇嗛夊悗錛岀瑑蹇楀湪榪欓噷璁板綍涓浜涜嚜璁や負(fù)鏈夊埄鐢ㄤ環(huán)鍊肩殑璁捐妯″紡錛屼互渚夸箣鍚庤嚜宸辮璁℃椂浣跨敤銆?/span>
瑙傚療鑰呯殑璁捐鎰忓浘鍜屼綔鐢ㄦ槸錛?/span> 瀹冨皢瀵硅薄涓庡璞′箣闂村垱寤轟竴縐嶄緷璧栧叧緋伙紝褰撳叾涓竴涓璞″彂鐢熷彉鍖栨椂錛屽畠浼?xì)灏啒q欎釜鍙樺寲閫氱煡緇欎笌鍏跺垱寤哄叧緋葷殑瀵硅薄涓紝瀹炵幇鑷姩鍖栫殑閫氱煡鏇存柊銆?/span>
娓告垙涓瀵熻呯殑閫傜敤鐜鏈?/span>錛?/span>
1錛?/span>UI鎺т歡綆$悊綾匯傚綋鎴戜滑鐨?/span>GUI鎺т歡閮戒嬌鐢ㄨ瀵熻呮ā寮忓悗錛岄偅涔堢敤鎴風(fēng)殑浠諱綍鐣岄潰鐩稿叧鎿嶄綔鍜屾敼鍙橀兘灝嗕細(xì)閫氱煡鍏跺叧鑱斿璞?/span>-----鎴戜滑鐨?/span>UI浜嬩歡鏈恒?/span>
2錛氬姩鐢葷鐞嗗櫒銆傚緢澶氭椂鍊欐垜浠湪鎾斁涓涓姩鐢繪、鐨勬椂鍊欙紝瀵瑰叾Frame鏈夊緢澶у叴瓚o紝姝ゆ椂鎴戜滑璁劇疆涓涓?/span>FrameLister瀵硅薄瀵瑰叾榪涜鐩戣錛岃幏寰楁垜浠叧蹇?jī)鐨勪簨錃g榪涜澶勭悊鏄繀欏葷殑銆?/span>
瑙傚療鑰呬吉浠g爜錛?/span>
//-------------------------------------------------------------------------------------------------------
// 琚瀵熷璞$洰鏍囩被
Class Subject
{
// 瀵規(guī)湰鐩爣緇戝畾涓涓瀵熻?/span> Attach( Observer );
// 瑙i櫎涓涓瀵熻呯殑緇戝畾 DeleteAttach( Observer );
// 鏈洰鏍囧彂鐢熸敼鍙樹簡(jiǎn)錛岄氱煡鎵鏈夌殑瑙傚療鑰咃紝浣嗘病鏈変紶閫掓敼鍔ㄤ簡(jiǎn)浠涔?/span>
Notity()
{
For ( …閬嶅巻鏁翠釜ObserverList …)
{ pObserver ->Update(); }
}
// 瀵硅瀵熻呮毚闇茬殑鎺ュ彛錛岃瑙傚療鑰呭彲鑾峰緱鏈被鏈変粈涔堝彉鍔?/span>GetState();
}
//-------------------------------------------------------------------------------------------------------
// 瑙傚療鑰?/span>/鐩戝惉鑰呯被
Class Observer
{
// 鏆撮湶緇欏璞$洰鏍囩被鐨勫嚱鏁幫紝褰撶洃鍚殑瀵硅薄鍙戠敓浜?jiǎn)鍙樺姩锛屽垯瀹冧細(xì)璋冪敤鏈嚱鏁伴氱煡瑙傚療鑰?/span>
Void Update ()
{
pSubject ->GetState(); // 鑾峰彇鐩戝惉瀵硅薄鍙戠敓浜?jiǎn)浠涔堝彉鍖?/span>
TODO錛?/span>DisposeFun(); // 鏍規(guī)嵁鐘舵佷笉鍚岋紝緇欎簣涓嶅悓鐨勫鐞?/span>
}
}
//-------------------------------------------------------------------------------------------------------
闈炵▼搴忚璦鎻忚堪錛?/span>
A鏄?/span>B鐨勫ソ鏈嬪弸錛屽B鐨勮涓洪潪甯稿叧蹇?jī)銆?/span>B瑕佸嚭闂紝姝ゆ椂A緇欎簡(jiǎn)B涓涓鎶ュ櫒錛屽憡璇?/span>B璇達(dá)細(xì)“濡傛灉浣犳湁浜嬶紝绔嬪埢鎸夎繖涓鎶ュ櫒鍛婅瘔鎴戙?#8221;銆傜粨鏋?/span>B鍦ㄥ闈㈤亣涓婁簡(jiǎn)楹葷儲(chǔ)錛屾寜涓嬭鎶ュ櫒錛?/span>Update()錛夛紝B灝辯煡閬?/span>A鍑轟簡(jiǎn)浜嬶紝浜庢槸灝辮皟鏌ヤ竴涓?/span>B鍒板簳閬囧埌浜?jiǎn)浠涔堥夯鐑?/span>(GetState())錛屽綋鐭ラ亾B鍘熸潵鏄洜涓鴻浜烘墦浜?jiǎn)锛屼簬鏄珛鍒粯q涜澶勭悊DisposeFun()錛屾淳浜?jiǎn)涓緹ゆ墜涓嬪府B鎵撴灦銆?/span>
褰撶劧鍏沖績(jī)A鐨勪漢鍙互涓嶆涓涓紝C錛?/span>D鍙兘涔熷A寰堝叧蹇?jī)锛屼簬鏄?/span>A榪欓噷淇濆瓨涓涓墍鏈夊叧蹇?jī)瀹冪殑錆h鐨勯摼琛紝褰撻亣鍒伴夯鐑?chǔ)鐨勬椂鍊欙紝杞祦緇欐瘡涓漢涓浠介氱煡銆?/span>
鍗曚歡妯″紡鐨勮璁℃剰鍥懼拰浣滅敤鏄?/span>錛?/span> 淇濊瘉涓涓被浠呮湁涓涓疄渚嬶紝騫朵笖錛屼粎鎻愪緵涓涓闂畠鐨勫叏灞璁塊棶鐐廣?/span>
娓告垙涓傜敤浜庡崟浠舵ā寮忕殑鏈?/span>錛?/span>
1錛氭墍鏈夌殑Manger銆傚湪澶ч儴鍒嗙殑嫻佽寮曟搸涓兘瀛樺湪鐫瀹冪殑褰卞瓙錛屼緥濡?/span>SoundManager, ParticeManager絳夈?/span>
2錛氬ぇ閮ㄥ垎鐨勫伐鍘傚熀綾匯傝繖涓鐐瑰湪澶ч儴鍒嗗紩鎿庝腑榪樻槸瑙佷笉鍒扮殑錛屽疄闄呬笂錛屾垜浠殑鐖剁被宸ュ巶閲囩敤鍞竴瀹炰緥鐨勮瘽錛屾垜浠瓙綾昏繘琛屾墿灞曟椂涔熶細(xì)鏈夊緢澶ф柟渚褲?/span>
鍗曚歡妯″紡浼唬鐮?/span>錛?/span>
//-------------------------------------------------------------------------------------------------------
Class Singleton
{
Static MySingleton; // 鍗曚歡瀵硅薄錛屽叏灞鍞竴鐨勩?/span>
Static Instance(){ return MySingleton;} // 瀵瑰鏆撮湶鎺ュ彛
}
//-------------------------------------------------------------------------------------------------------
榪唬鍣ㄨ璁℃剰鍥懼拰浣滅敤鏄?/span>錛?/span> 鎻愪緵涓涓柟娉曪紝瀵逛竴涓粍鍚堣仛鍚堝璞″唴鍚勪釜鍏冪礌榪涜璁塊棶錛屽悓鏃跺張涓嶆毚闇茶瀵硅薄綾葷殑鍐呴儴琛ㄧず銆?/span>
娓告垙涓傜敤浜庤凱浠e櫒妯″紡鐨勬湁錛?/span> 鍥犱負(fù)STL鐨勬祦琛岋紝榪欎釜璁捐宸茬粡騫夸負(fù)浜虹煡浜?jiǎn)锛屾垜浠鋼Q浣曞艦寮忕殑璧勬簮閫氫竴綆$悊鏃訛紝涓嶅厤浼?xì)灏嗗叾鑱氬悎钃v鏉ワ紝鎴栬?/span>List錛屾垨鑰?/span>Vector錛屾垜浠兘闇瑕佷竴涓鍏惰繘琛岃闂殑宸ュ叿錛岃凱浠e櫒鏃犵枒鏄竴涓埄鍣ㄣ?/span>
榪唬鍣ㄤ吉浠g爜錛?/span>
//-------------------------------------------------------------------------------------------------------
// 榪唬鍣ㄥ熀綾?/span>
Class Iterator
{
Virtual First();
Virtual Next();
Virtual End();
Virtual CurrentItem(); // 榪斿洖褰撳墠Item淇℃伅
}
//-------------------------------------------------------------------------------------------------------
// 鑱氬悎浣撶殑鍩虹被
Class ItemAggregate
{
Virtual CreateIterator(); // 鍒涘緩璁塊棶鑷韓鐨勪竴涓凱浠e櫒
}
//-------------------------------------------------------------------------------------------------------
// 瀹炰緥鍖栫殑欏圭洰鑱氬悎浣?/span>
Class InstanceItemAggregate : public ItemAggregate
{
CreateIterator(){ return new InstanceIterator(this); }
}
//-------------------------------------------------------------------------------------------------------
璁塊棶鑰呰璁℃剰鍥懼拰浣滅敤鏄?/span>錛?/span> 褰撴垜浠笇鏈涘涓涓粨鏋勫璞℃坊鍔犱竴涓姛鑳芥椂錛屾垜浠兘澶熷湪涓嶅獎(jiǎng)鍝嶇粨鏋勭殑鍓嶆彁涓嬶紝瀹氫箟涓涓柊鐨勫鍏跺厓绱犵殑鎿嶄綔銆傦紙瀹為檯涓婏紝鎴戜滑鍙槸鎶婂璇ュ厓绱犵殑鎿嶄綔鍒嗗壊緇欐瘡涓厓绱犺嚜韜被涓疄鐜頒簡(jiǎn)鑰屽凡錛?/span>
娓告垙涓傜敤浜庤闂呮ā寮忕殑鏈?/span>錛?/span> 浠諱綍涓涓瘮杈冮潤(rùn)鎬佺殑澶嶆潅緇撴瀯綾諱腑閮介傚悎閲囩敤涓浠借闂呫傝繖閲岀殑“姣旇緝闈?rùn)鎬佺殑澶嶆潅緇撴瀯綾?#8221;鎰忔濇槸錛岃緇撴瀯綾諱腑鍏冪礌綣佸涓旂綾誨鏉傦紝涓斿搴旂殑鎿嶄綔杈冨錛屼絾綾誨緢灝戣繘琛屽彉鍖栵紝鎴戜滑灝辮兘澶熷皢錛屽榪欎釜緇撴瀯綾誨厓绱犵殑鎿嶄綔鐙珛鍑烘潵錛岄伩鍏嶆薄鏌撹繖浜涘厓绱犲璞°?/span>
1錛氫緥濡傚満鏅鐞嗗櫒涓鐞嗙殑鍦烘櫙鑺傜偣錛屾槸闈炲父綣佸鐨勶紝鑰屼笖縐嶇被涓嶄竴錛屼緥濡傛湁Ogre涓殑Root, Irrchit涓氨鎶婃憚璞℃満錛岀伅鍏夛紝Mesh錛屽叕鍛婄増錛屽0闊抽兘鍋氫負(fù)涓縐嶅満鏅妭鐐癸紝姣忎釜鑺傜偣綾誨瀷鏄笉鍚岀殑錛岃櫧鐒跺ぇ瀹墮兘鏈夊叡閫氱殑Paint(),Hide()絳夋柟娉曪紝浣嗘柟娉曠殑瀹炵幇褰㈠紡鏄笉鍚岀殑錛屽綋鎴戜滑澶栫晫璋冪敤鏃墮渶瑕佺粺涓鎺ュ彛錛岄偅涔堟垜浠緢鍙兘闇瑕侀渶瑕佽繖鏍風(fēng)殑浠g爜
Hide( Object )
{ if (Object == Mesh) HideMesh(); if (Object == Light) HideLight(); … }
姝ゆ椂鑻ユ垜浠渶瑕佸鍔犱竴涓?/span>Object鏂扮殑綾誨瀷瀵硅薄錛屾垜浠氨涓嶅緱涓嶅璇ュ嚱鏁拌繘琛屼慨姝c傝屾垜浠彲浠ヨ繖鏍峰仛錛岃Mesh,Light浠栦滑閮界戶鎵夸簬Object,浠栦滑閮藉疄鐜頒竴涓嚱鏁?/span>Hide(),閭d箞灝卞彉鎴?/span>
Mesh::Hide( Visitor ) { Visitor.Hide (Mesh); }
Light::Hide(Visitor ){ Visitor.Hide (Light); }
鎴戜滑鍦ㄨ皟鐢ㄦ椂鍙渶瑕?/span>Object.Hide(Visitor){ return Visitor.Hide(Object); }
榪欐牱鍋氱殑濂藉錛屾垜浠厤鍘諱簡(jiǎn)瀵歸噸瑕佸嚱鏁扮殑淇錛?/span>Object.Hide(Visitor){}鍑芥暟鎴戜滑鍙互姘鎬箙涓嶅彉錛屼絾鏄?strong>鍧忓涔熸槸寰堟槑鏄劇殑錛屽洜涓哄皢鏂規(guī)硶浠庡璞¢泦鍚堢粨鏋勪腑鎶界鍑烘潵錛屽氨鎰忓懗鐫鎴戜滑姣忓鍔犱竴涓厓绱狅紝瀹冨繀欏葷戶鎵夸簬涓涓娊璞$殑琚闂呯被錛屽疄鐜板叾鍏ㄩ儴鍑芥暟錛岃繖涓伐浣滈噺寰堝ぇ銆?/span>
鎵浠ワ紝璁塊棶鑰呮槸浠呴傚悎浜庝竴涓杞戒笉鍚屽璞$殑澶у鍣紝浣嗗悓鏃跺張瑕佹眰榪欎釜瀹瑰櫒鐨勫厓绱犺妭鐐逛笉搴斿綋鏈夊ぇ鐨勫彉鍔ㄦ椂鎵嶄嬌鐢?/span>銆傚彟澶栵紝搴熻瘽涓鍙ワ紝璁塊棶鑰呯牬鍧忎簡(jiǎn)OO鎬濇兂鐨勩?/span>
璁塊棶鑰呬吉浠g爜錛?/span>
//-------------------------------------------------------------------------------------------------------
// 璁塊棶鑰呭熀綾?/span>
Class Visitor
{
Virtual VisitElement( A ){ … }; // 璁塊棶鐨勬瘡涓璞¢兘瑕佸啓榪欐牱涓涓柟娉?/span>
Virtual VisitElement( B ){ … };
}
// 璁塊棶鑰呭疄渚?/span>A
Class VisitorA
{
VisitElement( A ){ … }; // 瀹為檯鐨勫鐞嗗嚱鏁?/span>
VisitElement( B ){ … }; // 瀹為檯鐨勫鐞嗗嚱鏁?/span>
}
// 璁塊棶鑰呭疄渚?/span>B
Class VisitorB
{
VisitElement( A ){ … }; // 瀹為檯鐨勫鐞嗗嚱鏁?/span>
VisitElement( B ){ … }; // 瀹為檯鐨勫鐞嗗嚱鏁?/span>
}
// 琚闂呭熀綾?/span>
Class Element
{
Virtual Accept( Visitor ); // 鎺ュ彈璁塊棶鑰?/span>
}
// 琚闂呭疄渚?/span>A
Class ElementA
{
Accecpt( Visitor v ){ v-> VisitElement(this); }; // 璋冪敤娉ㄥ唽鍒拌闂呬腑鐨勫鐞嗗嚱鏁?/span>
}
// 琚闂呭疄渚?/span>B
Class ElementB
{
Accecpt( Visitor v ){ v-> VisitElement(this); }; // 璋冪敤娉ㄥ唽鍒拌闂呬腑鐨勫鐞嗗嚱鏁?/span>
}
//-------------------------------------------------------------------------------------------------------
澶栬妯″紡鐨勮璁℃剰鍥懼拰浣滅敤鏄?/span>錛?/span> 灝嗙敤鎴鋒帴瑙︾殑琛ㄥ眰鍜屽唴閮ㄥ瓙闆嗙殑瀹炵幇鍒嗙寮鍙戙傚疄闄呬笂錛岃繖涓ā寮忔槸涓焊鑰佽檸錛屼箣鍚庢垜浠湅浼唬鐮佺珛鍒誨氨浼?xì)鍙戠帋图寴q欎釜妯″紡瀹炲湪鐢ㄧ殑澶綣佷簡(jiǎn)銆?/span>
娓告垙涓渶瑕佷嬌鐢ㄥ瑙傛ā寮忕殑鍦版柟鏄?/span>錛?/span> 榪欎釜闈炲父澶氫簡(jiǎn)錛屼婦鍑犱釜姣旇緝閲嶈鐨勩?/span>
1錛氬疄鐜板鉤鍙版棤鍏蟲с傝法騫沖彴璺ㄥ簱鐨勫嚱鏁拌皟鐢ㄣ?/span>
2錛氬悓涓涓帴鍙e幓璇誨彇涓嶅悓鐨勮祫婧愩?/span>
3錛氱‖浠惰嚜鍔ㄨ瘑鍒鐞嗙郴緇熴?/span>
澶栬妯″紡浼唬鐮?/span>
//-------------------------------------------------------------------------------------------------------
// 鐢ㄦ埛浣跨敤鐨勬帴鍙g被
Class Interface
{
// 鏆撮湶鍑烘潵鐨勫嚱鏁版帴鍙e嚱鏁幫紝鏈変笖浠呮湁涓涓紝浣嗗唴閮ㄥ疄鐜版槸璋冪敤浜?jiǎn)涓や釜绫?/span>
Void InterfaceFun()
{
// 鏍規(guī)嵁鏌愮鏉′歡錛屽簳灞傝嚜涓葷殑閫夋嫨浣跨敤A鎴?/span>B鐨勬柟娉曘傜敤鎴鋒棤欏誨叧蹇?jī)搴曞眰瀹炵?/span>
If ( XXX )
{
ActualA->Fun();
}
Else
{
ActualB->Fun();
}
};
}
// 瀹為檯鐨勫疄鐜幫紝涓嶆毚闇茬粰鐢ㄦ埛鐭ラ亾
Class ActualA
{
Void Fun();
}
// 瀹為檯鐨勫疄鐜幫紝涓嶆毚闇茬粰鐢ㄦ埛鐭ラ亾
Class ActualB
{
Void Fun();
}
鎬庝箞鏍鳳紝綰歌佽檸鍚э紝鐪嬭搗鏉ュ緢楂樻繁鎽告祴鐨勫懡鍚嶈屽凡銆?/font>
//-------------------------------------------------------------------------------------------------------
鎶借薄宸ュ巶鐨勮璁℃剰鍥懼拰浣滅敤鏄?/span>錛?/span> 灝佽鍑轟竴涓帴鍙o紝榪欎釜鎺ュ彛璐熻矗鍒涘緩涓緋誨垪浜掔浉鍏寵仈鐨勫璞★紝浣嗙敤鎴峰湪浣跨敤鎺ュ彛鏃朵笉闇瑕佹寚瀹氬璞℃墍鍦ㄧ殑鍏蜂綋鐨勭被銆備粠涓枃鍛藉悕涔熷緢瀹規(guī)槗鏄庣櫧瀹冩槸榪涜鎵歸噺鐢熶駭鐨勪竴涓敓浜у伐鍘傜殑浣滅敤銆?/span>
娓告垙涓嬌鐢ㄦ娊璞″伐鍘傜殑鍦版柟鏈?/span>錛?/span> 鍩烘湰涓婁換浣曟湁鎵歸噺鐨勫悓綾誨艦寮忕殑瀛愪歡鍦版柟灝變細(xì)鏈夊伐鍘傜殑瀛樺湪銆傦紙琛ュ厖涓鍙ワ細(xì)涓嬮潰浠g爜涓殑ConcreteFactory1瀹炰緥宸ュ巶灝辨槸宸ュ巶錛岃屾娊璞″伐鍘備粎浠呮槸宸ュ巶鐨勪竴涓娊璞″眰鑰屽凡銆?/span>錛?/span>
1錛氫緥濡傦紝鍦ㄩ煶棰戞柟闈紝涓涓煶棰戠殑鎶借薄宸ュ巶媧劇敓鍑轟笉鍚岀殑宸ュ巶錛屾湁闊充箰宸ュ巶錛岄煶鏁堝伐鍘傘傞煶鏁堝伐鍘備腑鍙堟湁涓涓垱寤?/span>3D闊蟲晥鑺傜偣鐨勬柟娉曪紝涓涓垱寤烘櫘閫氶煶鏁堣妭鐐圭殑鏂規(guī)硶銆傛渶緇堢敤鎴峰彧闇瑕?/span>SoundFactory->Create3DNode( pFileName );灝卞彲浠ュ垱寤轟竴涓妭鐐逛簡(jiǎn)銆?/span>
2錛氬満鏅璞°?/span>
3錛氭覆鏌撳璞°?/span>
4錛氱瓑絳?#8230;…
宸ュ巶涓庡崟浠訛紝綆$悊鍣?/span>Manager鍏崇郴涓瀹氭槸闈炲父绱у瘑鐨勩?/span>
鎶借薄宸ュ巶浼唬鐮?/span>錛?/span>
//-------------------------------------------------------------------------------------------------------
class AbstractProductA {}; // 鎶借薄鐨勪駭鍝?/span>A鍩虹被
銆銆class AbstractProductB {}; //鎶借薄鐨勪駭鍝?/span>B鍩虹被
// 鎶借薄宸ュ巶鍩虹被
銆銆class AbstractFactory
銆銆{
銆銆public:
銆銆銆virtual AbstractProductA* CreateProductA() = 0 ;// 鍒涘緩ProductA
銆銆銆virtual AbstractProductB* CreateProductB() = 0 ;// 鍒涘緩ProductB
} ;
銆銆class ProductA1 : public AbstractProductA {}; // 浜у搧A鐨勫疄渚?/span>1
銆銆class ProductA2 : public AbstractProductA {}; // 浜у搧A鐨勫疄渚?/span>2
銆銆class ProductB1 : public AbstractProductB {}; // 浜у搧B鐨勫疄渚?/span>1
銆銆class ProductB2 : public AbstractProductB {}; // 浜у搧B鐨勫疄渚?/span>2
// 瀹炰緥宸ュ巶1
class ConcreteFactory1 : public AbstractFactory
銆銆{
銆銆銆銆virtual AbstractProductA* CreateProductA() { return new ProductA1() ; }
銆銆銆銆virtual AbstractProductB* CreateProductB() { return new ProductB1() ; }
銆銆銆 static ConcreteFactory1* Instance() { } 銆銆 // 瀹炰緥宸ュ巶灝介噺浣跨敤鍗曚歡妯″紡
銆銆} ;
// 瀹炰緥宸ュ巶2
class ConcreteFactory2 : public AbstractFactory
銆銆{
銆銆銆銆virtual AbstractProductA* CreateProductA() { return new ProductA2() ; }
銆銆銆銆virtual AbstractProductB* CreateProductB() { return new ProductB2() ; }
銆銆銆銆static ConcreteFactory2* Instance() {} // 瀹炰緥宸ュ巶灝介噺浣跨敤鍗曚歡妯″紡
銆銆} ;
}
//-------------------------------------------------------------------------------------------------------
瀹㈡埛绔唬鐮?/span>錛?/span>
Void main()
{
銆銆AbstractFactory *pFactory1 = ConcreteFactory1::Instance() ;
銆銆AbstractProductA *pProductA1 = pFactory1->CreateProductA() ;
銆銆AbstractProductB *pProductB1 = pFactory1->CreateProductB() ;
銆銆AbstractFactory *pFactory2 = ConcreteFactory2::Instance() ;
銆銆AbstractProductA *pProductA2 = pFactory2->CreateProductA() ;
銆銆AbstractProductB *pProductB2 = pFactory2->CreateProductB() ;
}
//-------------------------------------------------------------------------------------------------------