锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
涓涓父鎴忓紩鎿庡師鍨嬪熀鏈泲鐢熶簡錛屾垜浠懡鍚嶅畠涓?RedLight錛屽畠鍩烘湰瀹炵幇浜?br>
(0) Win32紼嬪簭娓叉煋妗嗘灦
(1) UI鐨勫熀鏈秷鎭氦浜掓祦紼嬶紝XML紿椾綋閰嶇疆綆$悊錛孶I鐨偆閰嶇疆綆$悊錛屽熀鏈殑UI鎺т歡搴擄紝澶氬垎杈╃巼鏃犵紳UI鎷煎浘
(2) 瀹ゅ鍦烘櫙綆$悊
(3) 鎽勭浉鏈鴻礬寰勬憚鍍?br>(4) 3D Max8妯″瀷鍙婇楠煎姩鐢誨鍑烘彃浠?br>(5) 妯″瀷娓叉煋, 鍏抽敭甯у姩鐢誨強楠ㄩ鍔ㄧ敾鎺у埗
(6) 鍩烘湰鐨勬按闈㈠弽灝勬晥鏋?br>(7) 綆鍗曠殑闈㈢矑瀛愮郴緇?br>(8) 澹伴煶鎺у埗鎺ュ彛
榪欐槸涓涓崟鏈烘父鎴忓紩鎿庣殑鍘熷瀷錛屽姛鑳芥湁闄愶紝浣嗗畠鎬葷畻涓嶈頸浣垮懡瀹屾垚浜嗕竴涓」鐩簡錛屼互鍚庡啀鎵╁睍浣垮畠鏃ョ泭寮哄ぇ鍚э紒
]]>
]]>
(涓)銆佹浜ゆ姇褰辨椂錛歄penGL浠ュ睆騫曞乏涓婅涓?0,0), 鑰孌3D鍗翠互灞忓箷涓績涓?0,0)
(浜?銆丱penGL浣跨敤鍙蟲墜鍧愭爣緋伙紝 鑰孌3D浣跨敤宸︽墜鍧愭爣緋?br>(涓?銆丱penGL浣跨敤鏃嬭漿鎿嶄綔絳夎漿鍏ョ殑瑙掑害鍙傛暟鏄?瑙掑害, 鑰孌3D鏄?寮у害錛屾墍浠ユ敞鎰忚PI * Angle / 180
涓嬮潰鎴戞妸鍏蜂綋鍦癆PI瀵圭収鍏崇郴鍒楀嚭鏉?涓嶆槸寰堝叏錛屼互鍚庢坊鍔犱腑.......)
1. 鍧愭爣鍙樻崲
pos = D3DXVECTOR3(0,2,-1.5);
at = D3DXVECTOR3(0,0,0);
up = D3DXVECTOR3(0,1,0);
D3DXMatrixLookAtLH(&view,&pos,&at,&up);
pd3dDevice->SetTransform(D3DTS_VIEW,&view);
2. 緇樺埗
pd3dDevice->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
DrawPrimitive()
DrawIndexedPrimitive()
DrawPrimitiveUP()
DrawIndexedPrimitiveUP()
3. 棰滆壊
4. 鐗囨嫻嬭瘯
(1) 娣卞害嫻嬭瘯
g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //glEnable(GL_DEPTH_TEST);
g_pDevice->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESSEQUAL); //glDepthFunc(GL_LEQUAL);
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); //glEnable(GL_CULL_FACE);
(2) Alpha嫻嬭瘯
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE); //glEnable(GL_ALPHA_TEST);
g_pDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER); //glAlphaFunc(GL_GREATER, 0.1f);
g_pDevice->SetRenderState(D3DRS_ALPHAREF, 0.1 * 255); //鍙栧艱寖鍥?0 ~ 255
(3) 鍓嫻嬭瘯 (騫抽潰鍓垏)
//--------------------------------------------------------------------------------------------------------
// Enable clip plane for reflection map
CMatrix44f pWorldViewProjIT=m_pWorldViewProj;
//pWorldViewProjIT.Transpose();
pWorldViewProjIT.Invert();
// Transform plane to clip-space
float pClipSpacePlane[4];
float pClipPlane[]= { 0, 0, 1, 0};
// Check if camera is below water surface, if so invert clip plane
CVector3f pEye=(CVector3f)m_pCamera.GetPosition();
if(-pEye.m_fZ<0.0)
{
pClipPlane[2]=-pClipPlane[2];
}
MatrixTransformPlane(pClipSpacePlane, pClipPlane, pWorldViewProjIT);
// enable clip plane now
g_pDevice->SetClipPlane(0, pClipSpacePlane);
g_pDevice->SetRenderState(D3DRS_CLIPPLANEENABLE, 1);
(4) 妯℃澘嫻嬭瘯
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_STENCILENABLE, TRUE);
g_pDevice->SetRenderState(D3DRS_STENCILFUNC, 3DCMP_ALWAYS);
g_pDevice->SetRenderState(D3DRS_STENCILREF, 0x1); //鍙栧艱寖鍥?0 ~ 255
Device->SetRenderState(D3DRS_STENCILPASS, D3DSTENCILOP_KEEP);
5. 綰圭悊鎿嶄綔
g_pDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP);
g_pDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP);
6. 緙撳啿鍖烘搷浣?br>
(1) 棰滆壊緙撳啿
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_ALPHA);
g_pDevice->SetRenderState(D3DRS_COLORWRITEENABLE, 0x000000F);
(2) 娣卞害緙撳啿
//--------------------------------------------------------------------------------------------------------
g_pDevice->SetRenderState(D3DRS_ZENABLE, TRUE); //glEnable(GL_DEPTH_TEST);
g_pDevice->SetRenderState(D3DRS_ZWRITEENABLE, TRUE); //glDepthMask(GL_TRUE);
(3) 妯℃澘緙撳啿
//--------------------------------------------------------------------------------------------------------
(4) 娓叉煋鍒扮汗鐞?br> //--------------------------------------------------------------------------------------------------------
// Render targets
IDirect3DSurface9 *m_plD3DBackbufferSurf,
*m_plD3DDepthStencilSurfAA,
*m_plD3DDepthStencilSurf;
CRenderTarget *m_pRTRefraction, *m_pRTReflection; //(鑷畾涔夌汗鐞嗙被)
//-----------------------------------------------------------------------------------
// Get backbuffer
g_pDevice->GetRenderTarget(0, &m_plD3DBackbufferSurf);
// Get depthstencil
g_pDevice->GetDepthStencilSurface(&m_plD3DDepthStencilSurfAA);
// Restore previous states
g_pDevice->SetRenderTarget(0, m_plD3DBackbufferSurf);
g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurfAA);
// (1)鎶樺皠鍥?-------------------------------------------------------------------------
//涓嬮潰鐨勮鍙ヨ皟鐢ㄤ簡 g_pDevice->CreateRenderTarget(iWidth, iHeight, (D3DFORMAT) iFormat, (D3DMULTISAMPLE_TYPE)iAASamples, 0, 0, &m_plD3Surf, 0));
if(FAILED(m_pRTRefraction->Create(m_fWidth>>1, m_fHeight>>1, D3DFMT_A8R8G8B8)))
{
return APP_ERR_INITFAIL;
}
// Create depthstencil withouth multisampling
g_pDevice->CreateDepthStencilSurface(m_fWidth, m_fHeight, D3DFMT_D24X8, (D3DMULTISAMPLE_TYPE)0, 0, 0, &m_plD3DDepthStencilSurf, 0);
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
g_pDevice->StretchRect(m_plD3DBackbufferSurf, 0, m_pRTRefraction->GetSurface(), 0, D3DTEXF_NONE);
// (2)鍙嶅皠鍥?----------------------------------------------------------------------------------
m_pRTReflection=new CRenderTarget;
if(FAILED(m_pRTReflection->Create(m_fWidth>>2, m_fHeight>>2, D3DFMT_A8R8G8B8)))
{
return APP_ERR_INITFAIL;
}
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
//-----------------------------------------------------------------------------------
g_pDevice->SetRenderTarget(0, m_pRTReflection->GetSurface());
g_pDevice->SetDepthStencilSurface(m_plD3DDepthStencilSurf);
g_pDevice->Clear(0, 0, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255, 0, 0, 128), 1.0f, 0);
SetViewport(m_pRTReflection->GetWidth(), m_pRTReflection->GetHeight());
//-----------------------------------------------------------------------------------
D3DXSaveTextureToFile("imageTex.jpg",D3DXIFF_JPG,(IDirect3DTexture9*)m_pWavesBump->GetTexture(),NULL);
7. 娣峰悎鎿嶄綔
g_pDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE); //glDisable(GL_BLEND);
g_pDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g_pDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
8. 鐏厜涓庢潗璐?br> g_pDevice->SetRenderState(D3DRS_LIGHTING, FALSE); //glDisable(GL_LIGHTING);
D3DMATERIAL9 mtrl;
mtrl.Ambient = a;
mtrl.Diffuse = d;
mtrl.Specular = s;
mtrl.Emissive = e;
mtrl.Power = p;
Device->SetMaterial(&mtrl); //鍦ㄨ緗汗鐞嗗墠璁懼畾
//璁劇疆褰撳墠浣跨敤鐨勭汗鐞?br>
//Direct3D 9.0 SDK 寮鍙戝弬鑰僁irect3D 9.0 SDK 鏂囨。 (涓枃鐗?
璇嶆眹琛?
DirectX 8 鏁欑▼
浣犱篃鍙互鎶?COM 瀵硅薄灝辨兂璞℃垚涓濂椾負鏌愪釜涓婚鑰岃璁$殑涓鏁村搴撳嚱鏁般侱X 灝辨彁渚涗簡涓濂楀畬鏁寸殑璁捐3D娓告垙鐨勫簱銆?
http://baike.baidu.com/view/1169027.htm
浣跨敤DirectX鐨勪笉鍚岀粍浠訛紝浣犻渶瑕侀摼鎺ヤ笉鍚岀殑闈欐佸簱銆備緥濡備綘瑕佷嬌鐢―irectDraw緇勪歡錛屼綘灝遍渶瑕乨draw.lib銆?
瀵逛簬DirectDraw錛岃繖涓ご鏂囦歡鏄痙draw.h銆?/com緙栫▼
D3D.H
http://wowe1314.blog.163.com/blog/static/2358876200751191213583/
鍦―irect3D緙栫▼涓紝鎴戜滑瑕佸仛鐨勫伐浣滃熀鏈笂鍙互褰掔撼涓猴細
璋冪敤閫傚綋鐨勫嚱鏁拌幏鍙栨帴鍙f寚閽堬紱
璋冪敤鎺ュ彛鐨勬柟娉曪紙鎴愬憳鍑芥暟錛夋潵瀹屾垚鎵闇鍔熻兘錛?
鐢ㄥ畬鎺ュ彛鍚庯紝璋冪敤Release鏂規硶榪涜“閲婃斁”錛屾敞鎰忛噴鏀鵑『搴忓簲璇ュ拰鑾峰彇瀹冧滑鐨勯『搴忕浉鍙嶃?
http://www.lihuasoft.net/article/show.php?id=2928
Microsoft_DirectX_9.0c閲岀殑 9涓狣irectX鐨凞LL
DX9鍜孌X10鍦ㄦ覆鏌撴祦姘寸嚎涓婇兘鏄湁澶╁¥涔嬪埆鐨勶紝濂藉湪DX楂樼増鏈紑鍙戝寘榪愯搴撲腑鍖呭惈浜嗗浣庣増鏈紑鍙戝寘榪愯搴撶殑瀹炵幇錛屾墍浠ョ敤DX8寮鍙戠殑紼嬪簭錛孌X9榪愯搴撲篃鑳藉寰堝ソ鐨勬敮鎸侊紝鍦ㄥ畨瑁呮湁D9榪愯搴撶殑緋葷粺涓婅窇DX8寮鍙戠殑紼嬪簭涓嶉渶瑕佸啀瀹夎DX8榪愯搴擄紝浣嗘槸榪欎釜鍏煎鎬ф敮鎸佸湪鏈榪戣寰蔣閫愭笎鏀懼純錛屾湁鏃跺橠X9鐨勪笉鍚屾洿鏂扮増鏈仛鐨勭▼搴忎篃涓嶈兘鍚戜笅鍏煎錛屾瘮濡侱X9FEB2007SDK,鍚孌X9AUG2006SDK鍦╯hader緙栬瘧瑙勫垯涓婁篃鏄笉鍚岀殑錛?007鏀懼純浜哣S2.0鍜孭S2.0浠ヤ笅鐗堟湰shader鐨勬敮鎸侊紝鍚屾椂瀵逛簬HLSL涓?include鐩稿璺緞寮曠敤鐨勯粯璁ゆ牴鐩綍涔熸槸鏈夊尯鍒殑.openGL鐨剆hader鎵╁睍涓嶅悓鐨勫巶鍟嗘湁涓嶅悓鐨勬墿灞曞紑鍙戝寘錛屼絾鏄繖縐嶆儏鍐甸殢鐫GLSL鍜宱penGL2.0鐨勫嚭鐜版湁鎵鏀硅.鍚屾椂OpenGL鏄法騫沖彴鐨勮孌X涓嶆槸錛岃繖鎰忓懗鐫鐢∣penGL鍜孏NU C++瑙勫垯寮鍙戠殑紼嬪簭鍙互鍚屾椂鍦↙inux,unix鍜屽畨瑁呮湁GNU鐜鐨刉indows涓婂悓鏃惰繍琛屻備粠鏁堢巼涓婃潵鐪嬶紝DX鐢變簬鏁版嵁鏃舵壒閲忓啓鍏ユ樉瀛樼殑錛屽悓OpenGL鐨勫崟鏉″嚱鏁板啓鍏ユ潵璁睤X鏁堢巼涓婅楂樹竴浜涳紝涓嶈繃榪戞潵OpenGL涔熸敮鎸佷簡鎵瑰啓鍏ワ紝鍙槸鏀寔鎵瑰啓鍏ョ殑OpenGL鏀懼純浜唎penGL涓鎯殑浼樺娍涔熷氨鏄璦鏋舵瀯涓婄殑綆媧佷嬌寰楀嚱鏁扮殑鏁扮洰鍙樺緱寰堝啑鏉傘傚湪鏁堟灉涓婄湅DX9鍚屾敮鎸丟LSL鎴朇G鎵╁睍鐨刼penGL鍙互瀹炵幇鐩稿悓鐨勬樉紺烘晥鏋溿備絾鏄湁涓鐐逛笉鍚屾槸DXUT鍜孌3DX鍦ㄤ竴浜涘熀紜緇樺埗涓婃瘮glu鍜宱penGL ARB Extend瑕佸樊涓鐐癸紝姣斿緇樺埗铏氱嚎錛孌X娌℃湁濂界殑鍑芥暟鍙互鏄疄鐜拌繖涓鍔熻兘銆備絾鏄疍X鐨勬墿灞曞伐鍏鋒瘮openGL鎵╁睍宸ュ叿鍙堟湁澶氫綑鐨勪紭鍔挎瘮濡傚悜閲忚綆?GUI鎺т歡,mesh浼樺寲鍜屾洸闈㈠睍寮錛孭RT棰勮綆楃瓑絳夊拰鎬ц兘嫻嬭瘯絳夌瓑涓婂張瑕佸己涓鐐廣侱X10鍚孫penGL姣旇緝灝辨劅瑙塷penGL涓嶆槸鍚屼竴涓暟閲忕駭涓婄殑浜у搧錛孌X10鍦ㄦ覆鏌撴祦姘寸嚎鍜屾灦鏋勪笂鍜岃兘澶熷疄鐜扮殑鏁堟灉涓婅姣擠X9鍜宱penGL榪涙鐨勫銆傝鍋氶潰鍚戞湭鏉ョ殑娓告垙浜у搧灝介噺榪樻槸鐢―X10鍚с?
LPDIRECT3D9 D3D涓繪帴鍙?
LPDIRECT3DDEVICE9 D3D紜歡涓繪帴鍙?
LPDZRECT3DVERTXBUFFER9 欏剁偣緙撳啿鍖烘帴鍙?
LPD3DVIEWPORT9 瑙嗗彛鎺ュ彛
LPD3DDISPLAYMODE D3D璁懼鏄劇ず妯″紡鎺ュ彛
LPD3DPRESENT_PARAMETERS 鍒涘緩緇撴瀯鐢ㄦ潵淇濆瓨璁懼鐨勬樉紺烘ā寮忔帴鍙?
LPD3DXVECTOR3 3D鍚戦噺鎺ュ彛
LPDIRECT3DTEXTURE9 綰圭悊鎺ュ彛
ID3DXSprite 綺劇伒鎺ュ彛
g.pvb 鎴愬憳鍑芥暟
g_pD3D 鎴愬憳鍑芥暟
g_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT,&d3ddm) 鑾峰彇鏄劇ず妯″紡
g_pd3dDevice 鎴愬憳鍑芥暟
g_pd3dDevice->SetRenderState錛堬紝BOOL錛?鏄惁寮鍚伅鍏?
g_pd3dDevice->SetTransform( D3DTS_WORLD, &(matWorld * matWorld_x));//灝嗕笂闈㈣綆楀嚭鏉ョ殑鏃嬭漿鐭╅樀錛岃緗負涓栫晫鍙樻崲鐭╅樀
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );鍐欏叆嫻?
g_pd3dDevice->SetFVF() 璁劇疆FVF
g_pd3dDevice->DrawIndexedPrimitive( 鐢誨艦鐘? 0, 0, 鐐逛釜鏁? 0, 涓夎褰釜鏁?); 鐢?
timeGetTime 褰撳墠緋葷粺鐨勬椂闂?
DIRECT3DTXTURE 鏂囩悊鎺ュ彛
BITMAPPEILEHEADER 鏂囦歡澶?
BITMAPINFOHEADER 淇℃伅澶?
fread 璇諱竴涓暟鎹潡
biBitcout 姣忎釜璞$礌鍗犲嚑涓瓧鑺?
bicompression 鏄惁琚帇緙?
fseek 璺籌紝鍋忕Щ鎸囬拡
greatetxture 鍒涘緩涓涓┖鏂囩悊
D3Dcaked_RECT 閿佸畾緇撴瀯浣?
setTexturestagestata 璁劇疆鏂囩悊鎿嶄綔
CONSTD3DMATRIX* 榪涜鍙樻崲鐨勫彉鎹㈢煩闃?
緇撴瀯浣?
D3DPRESENT_PARAMETERS 瀛樺偍D3D璁懼淇℃伅
D3DXMATRIX 淇敼鐭╅樀
鏁扮粍
CUSTOMVERTEX 璁劇疆欏剁偣浣嶇疆棰滆壊淇℃伅
鐭╅樀鍑芥暟
D3DXMATRIX * D3DXMatrixIdentity錛圥Out,pM錛?鍗曚綅鐭╅樀
D3DXMATRIX * D3DXMatrixTranspose錛堜笂錛?nbsp; 鐭╅樀杞疆
D3DXMATRIX * D3DXMatrixInverse錛堜笂涓棿鍔犱釜FLOAT錛?閫嗙煩闃?
D3DXMATRIX * D3DXMatrixTransformation錛堬級
D3DXMATRIX* D3DXMatrixTranslation錛堣緭鍑虹煩闃碉紝X錛孻錛孼錛?騫崇Щ鍙樻崲
D3DXMATRIX * D3DXMatrixScaling錛堜笂錛?緙╂斁鍙樻崲
FLOAT D3DXPlaneDotCoord錛坧p,pv錛?鐐瑰拰騫抽潰涔嬭鐨勫叧緋?
D3DXPLANE * D3DXPlaneFromPointNormal錛圥OUT錛孭POINT錛孭NORMAL錛?鏋勯犲瓙
D3DXPLANE * D3DXPlaneFromPoints(Pout,pv1,pv2,pv3) 閫氳繃鐐規潵鎻忚堪騫抽潰
D3DXPLANE * D3DPlaneNormalize(POUT,PP) 鏍囧噯鍖栦竴涓鉤闈?
D3DXPLANE * D3DXPlaneTransform(POUT,PP,PM) 騫崇Щ騫抽潰
D3DXM
杞崲鍑芥暟
D3DXMATRIX* D3DXMatrixLookAtLH(杈撳嚭鐢ㄤ簬瑙嗗浘杞崲鐨勭煩闃碉紝鎽勮薄鏈虹殑浣嶇疆錛屾憚璞℃満闈㈠悜鐨勪綅緗紝鎽勮薄鏈虹殑姝f柟鍚? 瑙嗗浘杞崲鐨勭煩闃?
D3DXMATRIX* D3DXMatrixOrthoLH(杈撳嚭鐢ㄤ簬姝d氦鎶曞獎鐨勪氦鎹㈢煩闃碉紝鍙栨櫙瀹斤紝鍙栨櫙楂橈紝鍙栨櫙紱繪憚璞℃満鐨勬渶榪戣窛紱伙紝鍙栨櫙紱繪憚璞℃満鐨勬渶榪滆窛紱? 姝d氦鎶曞獎鍙樻崲鐭╅樀
D3DXMATRIX* D3DXMatrixPerspectiveFovLH(杈撳嚭鐢ㄤ簬閫忚鎶曞獎鐨勪氦鎹㈢煩闃碉紝鎽勮薄鏈洪暅澶寸殑澶硅Y錛屽鉤鎴彴浣撶殑綰墊í姣旓紝榪戝鉤鎴潰鐨勮窛紱伙紝榪滃鉤鎴潰鐨勮窛紱? 閫忚鎶曞獎鐨勭煩闃?
Direct3DCreate9(D3D鐗堟湰) 鍒涘緩D3D瀵硅薄
璁懼鍑芥暟
SetTransform(鍙樻崲鐨勭被鍨嬶紝鍙樻崲鐨勫彉鎹㈢煩闃? 璁劇疆宸︽墜鎴栧彸鎵嬪潗鏍?
SetViewport(瑙嗗彛鎸囬拡) 璁劇疆榪滆繎璺濈
GetClientRect(hWnd,*RECT) 鑾峰彇紿楀彛緇樺浘鍖哄煙
memcpy錛堟寚閽堬紝鏁扮粍錛岄暱搴︼級 鎷瘋礉
SetStreamSource(0,G.pvb鎺ュ彛鎸囬拡錛?,闀垮害) 鏁版嵁嫻?
GetAdapterDisplayMode(鎸囧畾鏄劇ず鍗″簭鍒楀彿錛屽瓨鍌ㄦ樉紺烘ā寮忕殑鎸囬拡) 鑾峰彇鏄懼崱鐨勬ā寮?
HRESULT CreateDevice(鏄懼崱搴忓垪鍙鳳紝D3D璁懼綾誨瀷錛屾墍灞炵獥鍙e彞鏌勶紝D3D榪涜3D榪愮畻錛屽瓨鍌―3D璁懼鐩稿叧淇℃伅鎸囬拡錛岃繑鍥濪3D璁懼鍊熷彛鎸囬拡鐨勫湴鍧) 鍒涘緩璁懼鍊熷彛
HRESULT CreateVertexBuffer(欏剁偣緙撳啿鍖哄ぇ灝忥紙瀛楄妭錛夛紝欏剁偣緙撳啿鍖哄睘鎬э紝鐏墊椿欏剁偣鏍煎紡錛岄《鐐圭紦鍐插尯鍐呭瓨浣嶇疆錛岄《鐐圭紦鍐插尯鎸囬拡鍦板潃錛屼繚鐣欏弬鏁伴氬父涓?) 鍒涘緩欏剁偣緙撳啿
HRESULT CreateIndexBuffer(绱㈠紩緙撳啿鍖哄ぇ灝忥紙瀛楄妭錛?欏剁偣緙撳啿鍖哄睘鎬?FMT棰滆壊,欏剁偣緙撳啿鍖哄唴瀛樹綅緗?绱㈠紩緙撳啿鍖烘寚閽堝湴鍧錛屼繚鐣欏弬鏁伴氬父涓?) 鍒涘緩绱㈠紩緙撳啿
HRESULT Lock(鍔犻攣鍐呭瓨璧峰鍦板潃錛屽姞閿佸唴瀛樺ぇ灝忥紝榪斿洖鍐呭瓨鎸囬拡鍦板潃錛屽姞閿佸睘鎬? 鍔犵緝鍐呭瓨
HRESULT UnLock() 瑙i攣
HRESULT SetStreamSource(娓叉煋鏁版嵁嫻佸簭鍒楀彿錛岃繘琛岀粦瀹氳繛鎺ョ殑欏剁偣緙撳啿鍖烘寚閽堬紝榪涜緇戝畾榪炴帴娓叉煋鏁版嵁嫻佺殑璧峰浣嶇疆錛屾覆鏌撴暟鎹祦涓竴涓《鐐規墍鍗犵殑鍐呭瓨澶у皬) 欏剁偣緙撳啿鍖哄拰娓叉煋鏁版嵁嫻佽繛鎺?
HRESULT SetFVF(鐏墊椿欏剁偣鏍煎紡) 璁劇疆欏剁偣鏍煎紡
HRESULT DrawPrimitive(緇樺埗鐨勫浘鍏冪被鍨嬶紝緇樺埗鐨勫紑濮嬮《鐐圭殑绱㈠紩鍊鹼紝緇樺埗鐨勫浘鍏冩暟閲? 鐢誨埌鍚庡悜緙撳啿鍖?
HRESULT DrawPrimitiveup() 鍙互鐩存帴鐢?
HRESULT Preesent(澶嶅埗婧愮殑鐭╁艦鍖哄煙鎸囬拡錛屽鍒剁洰鐨勫湴鐨勭煩褰㈠尯鍩熸寚閽堬紝D3D璁懼紿楀彛鍙ユ焺錛屾渶灝忔洿鏂板尯鍩熸寚閽? 灞忓箷緲昏漿
HRESULT SetIndices(浣跨敤鐨勭儲寮曠紦鍐插尯鎸囬拡) 璁劇疆褰撳墠緇樺埗鐨勭儲寮曟暟緇?
DrawIndexedPrimitive(鍥懼厓綾誨瀷錛岀粯鍒跺埌鐨勭儲寮曠紦鍐插尯鐨勫紑濮嬪湴鍧錛屾渶灝忕殑绱㈠紩鏁扮粍鍏冪礌鐨勫鹼紝欏剁偣鐨勬暟鐩紝寮濮嬬殑绱㈠紩鏁扮粍鍏冪礌鐨勫鹼紝緇樺埗鐨勬暟閲? 鍚孌rawPrimitive()
緇樺埗鍑芥暟
HRESULT DrawPrimitive(鍩烘湰鍥懼厓綾誨瀷錛岃搗濮嬮《鐐癸紝緇樺埗鐨勫浘鍏冪殑鏁伴噺) 鍥懼厓緇樺埗
HRESULT Clear(娓呮鐨勭煩褰㈠尯鍩熸暟閲忥紝娓呴櫎鐨勪婦琛屽尯鍩熸暟緇勬寚閽堬紝娓呮鍝釜緙撳啿鍖猴紝娓呴櫎鍚庨噸緗殑棰滆壊錛屾竻闄ゅ悗閲嶇疆鐨勬繁搴︼紝0-1.0錛岄噸緗殑鎽哥増鍊? 娓呯┖鍥懼艦緇樺埗鍖?
HRESULT BeginScene() 寮濮嬬粯鍒?
HRESULT EndScene() 緇撴潫緇樺埗
綰圭悊鍑芥暟
CreateTexture() 鍒涘緩D3D綰圭悊瀵硅薄
LoadBmpTeture錛堬級 瑁呰澆鏂囩悊鍑芥暟
LoadBmpTexture24Bit (LPDIRECT3DDEVICE9 pDevice,LPCSTR pSrcFile,LPDIRECT3DTEXTURE9* ppTexture) 24浣嶇汗鐞?
D3DXCreateTextureFromFile(D3D璁懼鎸囬拡錛岀汗鐞嗗浘褰㈡枃浠訛紝瀛樺偍D3D鏂囩悊鐨勬寚閽堝湴鍧) 鐩存帴浠庣鐩樿幏鍙栫汗鐞?
D3DXCreateTextureFromFileEx(D3D璁懼鎸囬拡錛岀汗鐞嗗浘褰㈡枃浠訛紝鎸囧畾綰圭悊瀹斤紝楂橈紝鎸囧畾娓愯繘綰圭悊搴忓垪綰ф暟錛岀汗鐞嗕嬌鐢ㄦ柟寮忎竴鑸負0錛屾寚瀹氱汗鐞嗗浘褰㈡牸寮忥紝綰圭悊瀛樻斁鐨勫唴瀛樼被鍨嬩竴鑸綅涓?錛岀汗鐞嗚繃婊ゆ柟寮忥紝鑷姩鐢熸垚鐨勭汗鐞嗗簭鍒楄繃婊ゆ柟寮忥紝璁劇疆閫忔槑鑹詫紝鍥懼艦鏂囦歡淇℃伅瀛樻斁鍦板潃鍙緗?錛岃皟鑹叉澘瀛樺偍鍦板潃錛屽垱寤虹殑D3D鏂囩悊鐨勬寚閽堝湴鍧) 楂樼駭鑾峰彇綰圭悊
HRESULT SetTexture(澶氱駭綰圭悊鐨勭儲寮?-7錛孌3D鐨勭汗鐞嗘帴鍙f寚閽? 璁劇疆褰撳墠瑕佹覆鏌撶殑綰圭悊
HRESULT SetTextureStageState(澶氱駭綰圭悊鐨勭儲寮曪紝綰圭悊娓叉煋鐘舵佺殑綾誨瀷錛岀汗鐞嗘覆鏌撶姸鎬佺殑鍊鹼紝涓庣被鍨嬬浉瀵瑰簲) 璁劇疆綰圭悊鐨勬覆鏌撶姸鎬?
HRESULT SetSamplerState(鎸囧畾綰圭悊灞炴?-7錛岀汗鐞嗛噰鏍峰睘鎬х被鍨嬶紝璁劇疆綰圭悊閲囨牱灞炴? 綰圭悊閲囨牱
HRESULT CheckDeviceFormat(鎸囧畾鏄懼崱搴忓垪鍙?D3D璁懼綾誨瀷,鎸囧畾鏄劇ず妯″紡鏍煎紡錛岀紦鍐插尯灞炴э紝闇瑕佷嬌鐢ㄦ煡璇㈢殑鏍煎紡鐨勮澶囩被鍨?闇瑕佹煡璇㈢殑鏄劇ず鏍煎紡) 綰圭悊鍘嬬緝
HRESULT LockRect(鎸囧畾鍔犻攣鐨勭汗鐞嗙駭鍒紝鎸囧悜D3DLOCKED_RECT緇撴瀯錛岃鍔犻攣鐨凴ECT鍖哄煙-0浠h〃鏁翠釜鍖哄煙錛屽姞閿佺被鍨?鍙?鎴栦笅琛ㄧ殑鍊? 閿佸畾綰圭悊
HRESULT UnlockRect(瑙i攣鐨勭汗鐞嗙駭鍒? 瑙i攣綰圭悊
鍚戦噺鍑芥暟
D3DXVECTOR3 * D3DXVer3Length(V) 鍚戦噺妯$殑璁$畻
D3DXVECTOR3 * D3DXVec3Normalize錛堣繑鍥炴寚閽堬紝V錛?鍗曚綅鍖?
D3DXVECTOR3 * D3DXVec3Add(榪斿洖鐨勬寚閽堬紝u,v) 鍚戦噺鍔犳硶
D3DXVECTOR3 * D3DXVec3Subtract錛堝悓涓婏級 鍑忔硶
D3DXVECTOR3 * D3DXVec3Cross(鍚屼笂) 鍚戦噺X涔?
D3DXVECTOR3 * D3DXVec3Lerp(鍚屼笂) 鏁頒箻
D3DXVECTOR3 * D3DXVec3Maximize錛堝悓涓婏級 鍙栨渶澶у?
D3DXVECTOR3 * D3DXVec3Minimize錛堝悓涓婏級 鍙栨渶灝忓?
D3DXVECTOR3 * D3DXVec3Scale錛堣繑鍥炴寚閽堬紝PV錛孎LOAT錛?姣斾緥
FLOAT D3DXVec3Dot(pv1,pv2) 鐐逛箻
鍙傝緙栫▼綺劇補.chm涓殑COM涓ā鍧楃殑瀵煎嚭鍑芥暟
Private Type D3DVECTOR
x As Single
y As Single
z As Single
End Type
'榪斿洖3D鍚戦噺鐨勮鏍煎寲鍚戦噺
Private Declare Function D3DXVec3Normalize Lib "DX8VB.DLL" Alias "VB_D3DXVec3Normalize" (VOut As D3DVECTOR, v As D3DVECTOR) As Long
Private Declare Function D3DXVec3Add Lib "DX8VB.DLL" Alias "VB_D3DXVec3Add" (VOut As D3DVECTOR, v1 As D3DVECTOR, V2 As D3DVECTOR) As Long
Private Declare Function D3DXVec3Subtract Lib "DX8VB.DLL" Alias "VB_D3DXVec3Subtract" (VOut As D3DVECTOR, v1 As D3DVECTOR, V2 As D3DVECTOR) As Long
Private Declare Function D3DXVec3Length Lib "DX8VB.DLL" Alias "VB_D3DXVec3Length" (v As D3DVECTOR) As Single
D3DFVF 鑷敱欏剁偣鐨勬牸寮?
D3DFVF_DIFFUSE 鍖呭惈璋╁弽灝勭殑淇℃伅
D3DFVF_NORMAL 鍖呭惈娉曠嚎淇℃伅
D3DFVF_PSIZE 欏剁偣淇℃伅鎸囨槑緇樺埗鐐圭殑澶у皬
D3DFVF_SPECULAR 鍖呭惈闀滈潰鍙嶅皠鐨勪俊鎭?
D3DFVF_XYZ 鍖呭惈鏈粡杞崲鐨勯《鐐瑰潗鏍?
D3DFVF_XYZRHW 鍖呭惈緇忚繃杞崲鐨勯《鐐瑰潗鏍?
D3DFVF_XYZB1 through D3DFVF_XYZB5 鍖呭惈鐢ㄤ簬楠ㄩ鍔ㄥ寲鐨勯《鐐瑰拰欏剁偣瀵歸楠肩殑鏉冮噸淇℃伅
D3DFVF_XYZW 鍖呭惈緇忚繃杞崲鍜岃鍓殑欏剁偣鍧愭爣
D3DTRANSFORMSTATETYPE 鍙樻崲鐨勭被鍨?
D3DPRIMITIVETYPE 瀹氫箟鍩烘湰鍥懼厓
D3DPT_POINTLIST 涓緇勭偣鐨勯泦鍚?
D3DPT_LINELIST 涓緇勭嚎鐨勯泦鍚?
D3DPT_LINESTRIP 棣栧熬鐩歌繛鐨勭嚎孌電殑闆嗗悎
D3DPT_TRIANGLELIST 涓緇勪笁瑙掑艦鐨勯泦鍚?
D3DPT_TRIANGLESTRIP 棣栧熬鐩歌繛鐨勪笁瑙掑艦錛屾湁涓や釜欏剁偣闆嗗悎
D3DPT_TRIANGLEFAN 緇勬垚鎵囧艦鐨勪竴緇勪笁瑙掑艦闆嗗悎
D3DPT_FORCE_DWORD 鏈畾涔夌殑
D3DDISPLAYMODE 灞忓箷鏄劇ず妯″紡
D3DFMT_UNKNOWN 鏈煡鐨勮薄绱犳牸寮?
D3DFMT_R8G8B8 24浣嶈壊錛孯GB鍚勫崰8浣?
D3DFMT_A8R8G8B8 32浣嶈壊錛孈RGB鍚勫崰8浣?
D3DFMT_X8R8G8B8 32浣嶈壊錛孹涓轟繚鐣?浣?RGB鍚勫崰8浣?
D3DFMT_R5G6B5 16浣嶈壊錛孯鍗?錛孏鍗?錛孊鍗?浣?
D3DFMT_X1R5G5B5 16浣嶈壊錛屼繚鐣?浣嶏紝RGB鍚勫崰5浣?
D3DFMT_A1R5G5B5 16浣嶈壊錛孈鍗?浣嶏紝RG5鍚勫崰5浣?
D3DFMT_A4R4G4B4 16浣嶈壊錛孈RGB鍚勫崰4浣?
D3DFMT_R3G3B2 8浣嶈壊錛孯3,G3,B2浣?
D3DFMT_A8 鍙湁8浣岪
D3DFMT_A8R3G3B2 16浣嶈壊錛孈8錛孯3錛孏3錛孊2浣?
D3DFMT_X4R4G4B4 16浣嶈壊
D3DFMT_A2B10G10R10 32浣嶈壊錛孈鍗?浣嶏紝RGB鍚?0浣?
D3DFMT_A8B8G8R8 32浣嶈壊
D3DFMT_X8B8G8R8 32浣嶈壊
D3DFMT_G16R16 32浣嶈壊錛屽彧鏈夌孩鍜岀豢
D3DFMT_A2R10G10B10 32浣嶈壊
D3DFMT_A16B16G16R16 64浣嶈壊
D3DFMT_A8P8 8浣嶈壊錛?浣嶈〃紺哄崐閫忔槑錛?浣嶈〃紺洪鑹?
D3DFMT_P8 8浣嶈壊錛岀敤鐗欒壊绱㈠紩鍊艱〃紺?
D3DFMT_L8 8浣嶈壊錛屽彧琛ㄧず浜害
D3DFMT_L16 16浣嶈壊錛屽彧琛ㄧず浜害
D3DFMT_A8L8 16浣嶈壊錛?浣嶈〃紺哄崐閫忔槑錛?浣嶈〃紺轟寒搴?
D3DFMT_A4L4 8浣嶈壊錛?浣嶈〃紺哄崐閫忔槑錛?浣嶈〃紺轟寒搴?
D3DDEVTYPE_HAL 紜歡鎶借薄灞傦紝閫氳繃鏄劇ず紜歡鏉ュ畬鎴愬浘褰㈡覆鏌撳伐浣?
D3DDEVTYPE_NULLREF
D3DDEVTYPE_REF 鍙傝冨厜鏍呭櫒錛屼竴鑸敤璇祴璇曟樉紺哄崱涓嶆敮鎸佺殑D3D鍔熻兘
D3DDEVTYPE_SW 鐢ㄨ鏀寔絎笁鏂圭殑杞歡
D3DDEVTYPE_FORCE_DWORD 鎵╁睍鐨?
D3DCREATE 3D榪愮畻鐨勬柟寮?
D3DCREATE_ADAPTERGROUP_DEVICE
D3DCREATE_DISABLE_DRIVER_MANAGEMENT
D3DCREATE_DISABLE_DRIVER_MANAGEMENT_EX
D3DCREATE_FPU_PRESERVE 嬋媧誨弻綺懼害嫻偣榪愮畻鎴栨誕鐐硅繍綆楀紓甯告嫻嬶紝璁劇疆璇ラ」浼氶檷浣庣郴緇熸ц兘
D3DCREATE_HARDWARE_VERTEXPROCESSING 鐢盌3D紜歡榪涜欏剁偣棰勭畻
D3DCREATE_MIXED_VERTEXPROCESSING 鐢辨販鍚堟柟寮忚繘琛岄《鐐硅繍綆?
D3DCREATE_MULTITHREADED 鏀寔澶氱嚎紼嬬粯鍒訛紝璁劇疆璇ラ」浼氶檷浣庣郴緇熸ц兘
D3DCREATE_NOWINDOWCHANGES
D3DCREATE_PUREDEVICE 紱佺敤D3D鐨凣ET*錛堬級鍑芥暟錛岀姝3D浣跨敤铏氭嫙璁懼妯℃嫙欏剁偣榪愮畻
D3DCREATE_SCREENSAVER
D3DCREATE_SOFTWARE_VERTEXPROCESSING 鐢盌3D杞歡榪涜欏剁偣榪愮畻
D3DSWAPEFFECT 鍙栧煎垪琛?
D3DSWAPEFFECT_DISCARD 鍚庡彴緙撳啿鍖哄鍒跺埌鍓嶅彴鏃訛紝娓呴櫎鍚庡彴緙撳啿鍖哄唴瀹?
D3DSWAPEFFECT_FLIP 鍚庡彴緙撳啿鍖哄唴瀹瑰鍒跺悗錛屼繚鎸佷笉鍙橈紝鏈夊涓悗鍙扮紦鍐插尯鏃朵嬌鐢?
D3DSWAPEFFECT_COPY 鍚庡彴緙撳啿鍖哄唴瀹瑰鍒跺悗錛屼繚鎸佷笉鍙橈紝鍙湁1涓悗鍙扮紦鍐插尯鏃朵嬌鐢?
D3DSWAPEFFECT_FORCE_DWORD 寮鴻揩璇ョ洿浣滀負32浣嶅瓨鍌紝閫氬父涓嶇敤
D3DPRESENT 灞忓箷鍙嶈漿妯″紡鍒楄〃
D3DPRESENT_DONOTWAIT
D3DPRESENT_INTERVAL_DEFAULT 榛樿鐨勫悓ONE
D3DPRESENT_INTERVAL_ONE 褰撳睆騫曞埛鏂頒竴嬈℃椂鍓嶅彴鍚庡彴榪涜浜ゆ崲
D3DPRESENT_INTERVAL_TWO 褰撳睆騫曞埛鏂頒簩嬈℃椂鍓嶅彴鍚庡彴榪涜浜ゆ崲
D3DPRESENT_INTERVAL_THREE 褰撳睆騫曞埛鏂頒笁嬈℃椂鍓嶅彴鍚庡彴榪涜浜ゆ崲
D3DPRESENT_INTERVAL_FOUR 褰撳睆騫曞埛鏂板洓嬈℃椂鍓嶅彴鍚庡彴榪涜浜ゆ崲
D3DPRESENT_INTERVAL_IMMEDIATE 鍥懼艦緇樺埗瀹屾垚鏃剁珛鍗寵繘琛屼氦鎹?
D3DPRESENT_LINEAR_CONTENT
D3DUSAGE 緙撳啿鍖哄睘鎬у煎垪琛?
D3DUSAGE_AUTOGENMIPMAP
D3DUSAGE_DEPTHSTENCIL
D3DUSAGE_DMAP
D3DUSAGE_DONOTCLIP 紱佺敤瑁佸壀錛岃〃紺洪《鐐圭紦鍐插尯涓殑欏剁偣涓嶈繘琛岃鍓紝褰撹緗灞炴ф椂錛屾覆鏌撶姸鎬丏3DRS_CLIPPING蹇呴』璁句負FALSE
D3DUSAGE_DYNAMIC 浣跨敤鍔ㄦ佸唴瀛樺垎閰?
D3DUSAGE_NPATCHES 浣跨敤欏剁偣緙撳啿鍖虹粯鍒禢-patches鏇茬嚎
D3DUSAGE_POINTS 浣跨敤欏剁偣緙撳啿鍖虹粯鍒剁偣
D3DUSAGE_RENDERTARGET
D3DUSAGE_RTPATCHES 浣跨敤欏剁偣緙撳啿鍖虹粯鍒舵洸綰?
D3DUSAGE_SOFTWAREPROCESSING 浣跨敤杞歡榪涜欏剁偣榪愮畻錛屽惁鍒欎嬌鐢ㄧ‖浠惰綆?
D3DUSAGE_WRITEONLY 鍙啓灞炴э紝涓嶈兘榪涜璇繪搷浣滐紝璁劇疆璇ュ睘鎬у彲浠ユ彁楂樼郴緇熸ц兘
D3DPOOL 緙撳啿鍖鴻祫婧愬唴瀛樹綅緗垪琛?
D3DPOOL_DEFAULT 榛樿鐨勶紝欏剁偣緙撳啿鍖哄敖鍙兘瀛樺湪涓庢樉瀛樹腑
D3DPOOL_MANAGED 鐢盌3D鑷姩璋冨害欏剁偣緙撳啿鍖哄唴瀛樹綅緗紙鏄懼瓨鍜屽唴瀛橈級
D3DPOOL_SCRATCH 欏剁偣緙撳啿鍖轟綅浜庤綆楁満鐨勪復鏃跺唴瀛樹腑錛岃繖縐嶇被鍨嬬殑欏剁偣緙撳啿鍖轟笉鑳界洿鎺ヨ繘琛屾覆鏌擄紝鍙兘榪涜鍐呭瓨鏋烽攣錛屾嫹璐濈瓑鎿嶄綔
D3DPOOL_SYSTEMMEM 欏剁偣緙撳啿鍖轟綅浜庡唴瀛樹腑
D3DLOCK 緙撳啿鍖哄姞閿?
D3DLOCK_DISCARD 鏇存柊鏁翠釜緙撳啿鍖?
D3DLOCK_DONOTWAIT
D3DLOCK_NO_DIRTY_UPDATE 鍦ㄥ姞閿佺殑榪囩▼涓郴緇熻繘琛屽叾浠栨搷浣滐紙榛樿鏈塂irty鏍囪)
D3DLOCK_NOOVERWRITE 淇濊瘉涓嶈吂紼跨紦鍐插尯鏁版嵁錛岃緗灞炴у彲浠ョ珛鍗寵繑鍥炲唴瀛樻寚閽堬紝鎻愰珮緋葷粺鎬ц兘
D3DLOCK_NOSYSLOCK 鍦ㄥ姞閿佺殑榪囩▼涓郴緇熷彲鑳芥墽琛屽叾浠栨搷浣?
D3DLOCK_READONLY 璁劇疆緙撳啿鍖轟綅鍙灞炴?
D3DXVECTOR3 鍚戦噺綆楁硶
D3DXVECTOR3u(x,y,z);
D3DXVECTOR3v(x,y,z);
float 鍙橀噺=D3DXVec3Dot(u鎸囬拡,v鎸囬拡) 鐐逛箻
D3DXMATRIX 鐭╅樀
D3DXMatrixIdentity 鍗曚綅鐭╅樀
D3DXMatrixInverse 閫嗙煩闃?
D3D瀹炵幇鍥懼艦鍙樻崲
D3DXMatrixTranslation 騫崇Щ鐭╅樀
D3DXMatrixLockAtLH 瑙傚療鐭╅樀
D3DXMatrixIdentity 灝嗕竴涓煩闃靛崟浣嶅寲
D3DXMatrixRotationY 緇昚杞磋漿
D3DXMatrixRotationX 緇昘杞磋漿
D3DXMatrixRotationZ 緇昛杞磋漿
D3DXMatrixScaling 緙╂斁鍙樻崲
D3DXMatrixMuLationAxis 鍥寸粫浠繪剰涓涓醬鏃嬭漿
D3DXMatrixMultiply 緇勫悎鍙樻崲
D3DUSAGE 綰圭悊浣跨敤
D3DUSAGE_AUTOGENMIPMAP 鑷姩鐢熸垚澶氱駭娓愯繘綰圭悊搴忓垪錛岃鏂瑰紡鍦ㄨ祫婧愬浜嶥3DPOOL_SYSTEMMEM鏃舵棤鏁?
D3DUSAGE_DEPTHSTENCIL 娣卞害妯$増緙撳啿鍖猴紝鍙湪璧勬簮澶勪簬D3DPOOL_default鏃舵湁鏁?
D3DUSAGE_DMAP 璇ョ汗鐞嗘槸涓涓疆鎹㈢汗鐞?
D3DUSAGE_DONOTCLIP
D3DUSAGE_DYNAMIC
D3DUSAGE_NPATCHES
D3DUSAGE_POINTS
D3DUSAGE_RENDERTARGET 璇ユ枃鐞嗘槸涓涓覆鏌撶洰鏍囩紦鍐插尯
D3DUSAGE_RTPATCHES
D3DUSAGE_SOFTWAREPROCESSING 搴旂敤鍧愭爣鍙樻崲
D3DUSAGE_WRITEONLY
D3DTEXTURESTAGESTATETYPE 娓叉煋鐘舵佺被鍨?
D3DTSS_COLOROP 1 鏂囩悊灞傜殑棰滆壊娣峰悎鏂瑰紡
D3DTSS_COLORARG1 2 棰滆壊娣峰悎鐨勭涓涓弬鏁?
D3DTSS_COLORARG2 3 棰滆壊娣峰悎鐨勭浜屼釜鍙傛暟
D3DTSS_ALPHAOP 4 鎸囧畾綰圭悊灞傜殑Alpha閫忔槑
D3DTSS_ALPHAARG1 5 Alpha娣峰悎鐨勭涓涓弬鏁?
D3DTSS_ALPHAARG2 6 Alpha娣峰悎鐨勭浜屼釜鍙傛暟
D3DTSS_BUMPENVMAT00 7 緇樺埗鍑瑰嚫綰圭悊鏃?
D3DTSS_BUMPENVMAT01 8 緇樺埗鍑瑰嚫綰圭悊鏃?
D3DTSS_BUMPENVMAT10 9 緇樺埗鍑瑰嚫綰圭悊鏃?
D3DTSS_BUMPENVMAT11 10 緇樺埗鍑瑰嚫綰圭悊鏃?
D3DTSS_TEXCOORDINDEX 11 璇ョ汗鐞嗗眰浣跨敤鐨勭汗鐞嗗潗鏍囩殑绱㈠紩
D3DTSS_BUMPENVLSCALE 22 緇樺埗鍑瑰嚫綰圭悊鐨勭緝鏀懼弬鏁?
D3DTSS_BUMPENVLOFFSET 23 緇樺埗鍑瑰嚫綰圭悊鐨勫鉤縐誨弬鏁?
D3DTSS_TEXTURETRANSFORMFLAGS 24 鎺у埗綰圭悊鍧愭爣鐨勮漿鎹㈡爣蹇?
D3DTSS_COLORARG0 26 鎸囧畾娣峰悎榪囩▼鐨勭涓変釜棰滆壊
D3DTSS_ALPHAARG0 27 Alpha娣峰悎鐨勭涓変釜鍙傛暟
D3DTSS_RESULTARG 28 棰滆壊娣峰悎鐨勭粨鏋滆緭鍑哄瘎瀛樺櫒
D3DTSS_CONSTANT 32 棰滆壊娣峰悎鐨勫父閲忓瘎瀛樺櫒
D3DTSS_FORCE_DWORD 0x7fffffff 寮哄埗杞崲涓?2浣嶏紝閫氬父涓嶇敤
D3DSAMPLERSTATETYPE 綰圭悊閲囨牱灞炴?
D3DSAMP_ADDRESSU 1 鍖呰綰圭悊
D3DSAMP_ADDRESSV 2 鍖呰綰圭悊
D3DSAMP_ADDRESSW 3 鍖呰綰圭悊
D3DSAMP_BORDERCOLOR 4
D3DSAMP_MAGFILTER 5 澶勭悊鏀懼ぇ榪囨護
D3DSAMP_MINFILTER 6 澶勭悊緙╁皬榪囨護
D3DSAMP_MIPFILTER 7 澶氱汗鐞嗚繃婊?
D3DSAMP_MIPMAPLODBIAS 8 澶氱駭鏂囩悊綰ф暟鍋忕Щ鍊鹼紝鍒濊瘯鐩翠負0
D3DSAMP_MAXMIPLEVEL 9 鏈澶у綰圭悊綰у埆錛屽垵璇曞間負0
D3DSAMP_MAXANISOTROPY 10 鍚勫悜寮傛э紝鍒濊瘯鍊間負1
D3DSAMP_SRGBTEXTURE 11
D3DSAMP_ELEMENTINDEX 12
D3DSAMP_DMAPOFFSET 13
D3DSAMP_FORCE_DWORD 0x7fffffff 寮哄埗杞崲32浣嶏紝閫氬父涓嶇敤
綰圭悊瀵誨潃
D3DTADDRESS_WRAP 1 鍖呰綰圭悊瀵誨潃
D3DTADDRESS_MIRROR 2 闀滃儚綰圭悊瀵誨潃
D3DTADDRESS_CLAMP 3 澶瑰彇綰圭悊瀵誨潃
D3DTADDRESS_BORDER 4 杈規棰滆壊綰圭悊瀵誨潃
D3DTADDRESS_MIRRORONCE 5 涓嬈¢暅鍍忕汗鐞嗗鍧
D3DTADDRESS_FORCE_DWORD 0x7fffffff寮哄埗杞崲32浣嶏紝閫氬父涓嶇敤
涓栫晫鍙樻崲
D3DTS_WORLD 涓栫晫鍙樻崲
鍒涘緩ID3DXFont瀵硅薄
浣跨敤鎺ュ彛ID3DXFont緇樺埗鏂囨湰錛岄鍏堥渶瑕侀氳繃鍑芥暟D3DXCreateFont()鍒涘緩ID3DXFont瀛椾綋瀵硅薄銆侷D3DXFont鎺ュ彛灝佽浜哤indows瀛椾綋鍜孌irect3D璁懼鎸囬拡錛孌3DXCreateFont()鍑芥暟閫氳繃Windows瀛椾綋鍜孌irect3D璁懼鎸囬拡鍒涘緩ID3DXFont瀵硅薄錛岃鍑芥暟鐨勫0鏄庡涓嬶細
Creates a font object for a device and font.
HRESULT D3DXCreateFont( LPDIRECT3DDEVICE9 pDevice, INT Height, UINT Width, UINT Weight, UINT MipLevels, BOOL Italic, DWORD CharSet, DWORD OutputPrecision, DWORD Quality, DWORD PitchAndFamily, LPCTSTR pFacename, LPD3DXFONT * ppFont);
Parameters
pDevice
[in] Pointer to an IDirect3DDevice9 interface, the device to be associated with the font object.
Height
[in] The height of the characters in logical units.
Width
[in] The width of the characters in logical units.
Weight
[in] Typeface weight. One example is bold.
MipLevels
[in] The number of mipmap levels.
Italic
[in] True for italic font, false otherwise.
CharSet
[in] The character set of the font.
OutputPrecision
[in] Specifies how Windows should attempt to match the desired font sizes and characteristics with actual fonts. Use OUT_TT_ONLY_PRECIS for instance, to ensure that you always get a TrueType font.
Quality
[in] Specifies how Windows should match the desired font with a real font. It applies to raster fonts only and should not affect TrueType fonts.
PitchAndFamily
[in] Pitch and family index.
pFacename
[in] String containing the typeface name. If the compiler settings require Unicode, the data type LPCTSTR resolves to LPCWSTR. Otherwise, the string data type resolves to LPCSTR. See Remarks.
ppFont
[out] Returns a pointer to an ID3DXFont interface, representing the created font object.
Return Values
If the function succeeds, the return value is S_OK. If the function fails, the return value can be one of the following: D3DERR_INVALIDCALL, D3DXERR_INVALIDDATA, E_OUTOFMEMORY.
Remarks
The creation of an ID3DXFont object requires that the device supports 32-bit color.
The compiler setting also determines the function version. If Unicode is defined, the function call resolves to D3DXCreateFontW. Otherwise, the function call resolves to D3DXCreateFontA because ANSI strings are being used.
If you want more information about font parameters, see The Logical Font.
紺轟緥浠g爜濡備笅錛?/p>
D3DXCreateFont(g_device, 50, 20, 20, 0, FALSE, DEFAULT_CHARSET, 0, 0, 0, "Arial", &g_font);
OpenGL may be implemented by any combination of hardware and software. At the high-end, hardware may implement virtually all of OpenGL while at the low-end, OpenGL may be implemented entirely in software. In between are combination software/hardware implementations. More money buys more hardware and better performance.
Intro-level workstation hardware and the recent PC 3-D hardware typically implement point, line, and polygon rasterization in hardware but implement floating point transformations, lighting, and clipping in software. This is a good strategy since the bottleneck in 3-D rendering is usually rasterization and modern CPU's have sufficient floating point performance to handle the transformation stage.
OpenGL developers must remember that their application may be used on a wide variety of OpenGL implementations. Therefore one should consider using all possible optimizations, even those which have little return on the development system, since other systems may benefit greatly.
From this point of view it may seem wise to develop your application on a low-end system. There is a pitfall however; some operations which are cheep in software may be expensive in hardware. The moral is: test your application on a variety of systems to be sure the performance is dependable.
One should consider multiprocessing in these situations. By assigning rendering and computation to different threads they may be executed in parallel on multiprocessor computers.
For many applications, supporting multiprocessing is just a matter of partitioning the render and compute operations into separate threads which share common data structures and coordinate with synchronization primitives.
SGI's Performer is an example of a high level toolkit designed for this purpose.
Complexity may refer to the geometric or rendering attributes of a database. Here are a few examples.
Objects which are entirely outside of the field of view may be culled. This type of high level cull testing can be done efficiently with bounding boxes or spheres and have a major impact on performance. Again, toolkits such as Inventor and Performer have this feature.
Basically, one wants data structures which can be traversed quickly and passed to the graphics library in an efficient manner. For example, suppose we need to render a triangle strip. The data structure which stores the list of vertices may be implemented with a linked list or an array. Clearly the array can be traversed more quickly than a linked list. The way in which a vertex is stored in the data structure is also significant. High performance hardware can process vertexes specified by a pointer more quickly than those specified by three separate parameters.
Our first attempt at rendering this information may be:
We can still do better, however. If we redesign the data structures used to represent the city information we can improve the efficiency of drawing the city points. For example:
In the following sections the techniques for maximizing performance, as seen above, are explained.
After each of the following techniques look for a bracketed list of symbols which relates the significance of the optimization to your OpenGL system:
Example:
This is a very bad construct. The following is much better:
Wrong:
Example:
Note that software implementations of OpenGL may actually perform these operations faster than hardware systems. If you're developing on a low-end system be aware of this fact. [H,L] The It may be worthwhile to experiment with different visuals to determine if there's any advantage of one over another. Synchronization hurts performance. Therefore, if you need to render with both OpenGL and native window system calls try to group the rendering calls to minimize synchronization.
For example, if you're drawing a 3-D scene with OpenGL and displaying text with X, draw all the 3-D elements first, call Also, when responding to mouse motion events you should skip extra motion events in the input queue. Otherwise, if you try to process every motion event and redraw your scene there will be a noticable delay between mouse input and screen updates.
It can be a good idea to put a print statement in your redraw and event loop function so you know exactly what messages are causing your scene to be redrawn, and when.
Don't do this:
Do this:
Performance evaluation is a large subject and only the basics are covered here. For more information see "OpenGL on Silicon Graphics Systems".
After bottlenecks have been identified the techniques outlined in section 3 can be applied. The process of identifying and reducing bottlenecks should be repeated until no further improvements can be made or your minimum performance threshold has been met.
Measure the performance of rendering in single buffer mode to determine how far you really are from your target frame rate.
1. Hardware vs. Software
2. Application Organization
At first glance it may seem that the performance of interactive OpenGL applications is dominated by the performance of OpenGL itself. This may be true in some circumstances but be aware that the organization of the application is also significant.
2.1 High Level Organization
Multiprocessing
Some graphical applications have a substantial computational component other than 3-D rendering. Virtual reality applications must compute object interactions and collisions. Scientific visualization programs must compute analysis functions and graphical representations of data.
Image quality vs. performance
In general, one wants high-speed animation and high-quality images in an OpenGL application. If you can't have both at once a reasonable compromise may be to render at low complexity during animation and high complexity for static images.
GL_NEAREST sampling and glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST ).
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ) to inspect tesselation granularity and reduce if possible. Level of detail management and culling
Objects which are distant from the viewer may be rendered with a reduced complexity model. This strategy reduces the demands on all stages of the graphics pipeline. Toolkits such as Inventor and Performer support this feature automatically.
2.2 Low Level Organization
The objects which are rendered with OpenGL have to be stored in some sort of data structure. Some data structures are more efficient than others with respect to how quickly they can be rendered.
An Example
Suppose we're writing an application which involves drawing a road map. One of the components of the database is a list of cities specified with a latitude, longitude and name. The data structure describing a city may be:
struct city {
float latitute, longitude; /* city location */
char *name; /* city's name */
int large_flag; /* 0 = small, 1 = large */
};
A list of cities may be stored as an array of city structs.
void draw_cities( int n, struct city citylist[] )
{
int i;
for (i=0; i < n; i++) {
if (citylist[i].large_flag) {
glPointSize( 4.0 );
}
else {
glPointSize( 2.0 );
}
glBegin( GL_POINTS );
glVertex2f( citylist[i].longitude, citylist[i].latitude );
glEnd();
glRasterPos2f( citylist[i].longitude, citylist[i].latitude );
glCallLists( strlen(citylist[i].name),
GL_BYTE,
citylist[i].name );
}
}
This is a poor implementation for a number of reasons:
Here's a better implementation:
glPointSize is called for every loop iteration.
glBegin and glEnd
void draw_cities( int n, struct city citylist[] )
{
int i;
/* draw small dots first */
glPointSize( 2.0 );
glBegin( GL_POINTS );
for (i=0; i < n ;i++) {
if (citylist[i].large_flag==0) {
glVertex2f( citylist[i].longitude, citylist[i].latitude );
}
}
glEnd();
/* draw large dots second */
glPointSize( 4.0 );
glBegin( GL_POINTS );
for (i=0; i < n ;i++) {
if (citylist[i].large_flag==1) {
glVertex2f( citylist[i].longitude, citylist[i].latitude );
}
}
glEnd();
/* draw city labels third */
for (i=0; i < n ;i++) {
glRasterPos2f( citylist[i].longitude, citylist[i].latitude );
glCallLists( strlen(citylist[i].name),
GL_BYTE,
citylist[i].name );
}
}
In this implementation we're only calling glPointSize twice and we're maximizing the number of vertices specified between glBegin and glEnd.
struct city_list {
int num_cities; /* how many cities in the list */
float *position; /* pointer to lat/lon coordinates */
char **name; /* pointer to city names */
float size; /* size of city points */
};
Now cities of different sizes are stored in separate lists. Position are stored sequentially in a dynamically allocated array. By reorganizing the data structures we've eliminated the need for a conditional inside the glBegin/glEnd loops. Also, we can render a list of cities using the GL_EXT_vertex_array extension if available, or at least use a more efficient version of glVertex and glRasterPos.
/* indicates if server can do GL_EXT_vertex_array: */
GLboolean varray_available;
void draw_cities( struct city_list *list )
{
int i;
GLboolean use_begin_end;
/* draw the points */
glPointSize( list->size );
#ifdef GL_EXT_vertex_array
if (varray_available) {
glVertexPointerEXT( 2, GL_FLOAT, 0, list->num_cities, list->position );
glDrawArraysEXT( GL_POINTS, 0, list->num_cities );
use_begin_end = GL_FALSE;
}
else
#else
{
use_begin_end = GL_TRUE;
}
#endif
if (use_begin_end) {
glBegin(GL_POINTS);
for (i=0; i < list->num_cities; i++) {
glVertex2fv( &position[i*2] );
}
glEnd();
}
/* draw city labels */
for (i=0; i < list->num_cities ;i++) {
glRasterPos2fv( list->position[i*2] );
glCallLists( strlen(list->name[i]),
GL_BYTE, list->name[i] );
}
}
As this example shows, it's better to know something about efficient rendering techniques before designing the data structures. In many cases one has to find a compromize between data structures optimized for rendering and those optimized for clarity and convenience.
3. OpenGL Optimization
There are many possibilities to improving OpenGL performance. The impact of any single optimization can vary a great deal depending on the OpenGL implementation. Interestingly, items which have a large impact on software renderers may have no effect on hardware renderers, and vice versa! For example, smooth shading can be expensive in software but free in hardware While glGet* can be cheap in software but expensive in hardware.
3.1 Traversal
Traversal is the sending of data to the graphics system. Specifically, we want to minimize the time taken to specify primitives to OpenGL.
GL_LINES, GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, and GL_QUAD_STRIP require fewer vertices to describe an object than individual line, triangle, or polygon primitives. This reduces data transfer and transformation workload. [all]
glVertex/glColor/glNormal calls with the vertex array mechanism may be very beneficial. [all]
glVertex, glColor, glNormal and glTexCoord
glVertex, glColor, etc. functions which take a pointer to their arguments such as glVertex3fv(v) may be much faster than those which take individual arguments such as glVertex3f(x,y,z) on systems with DMA-driven graphics hardware. [H,L]
glNormal. If texturing is disabled don't call glTexCoord, etc.
glBegin/glEnd
glBegin/glEnd.
glBegin( GL_TRIANGLE_STRIP );
for (i=0; i < n; i++) {
if (lighting) {
glNormal3fv( norm[i] );
}
glVertex3fv( vert[i] );
}
glEnd();
if (lighting) {
glBegin( GL_TRIANGLE_STRIP );
for (i=0; i < n ;i++) {
glNormal3fv( norm[i] );
glVertex3fv( vert[i] );
}
glEnd();
}
else {
glBegin( GL_TRIANGLE_STRIP );
for (i=0; i < n ;i++) {
glVertex3fv( vert[i] );
}
glEnd();
}
Also consider manually unrolling important rendering loops to maximize the function call rate. 3.2 Transformation
Transformation includes the transformation of vertices from glVertex to window coordinates, clipping and lighting.
GL_SHININESS material parameter. [L,S]
glEnable/Disable(GL_NORMALIZE) controls whether normal vectors are scaled to unit length before lighting. If you do not use glScale you may be able to disable normalization without ill effects. Normalization is disabled by default. [L,S]
GL_LINES, GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, and GL_QUAD_STRIP decrease traversal and transformation load.
glRect usage
glBegin(GL_QUADS) ... glEnd() instead. [all] 3.3 Rasterization
Rasterization is the process of generating the pixels which represent points, lines, polygons, bitmaps and the writing of those pixels to the frame buffer. Rasterization is often the bottleneck in software implementations of OpenGL.
3.4 Texturing
Texture mapping is usually an expensive operation in both hardware and software. Only high-end graphics hardware can offer free to low-cost texturing. In any case there are several ways to maximize texture mapping performance.
GL_UNSIGNED_BYTE component format is typically the fastest for specifying texture images. Experiment with the internal texture formats offered by the GL_EXT_texture extension. Some formats are faster than others on some systems (16-bit texels on the Reality Engine, for example). [all]
GL_NEAREST or GL_LINEAR then there's no reason OpenGL has to compute the lambda value which determines whether to use minification or magnification sampling for each fragment. Avoiding the lambda calculation can be a good performace improvement.
GL_DECAL or GL_REPLACE_EXT functions for 3 component textures is a simple assignment of texel samples to fragments while GL_MODULATE is a linear interpolation between texel samples and incoming fragments. [S,L]
glTexImage2D to repeatedly change the texture. Use glTexSubImage2D or glTexCopyTexSubImage2D. These functions are standard in OpenGL 1.1 and available as extensions to 1.0. 3.5 Clearing
Clearing the color, depth, stencil and accumulation buffers can be time consuming, especially when it has to be done in software. There are a few tricks which can help.
glClear carefully [all]
glClear.
glClear( GL_COLOR_BUFFER_BIT );
if (stenciling) {
glClear( GL_STENCIL_BUFFER_BIT );
}
Right:
if (stenciling) {
glClear( GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT );
}
else {
glClear( GL_COLOR_BUFFER_BIT );
}
glScissor() to restrict clearing to a smaller area. [L].
int EvenFlag;
/* Call this once during initialization and whenever the window
* is resized.
*/
void init_depth_buffer( void )
{
glClearDepth( 1.0 );
glClear( GL_DEPTH_BUFFER_BIT );
glDepthRange( 0.0, 0.5 );
glDepthFunc( GL_LESS );
EvenFlag = 1;
}
/* Your drawing function */
void display_func( void )
{
if (EvenFlag) {
glDepthFunc( GL_LESS );
glDepthRange( 0.0, 0.5 );
}
else {
glDepthFunc( GL_GREATER );
glDepthRange( 1.0, 0.5 );
}
EvenFlag = !EvenFlag;
/* draw your scene */
}
3.6 Miscellaneous
glGetFloatv, glGetIntegerv, glIsEnabled, glGetError, glGetString require a slow, round trip transaction between the application and renderer. Especially avoid them in your main rendering code.
glPushAttrib
glPushAttrib( GL_ALL_ATTRIB_BITS ) in particular can be very expensive on hardware systems. This call may be faster in software implementations than in hardware. [H,L]
glGetError inside your rendering/event loop to catch errors. GL errors raised during rendering can slow down rendering speed. Remove the glGetError call for production code since it's a "round trip" command and can cause delays. [all]
glColorMaterial instead of glMaterial
glColorMaterial may be faster than glMaterial. [all]
glDrawPixels
glDrawPixels often performs best with GL_UNSIGNED_BYTE color components [all]
glDrawPixels. [all]
glPolygonMode
glBegin with GL_POINTS, GL_LINES, GL_LINE_LOOP or GL_LINE_STRIP instead as it can be much faster. [all] 3.7 Window System Integration
glXMakeCurrent call, for example, can be expensive on hardware systems because the context switch may involve moving a large amount of data in and out of the hardware.
GLX_EXT_visual_rating extension can help you select visuals based on performance or quality. GLX 1.2's visual caveat attribute can tell you if a visual has a performance penalty associated with it.
glXWaitX and glXWaitGL functions serve this purpose.
glXWaitGL to synchronize, then call all the X drawing functions.
3.8 Mesa-specific
Mesa is a free library which implements most of the OpenGL API in a compatible manner. Since it is a software library, performance depends a great deal on the host computer. There are several Mesa-specific features to be aware of which can effect performance.
MESA_RGB_VISUAL environment variable can be used to determine the quickest visual by experimentation.
glColor command should be put before the glBegin call.
glBegin(...);
glColor(...);
glVertex(...);
...
glEnd();
glColor(...);
glBegin(...);
glVertex(...);
...
glEnd();
glColor[34]ub[v] are the fastest versions of the glColor command.
4. Evaluation and Tuning
To maximize the performance of an OpenGL applications one must be able to evaluate an application to learn what is limiting its speed. Because of the hardware involved it's not sufficient to use ordinary profiling tools. Several different aspects of the graphics system must be evaluated.
4.1 Pipeline tuning
The graphics system can be divided into three subsystems for the purpose of performance evaluation:
At any given time, one of these stages will be the bottleneck. The bottleneck must be reduced to improve performance. The strategy is to isolate each subsystem in turn and evaluate changes in performance. For example, by decreasing the workload of the CPU subsystem one can determine if the CPU or graphics system is limiting performance.
4.1.1 CPU subsystem
To isosulate the CPU subsystem one must reduce the graphics workload while presevering the application's execution characteristics. A simple way to do this is to replace glVertex() and glNormal calls with glColor calls. If performance does not improve then the CPU stage is the bottleneck.
4.1.2 Geometry subsystem
To isoslate the geometry subsystem one wants to reduce the number of primitives processed, or reduce the transformation work per primitive while producing the same number of pixels during rasterization. This can be done by replacing many small polygons with fewer large ones or by simply disabling lighting or clipping. If performance increases then your application is bound by geometry/transformation speed.
4.1.3 Rasterization subsystem
A simple way to reduce the rasterization workload is to make your window smaller. Other ways to reduce rasterization work is to disable per-pixel processing such as texturing, blending, or depth testing. If performance increases, your program is fill limited.
4.2 Double buffering
For smooth animation one must maintain a high, constant frame rate. Double buffering has an important effect on this. Suppose your application needs to render at 60Hz but is only getting 30Hz. It's a mistake to think that you must reduce rendering time by 50% to achive 60Hz. The reason is the swap-buffers operation is synchronized to occur during the display's vertical retrace period (at 60Hz for example). It may be that your application is taking only a tiny bit too long to meet the 1/60 second rendering time limit for 60Hz.
4.3 Test on several implementations
The performance of OpenGL implementations varies a lot. One should measure performance and test OpenGL applications on several different systems to be sure there are no unexpected problems.
銆銆灝辨垜涓漢鏉ヨ3ds max 8鑴氭湰璋冭瘯鍣ㄧ敤寰椾笉澶氾紝鍦ㄨ繖閲屾垜璁蹭竴涓嬭剼鏈皟璇曞櫒鐨勫師鐞嗗拰綆鍗曠殑鐢ㄦ硶銆傝剼鏈皟璇曞櫒鍙笉榪囨槸涓涓猰ax8鐨勪竴涓皟璇曠▼搴忥紝瀹冨厑璁告殏鍋?ds max涓葷嚎紼嬪拰鍏跺畠綰跨▼錛屽彲浠ヤ嬌鐢ㄥ懡浠hreads鏄劇ず褰撳墠鐨?ds max鎵鏈夌嚎紼嬪強綰跨▼id錛屽彲浠ヤ嬌鐢╯etThread 綰跨▼ID)鍒囨崲褰撳墠璋冭瘯鐨勭嚎紼嬨備竴鑸儏鍐佃皟璇曞櫒榛樿涓鴻皟璇曟渶欏跺眰(榪欎釜璇嶄笉鐭ラ亾澶у鏄惁鐞嗚В鎴戠殑鎰忔濓紝灝卞儚鏄閲岄潰鐨勮彍鐩樺瓙錛屾渶欏跺眰鐨勭洏瀛愭槸鏈鍚庢斁涓婂幓鐨勶紝褰撶劧瑕佹嬁寮鐩樺瓙鍙兘浠庢渶涓婇潰涓涓紑濮?鐨勭嚎紼嬶紝3ds max鏈韓鍦ㄥ疄鐜頒竴浜涙搷浣滄椂澶ч噺浣跨敤澶氱嚎紼嬶紝渚嬪娓叉煋鏃訛紝灝卞垱寤轟簡涓涓柊綰跨▼錛屽叧浜庣嚎紼嬪拰榪涚▼鐨勫尯鍒紝浣犲彲浠ユ壘鐩稿簲緙栫▼涔︾睄銆傚湪3ds max8鐨勭洰鍓嶈皟璇曞櫒鐗堟湰錛岃繕涓嶆敮鎸侀紶鏍囬夋嫨鏌愯璁劇疆鏂偣錛堣嚦灝戞垜娌℃湁鎵懼埌榪欎釜鍔熻兘錛屼綘鎵懼埌浜嗚鍛婅瘔鎴戯級錛屽洜姝ゆ垜鐜板湪鏂畾錛岃繖鏄竴涓笉瀹炵敤鐨勫伐鍏楓備絾鏄?ds max8宸茬粡涓烘垜浠彁渚涗簡榪欎釜宸ュ叿錛屽綋鐒舵槸鏈夌敤鐨勪簡錛屽彧涓嶈繃紼嶇◢楹葷儲銆?br>銆銆浣跨敤鑴氭湰璋冭瘯鍣紙鎴戝亣璁句綘宸茬粡鍐欏ソ浜嗕竴涓剼鏈級錛岄鍏堝湪浣犵殑鑴氭湰浣犳兂瑕佹殏鍋滅殑鍦版柟璁劇疆鏂偣錛岃緗柇鐐瑰彲浠ヤ嬌鐢╞reak()鍑芥暟錛屼篃灝辨槸褰撹剼鏈繍琛屽埌榪欓噷鏃舵殏鍋滅▼搴忋傝繖鏍峰綋浣犺繍琛岃繖涓剼鏈椂浣犲皢浼氬湪鑴氭湰璋冭瘯鍣ㄧ殑"杈撳嚭"緙栬緫紿楀彛涓樉紺虹嚎紼嬬浉搴旂殑鍐呭銆傦紙鎴戜釜浜鴻涓烘瘡榪愯涓涓剼鏈紝3ds max灝變負榪欎釜鑴氭湰鍒涘緩涓涓嚎紼嬶紝鎵浠ユ墠鍙互浣跨敤鑴氭湰璋冭瘯鍣ㄦ潵璺熻釜鑴氭湰銆傝皝鑳借瘉瀹炰竴涓嬫垜鐨勭寽嫻?鎴戠殑E-MAIL: liyingjang@21cn.com錛夈傚綋鑴氭湰鎵ц鍒頒綘璁劇殑鏂偣澶勫氨鍋滀笅鏉ワ紝榪欐椂浣犲彲浠ヤ嬌鐢╣etVar ""鍜?setVar "" 鏉ユ煡鐪嬪彉閲忓唴瀹瑰拰涓存椂璁劇疆鍙橀噺鍐呭銆傛洿鏂逛究鏌ョ湅鍙橀噺鍐呭鐨勬柟娉曞彲浠ョ偣鍑?鐩戣"鎸夐挳錛岀劧鍚庤緭鍏ュ彉閲忓悕鎸夊洖杞﹂敭鍗沖彲鏄劇ず浣犲垰杈撳叆鐨勫彉閲忓悕鐨勫間簡銆傜偣鍑?榪愯"鎸夐挳鍙互浣胯剼鏈繍琛屽埌涓嬩竴涓柇鐐瑰鏆傚仠錛屾煡鐪嬪拰璁劇疆鍙橀噺鐨勬柟娉曚笂涓姝ユ墍璇寸殑鏄竴鏍楓?br>銆銆鎬葷粨涓涓嬶細3ds max8鐨勭洰鍓嶇殑璋冭瘯鍣ㄨ繕寰堜笉瀹屽杽錛堜綘涔熷彲浠ョ敤涓戦檵鏉ュ艦瀹癸紝甯屾湜浠ュ悗鐨凪ax鐗堟湰鑳芥妸鑴氭湰璋冭瘯鍣ㄥ仛寰楀ソ鐐癸紝濂藉彲鎯滄垜娌℃湁鐪嬪埌鍦∕AX9璋冭瘯鍣ㄦ湁涓鐐圭偣鐨勫彉鍖栵級銆傝剼鏈皟璇曞櫒铏戒笉鎬庝箞鏍鳳紝浣嗕篃涓嶆槸涓鏃犳槸澶勶紝鑷沖皯浣犲彲浠ュ皯鐢╬rint鍜宖ormat鏉ユ煡鐪嬭繍琛屾椂鍙橀噺鍐呭鍜岃皟璇曡剼鏈?br>銆銆浠ヤ笅鏄垜鍐欎簡涓涓畝鍗曠殑璋冭瘯鑴氭湰錛岃繍琛屽悗褰搃=10鏃朵細鍚姩鑴氭湰璋冭瘯鍣ㄣ?br>global ps=10
for i=0 to 100 do
(
ps = ps + i
銆銆if i==10 do break()
)
鏌ョ湅榪愯鏃舵柇鐐圭殑i鍙橀噺錛屽彲浠ョ偣鍑?鐩戣"鎸夐挳錛岃緭鍏 鐒跺悗鍥炶濺錛屽氨鍙互鐪嬪埌鍙橀噺i鐨勫間負10銆?/p>
宸叉湁澶ч噺浼樼鐨勫熀浜庡杈瑰艦鐨勫湴褰㈡覆鏌撶畻娉曘傛瘮杈冪粡鍏哥殑綆楁硶鏈?/span>M. Duchaineau絳変漢鎻愬嚭ROAM綆楁硶銆傝繖涓畻娉曢噰鐢ㄤ竴媯典笁瑙掍簩鍙夋爲鏉ユ弿榪版暣涓湴褰€備竴涓湴褰㈠湪鏈鍒濈殑灞傛涓婄敱涓や釜杈冨ぇ鐨勭瓑鑵扮洿瑙掍笁瑙掑艦緇勬垚錛岃繖涓や釜絳夎叞鐩磋涓夎褰㈠彲浠ヨ涓嶆柇鍦扮粏鍒嗘潵灞曠幇鍦板艦鐨勬洿澶氱粏鑺傘傛瘡涓嬈$粏鍒嗚繃紼嬮兘鍚戠洿瑙掍笁瑙掑艦鐨勬枩杈圭殑涓偣澶勫鍔犱竴涓敱楂樼▼鏁版嵁鎵鎻忚堪鐨勯《鐐癸紝璇ョ偣灝嗘墍鍦ㄧ殑鐩磋涓夎褰竴鍒嗕負浜岋紝鍚屾椂璇ョ畻娉曚篃瀹氫箟浜嗕竴浜涜鍒欐潵淇濊瘉鍦板艦涓笉浼氬洜鐩擱偦涓や釜涓夎褰㈢粏鑺傚眰嬈$殑涓嶅悓鑰屽嚭鐜拌緙濄傝繖涓畻娉曞凡琚澶氭父鎴忔墍閲囩敤銆傝繕鏈変竴綾葷畻娉曪紝閫氳繃灝嗗湴褰㈠湪X-Z鎶曞獎闈笂涓嶆柇鍦拌鍒欑粏鍒嗘潵寰楀埌涓嶅悓鐨勭粏鑺傦紝榪欏氨鏄湰鏂囪浠嬬粛鐨勫洓鍙夋爲絀洪棿鍒掑垎綆楁硶銆傚彟澶栵紝鏈鏂版彁鍑虹殑涓涓湴褰㈢畻娉曚篃涓嶅緱涓嶆彁錛孒ugues Hoppe鍦?/font>2004騫存彁鍑虹殑鍑犱綍瑁佸壀鍥炬柟娉?Geometry Clipmaps)錛岀畻娉曚嬌鐢ㄤ簡鏈鏂扮‖浠舵墍鏀寔鐨勯《鐐圭汗鐞嗘潵瀹氫箟鍦板艦鐨勫瑙傦紝騫朵笖瀵逛簬璺濈鎽勫獎鏈轟笉鍚岃繙榪戠殑鍦版柟閲囩敤涓嶅悓鐨勭汗鐞嗗眰錛屾渶澶ч檺搴﹀湴浣跨敤紜歡鍔犻熶簡鍦板艦娓叉煋鐨勮繃紼嬨傝繖涓柟娉曞惉璧鋒潵闈炲父緹庡錛屼絾瀹冪洰鍓嶅彧琚緝灝戠殑紜歡鏀寔銆傚洜涓洪《鐐圭汗鐞嗘槸Shader Model 3.0鎵嶆敮鎸佺殑鍔熻兘錛屼篃灝辨槸璇村彧鏈塂irectX 9.0c綰у埆鐨勬樉鍗℃墠鑳芥敮鎸佽繖縐嶇畻娉曘傝繖瀵逛簬鏌愪簺鏈夋櫘鍙婃ц姹傜殑鍥懼艦搴旂敤紼嬪簭錛屽挨鍏舵槸瀵規父鎴忔潵璁蹭笉鏄竴浠跺ソ鐨勪簨鎯呫傚洜姝ゅぇ澶氭暟浜虹幇鍦ㄨ繕鍦ㄤ嬌鐢ㄧ粡鍏哥殑鍦板艦娓叉煋鏂規硶銆?/span>
棣栧厛錛屽熀浜庡洓鍙夋爲鐨勫湴褰㈡覆鏌撴柟娉曚嬌鐢ㄩ珮紼嬫暟鎹綔涓烘暟鎹簮銆備笖綆楁硶瑕佹眰楂樼▼鏁版嵁鐨勫ぇ灝忓繀欏諱負2n+1鐨勬鏂瑰艦銆傛墍璋撻珮紼嬫暟鎹紝鍗寵壊褰╄寖鍥村湪0-255鐨勭伆搴﹀浘鐗囷紝涓嶅悓鐨勭伆搴︿唬琛ㄤ簡涓嶅悓鐨勯珮搴﹀箋傚鏋滄煇楂樼▼鏁版嵁鎸囧嚭榪欎釜楂樼▼鏁版嵁鏈楂樺鐨刌鍧愭爣鍊兼槸4000錛岄偅涔堝湪楂樼▼鏁版嵁涓竴涓間負255鐨勫儚绱犵偣灝辮〃紺鴻繖涓偣鎵浠h〃鐨勫湴褰㈠尯鍩熺殑楂樺害鏄?000錛屽悓鐞嗗鏋滆鍍忕礌鍊兼槸127閭d箞灝辮〃紺鴻繖涓偣鎵浠h〃鐨勫湴褰㈠尯鍩熺殑楂樺害鏄?000×(127/255)=2000銆傞珮紼嬫暟鎹殑姣忎釜鍍忕礌閮藉搴旀墍娓叉煋緗戞牸涓殑涓涓《鐐廣傚彟澶栬繕鏈変竴涓弬鏁版弿榪伴《鐐逛笌欏剁偣涔嬮棿鐨勬按騫寵窛紱伙紝浠ュ強涓涓弿榪版渶澶ч珮搴︾殑鍙傛暟銆傚洜姝ゅ湴褰㈢殑鍩烘湰鏁版嵁緇撴瀯濡備笅錛?/span>
struct Terrain
{
char **DEM; //涓涓弿榪伴珮紼嬫暟鎹殑浜岀淮鏁扮粍
float CellSpace;
float HeightScale;
}
鍏朵腑錛屽悇鍙橀噺鐨勫叿浣撴剰涔夊涓嬪浘鎵紺猴細

鏈変簡榪欎簺鍙傛暟錛屾垜浠彲浠ュ緢瀹規槗鍦扮敱楂樼▼鏁版嵁鐨勫弬鏁板煎緱鍒板畠鎵琛ㄨ堪鐨勫杈瑰艦緗戞牸銆傚緱鍒拌繖涓綉鏍間箣鍚庯紝鍙互綆鍗曞湴鎶婂畠鏀懼叆欏剁偣鏁扮粍錛屽茍涓轟箣寤虹珛涓涓《鐐圭儲寮曪紝灝卞彲浠ヤ紶鍏ョ‖浠惰繘琛屾覆鏌撲簡銆傜劧鑰岋紝浜嬫儏騫朵笉鏄繖涔堢畝鍗曘傚浜庤緝灝忓昂瀵哥殑楂樼▼鏁版嵁(濡?29×129)錛岃繖鏍峰仛紜疄鍙錛屼絾闅忕潃楂樼▼鏁版嵁瑙勬ā鐨勫澶э紝鎵闇鐨勯《鐐規暟鍜屾弿榪扮綉鏍肩殑涓夎褰㈡暟浼氭ュ墽鑶ㄨ儉銆傝繖涓暟鍊煎緢蹇氨浼氬ぇ鍒版渶鏂扮殑鏄懼崱涔熸棤娉曟帴鍙椼傛瘮濡備竴涓?025×1025鐨勯珮紼嬫暟鎹紝鎴戜滑闇瑕?025×1025=1050625涓《鐐癸紝浠ュ強1050625×2=2101250涓笁瑙掑艦銆傚氨綆椾綘鐨勬樉鍗℃瘡縐掕兘澶熸覆鏌?000涓囦釜涓夎褰紝浣犱篃鍙兘寰楀埌涓嶅埌5fps鐨勬覆鏌撻熷害錛屽喌涓斾綘鐨勫満鏅彲鑳借繕涓嶅彧鍖呮嫭鍦板艦銆傚洜姝ゆ垜浠繀欏繪兂鍔炴硶鍦ㄤ笉褰卞搷瑙嗚鏁堟灉鐨勬儏鍐典笅緙╁噺鎵娓叉煋鐨勪笁瑙掑艦鏁伴噺錛屽彟澶栬繕搴旇娉ㄦ剰涓嬈℃у皢鏈澶氱殑鏁版嵁棰勫厛浼犵粰紜歡浠ヨ妭綰﹀甫瀹姐?/span>
榪欓噷瑕佽瑙g殑綆楁硶錛岀洰鐨勫氨鏄湪涓嶅獎鍝嶆垨鍦ㄨ瑙夊彲浠ユ帴鍙楃殑鑼冨洿鍐呯緝鍑忔墍娓叉煋涓夎褰㈢殑鏁伴噺錛屼互杈懼埌瀹炴椂娓叉煋鐨勮姹傘傛牴鎹祴璇曪紝鏈畻娉曞湪婕父澶у皬涓?025*1025鐨勫湴褰㈡椂閫熷害紼沖畾鍦?50fps浠ヤ笂(鍦╪Vidia Geforce 6200 + P4 1.6GHz鐨勭‖浠朵笂寰楀埌)銆?/span>
鐢變簬鍦板艦瑕嗙洊鑼冨洿騫匡紝浣嗗畠鐨勬姇褰卞湪XZ騫抽潰涓婂潎鍖鍒嗗竷(浠ヤ笅閲囩敤OpenGL涓殑鍙蟲墜鍧愭爣緋伙紝Y杞翠負绔栫洿鍚戜笂鐨勫潗鏍囪醬)錛屽洜姝ゆ垜浠湁蹇呰鑰冭檻瀵瑰湴褰㈣繘琛岀┖闂村垝鍒嗐傛鏄敱浜庤繖鏍風殑鍧囧寑鍒嗗竷錛岀粰鎴戜滑鐨勫垝鍒嗚繃紼嬪甫鏉ヤ簡渚垮埄銆傛垜浠笉闇瑕佸叿浣撳湴鍘誨垎鍓叉煇涓笁瑙掑艦錛屽彧瑕侀夋嫨閭d簺榪囬《鐐逛笖鍜孹鎴朲杞村瀭鐩寸殑騫抽潰浣滀負鍒掑垎闈㈠嵆鍙備緥濡傚浜庝竴涓珮紼嬫暟鎹紝鎴戜滑鍙互浠ュ潗鏍囧師鐐逛綔涓哄湴褰㈢殑涓績鐐癸紝鐒跺悗娌跨潃X杞村拰Z杞翠緷嬈″睍寮鏉ュ垎甯冨悇涓《鐐廣傚涓嬪鎵紺恒?/span>

棣栧厛錛屾垜浠彲浠ラ夋嫨X=0鍜孼=0榪欎袱涓鉤闈紝灝嗗湴褰㈠垝鍒嗕負絳夊ぇ鐨勫洓涓尯鍩燂紝鐒跺悗瀵瑰垝鍒嗗嚭鏉ョ殑鍥涗釜瀛愬尯鍩熻繘琛岄掑綊鍒掑垎錛屾瘡嬈″垝鍒嗛兘閫夋嫨浜や簬鍖哄煙涓績鐐瑰茍涓斾簰鐩稿瀭鐩寸殑涓や釜騫抽潰浣滀負鍒掑垎闈紝鐩村埌姣忎釜瀛愬尯鍩熼兘鍙寘鍚竴涓湴褰㈠崟鍏冨潡錛堝嵆涓や釜涓夎褰級鑰屼笉鑳藉啀鍒掑垎涓烘銆備緥濡傚浜庝笂鍥炬墍紺?*9澶у皬鐨勫湴褰㈠潡錛岀粡榪囧垝鍒嗕箣鍚庡涓嬪浘鎵紺猴細

鐢卞浘鍙煡錛屽彧鏈夐珮紼嬫暟鎹弧瓚?cite style="FONT-STYLE: normal">澶у皬2n+1鐨勬鏂瑰艦榪欎釜鏉′歡錛屾垜浠墠鍙兘瀵瑰湴褰㈣繘琛屽潎鍖鍒掑垎銆?/cite>鎴戜滑鍙互鎶婂垝鍒嗙粨鏋滅敤涓媯墊爲鏉ヨ〃榪幫紝鐢變簬姣忔鍒掑垎涔嬪悗浜х敓鍥涗釜瀛愯妭鐐癸紝鍥犳榪欐5鏍戝彨鍥涘弶鏍戙傞偅涔堬紝榪欐5鏍戜腑搴旇瀛樺偍閭d簺淇℃伅鍛紵棣栧厛瀵逛簬姣忎釜鑺傜偣錛屽簲璇ユ寚瀹氳繖涓妭鐐規墍浠h〃鐨勫湴褰㈢殑鍖哄煙鑼冨洿銆傚茍涓嶆槸鎶婂湴褰㈢綉鏍間腑瀹為檯鐨勯《鐐規斁鍏ユ爲涓紝鑰屾槸瑕佸湪鏍戜腑璇存槑榪欎釜鑺傜偣瑕嗙洊浜嗗湴褰㈢殑閭d簺鍖哄煙銆傛瘮濡備竴涓瓙鑺傜偣搴旇鏈変竴涓狢enter(X,Y)鍙橀噺錛屾寚瀹氳繖涓妭鐐圭殑涓績鐐規墍瀵瑰簲鐨勯《鐐圭儲寮曪紝鎴栫紪鍙楓備負浜嗘柟渚胯搗瑙侊紝鍙互鎶婂湴褰腑蹇冪偣緙栧彿涓?0,0)鐒跺悗娌跨潃鍧愭爣杞撮掑銆傛澶栬繕瑕佹湁涓彉閲忔寚瀹氳繖涓妭鐐瑰埌搴曡鐩栦簡鍦板艦鐨勫灝戜釜欏剁偣銆傚涓嬪浘鎵紺恒?/span>

鎴戜滑鐩墠鐨勫洓鍙夋爲鐨勬暟鎹粨鏋勫涓嬶細
struct QuadTreeNode
{
QuadTreeNode *Children[4];
int CenterX,CenterY;
int HalfRange;
}
鏈変簡鍥涘弶鏍戜箣鍚庯紝濡備綍鍒╃敤瀹冪殑浼樺娍鍛紵棣栧厛鎴戜滑鑰冭檻綆鍗曠殑瑙嗚浣撹鍓?View Frustum Culling錛屼互涓嬬畝縐癡FC)銆傜浉淇″緢澶氭帴瑙﹁繃鍩烘湰鍥懼艦浼樺寲鐨勪漢閮藉簲璇ョ啛鎮塚FC錛孷FC鐨勪綔鐢ㄦ棦鏄閭d簺鏄庢樉浣嶄簬鍙騫蟲埅澶翠綋涔嬪鐨勫杈瑰艦鍦ㄦ妸瀹冧滑浼犵粰鏄懼崱涔嬪墠鍓旈櫎鎺夈傝繖涓繃紼嬬敱CPU鏉ュ畬鎴愩傝櫧鐒剁畝鍗曪紝浣嗗畠鍗撮潪甯告湁鏁堛俈FC榪囩▼濡備笅錛?/span>
1.涓烘瘡涓妭鐐硅綆楀寘鍥寸悆銆傚寘鍥寸悆鍙互綆鍗曠殑浠ヤ腑蹇冮《鐐逛負鐞冨績錛屾渶澶у潗鏍囧肩偣(鑺傜偣鎵瑕嗙洊鐨勬墍鏈夐《鐐圭殑鏈澶銆乊銆乑鍊間綔涓烘鐐圭殑鍧愭爣鍊?鍒扮悆蹇冪殑璺濈涓哄崐寰勩?/span>
2.鏍規嵁褰撳墠鐨勬姇褰卞拰鍙樻崲鐭╅樀璁$畻姝ゆ椂鍙騫蟲埅澶翠綋鐨勫叚涓鉤闈㈡柟紼嬨傝繖涓姝ュ彲浠ュ弬鑰傾zure鐨凚log涓婄殑涓綃囨枃绔狅紝榪欑瘒鏂囩珷緇欏嚭浜哣FC鐨勫叿浣撲唬鐮併?a target=_blank>鍗曞嚮榪欓噷銆?/span>
3.浠庢爲鐨勬牴緇撶偣浠ユ繁搴︿紭鍏堢殑欏哄簭閬嶅巻鏍戙傛瘡嬈¤闂妭鐐規椂錛屾祴璇曡鑺傜偣鍖呭洿鐞冧笌瑙嗚浣撶殑鐩鎬氦鎯呭喌銆傚湪涓嬮潰鐨勬儏鍐典笅錛屽寘鍥寸悆涓庤瑙佷綋鐩鎬氦錛?/span>
1) 鐞冨績鍦ㄥ叚涓鉤闈㈡墍鍖呭洿鐨勫嚫鐘跺尯鍩熷唴閮ㄣ?br> 2) 鐞冨績鍦ㄥ叚涓鉤闈㈡墍鍖呭洿鐨勫嚫鐘跺尯鍩熷閮紝浣嗙悆蹇冨埌鏌愪釜騫抽潰鐨勮窛紱誨皬浜庡崐寰勩?/span>
4.濡傛灉鐩鎬氦嫻嬭瘯鏄劇ず鍖呭洿鐞冨拰瑙嗚浣撳瓨鍦ㄤ氦闆嗭紝緇х畫閫掑綊閬嶅巻姝よ妭鐐圭殑4涓瓙鑺傜偣錛屽鏋滄鑺傜偣宸茬粡鏄彾鑺傜偣錛屽垯榪欎釜鑺傜偣搴旇緇樺埗銆傚鏋滀笉瀛樺湪浜ら泦錛屾斁寮冭繖涓妭鐐癸紝瀵逛簬榪欎釜鑺傜偣鐨勬墍鏈夊瓙鑺傜偣涓嶅啀閫掑綊媯鏌ャ傚洜涓哄鏋滀竴涓妭鐐逛笉鍙錛岄偅涔堝叾瀛愯妭鐐逛竴瀹氫笉鍙銆?/span>
榪欐牱錛屾垜浠墧闄や簡閭d簺涓嶅湪瑙嗚浣撳唴鐨勫湴褰㈠尯鍩燂紝鑺傜害浜嗕竴浜涜祫婧愩備絾榪欒繕涓嶅銆傚湪鏌愪簺鎯呭喌涓嬶紝VFC鍙兘榪樹細鎸囧嚭鏁翠釜鍦板艦閮藉彲瑙侊紝鍦ㄨ繖縐嶆儏鍐典笅錛屽皢榪欎箞澶氫笁瑙掑艦閮界敾鍑烘樉鐒舵槸涓嶅彲鍙栫殑銆?/span>
鍥犳榪樿鑰冭檻鍦板艦鐨勭粏鑺傚眰嬈?LOD)銆傛垜浠簲璇ヨ冭檻鍒幫紝鍦板艦涓嶅彲鑳芥墍鏈夐儴鍒嗛兘涓鏍峰鉤鍧︽垨闄″抄銆傚浜庡鉤鍧︾殑閮ㄥ垎錛屾垜浠敤榪囧鐨勪笁瑙掑艦鍘繪弿榪版槸娌℃湁鎰忎箟鐨勩傝屽浜庤搗浼忕▼搴﹁緝澶х殑鍖哄煙錛屽彧鏈夎緝澶氱殑涓夎褰㈡暟閲忔墠涓嶈浜烘劅鍒板皷閿愮殑媯辮銆傚啀鑰咃紝鏃犺鍦板艦璧蜂紡紼嬪害濡備綍錛岄偅浜涜窛紱昏鐐瑰緢榪滅殑鍖哄煙錛屼篃娌℃湁蹇呰鑺辮垂澶鐨勮祫婧愬幓娓叉煋錛屾瘯绔熷畠浠姇褰卞埌灞忓箷涓婄殑闈㈢Н寰堝皬錛屽鍏惰繘琛岀畝鍖栦篃鏄繀瑕佺殑銆?/span>
鏃㈢劧鎴戜滑瑕佸璧蜂紡紼嬪害涓嶅悓鐨勫尯鍩熼噰鐢ㄤ笉鍚岀殑緇嗚妭綰у埆錛屾垜浠鍏堝繀欏繪壘鍒頒竴縐嶆弿榪板湴褰㈣搗浼忕▼搴︾殑閲忋備笌鍏惰璧蜂紡紼嬪害錛屼笉濡傝鏄湴褰㈢殑鏌愪釜欏剁偣鍥犱負琚畝鍖栧悗鑰屼駭鐢熺殑璇樊銆傝璁$畻榪欎釜璇樊錛屾垜浠厛瑕佷簡瑙e湴褰㈡槸濡備綍琚畝鍖栫殑銆?/span>
鑰冭檻涓嬪浘鎵紺虹殑鍦板艦鍧楋紝瀹冪殑娓叉煋緇撴灉濡備笅鍥懼彸鍥炬墍紺恒?/span>

鐜板湪濡傛灉瑕佸鎵闇娓叉煋鐨勪笁瑙掑艦榪涜綆鍖栵紝鎴戜滑鍙互鑰冭檻榪欎釜鍦板艦鍧楁瘡鏉¤竟涓棿鐨勯《鐐?涓嬪浘宸︿晶綰㈣壊鐐?錛?/span>

濡傛灉灝嗚繖浜涚孩鑹茬殑欏剁偣鍓旈櫎錛屾垜浠彲浠ュ緱鍒頒笂鍥懼彸杈規墍紺虹殑綆鍖栧悗鐨勭綉鏍箋傝宸氨鍦ㄨ繖涓姝ヤ駭鐢熴傜敱浜庣孩鑹茬殑欏剁偣琚墧闄ゅ悗錛屽師鏈敱綰㈣壊欏剁偣鎵琛ㄧず鐨勫湴褰㈤珮搴︾幇鍦ㄥ彉鎴愪簡涓や晶榛戣壊欏剁偣鎻掑煎悗鐨勯珮搴︺傝繖涓珮搴﹀氨鏄宸傚涓嬪浘銆?/span>

鍥犳錛屽浜庢瘡涓妭鐐癸紝鎴戜滑鍏堣綆楄繖涓妭鐐規墍鏈夎竟涓偣琚垹闄ゅ悗鎵閫犳垚鐨勮宸紝鍒嗗埆璁頒負ΔH1, ΔH2, ΔH3, ΔH4銆傚鏋滆繖涓妭鐐瑰寘鍚瓙鑺傜偣錛岄掑綊璁$畻瀛愯妭鐐圭殑璇樊錛屽茍鎶婂洓涓瓙鑺傜偣鐨勮宸涓?#916;Hs1, ΔHs2, ΔHs3, ΔHs4銆傝繖涓妭鐐圭殑璇樊灝辨槸榪欏叓涓宸間腑鐨勬渶澶у箋傜敱浜庤繖鏄竴涓掑綊鐨勮繃紼嬶紝鍥犳搴旇鎶婅繖涓繃紼嬪姞鍒板洓鍙夋爲鐨勭敓鎴愯繃紼嬩腑錛屽茍鍚戝洓鍙夋爲鐨勬暟鎹粨鏋勪腑鍔犲叆涓涓宸彉閲忋傚涓嬨?/span>
struct QuadTreeNode
{
QuadTreeNode *Children;
int CenterX,CenterY;
int HalfRange;
float DeltaH; //鑺傜偣璇樊鍊?br> }
涓嬮潰鏉ョ湅涓涓嬪湴褰㈢殑鍏蜂綋娓叉煋榪囩▼銆?/span>
棣栧厛錛屾垜浠綅浜庡洓鍙夋爲鐨勬牴緇撶偣銆傛垜浠鏃惰冭檻鏍圭粨鐐圭殑璇樊錛屽鏋滆繖涓宸皬浜庝竴涓槇鍊鹼紝鐩存帴浣跨敤鏍圭粨鐐圭殑涓績鐐逛互鍙婃鑺傜偣鐨勫洓涓竟瑙掔偣浣滀負欏剁偣娓叉煋涓涓笁瑙掓墖褰紝榪欎釜涓夎鎵囧艦灝辨槸娓叉煋鍑烘潵鐨勫湴褰€備絾鏄洿緇忓父鐨勬儏鍐典笅錛屾牴緇撶偣鐨勮宸兼槸寰堝ぇ鐨勶紝鍥犳綆楁硶璁や負瑕佸鏍圭粨鐐硅繘琛岀粏鍒嗭紝浠ュ睍鐜版洿澶氱粏鑺傘備簬鏄浜庢牴緇撶偣鐨勬瘡涓瓙鑺傜偣錛岄噸澶嶈繖涓楠わ紝鍗蟲鏌ュ畠鐨勮宸兼槸鍚﹀ぇ浜庨槇鍊鹼紝濡傛灉澶т簬錛岀洿鎺ユ覆鏌撹繖涓妭鐐癸紝濡傛灉灝忎簬錛岄掑綊緇嗗垎鑺傜偣銆傜洰鍓嶆垜浠殑綆楁硶浼唬鐮佸涓嬨?/span>
procedure DrawTerrain(QuadTreeNode *node)
{
if (node->DeltaH > k)
{
for (i=0;i<4;i++)
{
DrawTerrain(node->Children[i]);//閫掑綊鍒掑垎
}
}
else
{
GraphicsAPI->DrawPrimitive(node);//浠ヨ妭鐐圭殑涓績鐐瑰拰鍥涗釜杈硅鐐圭粯鍒朵笁瑙掓墖褰?
}
}
榪欎釜浼唬鐮佸湪涓涓緝楂樼殑灞傛涓婅〃榪頒簡綆楁硶鐨勫熀鏈濇兂銆傜劧鑰屾垜浠繕鏈夎澶氶棶棰樿鑰冭檻銆傚叾涓鏄洰鍓嶆垜浠粎浠呰冭檻浜嗗湴褰㈢殑緇嗚妭灞傛鍜屽湴褰㈣〃闈㈣搗浼忕▼搴︾殑鍏崇郴錛屼絾榪樺簲璇ヨ冭檻鍦板艦鍧楄窛紱昏鐐硅繙榪戣窡鍦板艦緇嗚妭灞傛鐨勫叧緋匯傝В鍐寵繖涓棶棰樺緢綆鍗曪紝鎴戜滑鍙渶鍦ㄤ吉浠g爜鐨勬潯浠朵腑鍔犲叆璺濈榪欎竴鍥犵礌鍗沖彲銆傚嵆鎶?/span>
if (node->DeltaH > k)
{
...
}
else ...
鏀逛負錛?/span>
if (node->DeltaH / d > k)
{
...
}
else ...
鍏朵腑d涓鴻妭鐐逛腑蹇冪偣涓庤鐐逛箣闂寸殑璺濈銆傝屼簨瀹炰笂錛屽綋緇嗚妭紼嬪害涓庤窛紱葷殑騫蟲柟鎴愬弽姣旀椂錛岃兘澶熷噺灝戞洿澶氱殑涓夎褰紝鑰屼笖瑙嗚鏁堟灉鏇村ソ錛屽彧瑕侀槇鍊糼璁劇疆寰楀綋錛屾牴鏈劅瑙変笉鍑哄湴褰㈠洜涓鴻鐐圭殑縐誨姩鑰屽彂鐢熷嚑浣曞艦鍙樸傚洜姝わ紝鎴戜滑鏈緇堢殑鏉′歡寮忎負錛?/span>
node->DeltaH / d2 > k
榪樻湁涓涓緢閲嶈鐨勯棶棰橈紝灝辨槸榪欎釜綆楁硶鎵浜х敓鐨勫湴褰細鍥犱負鑺傜偣涔嬮棿緇嗚妭灞傛鐨勪笉鍚岃屼駭鐢熻緙濄備笅鍥捐鏄庝簡瑁傜紳鐨勪駭鐢熷師鍥犮?/span>

鏈変袱涓柟娉曞彲浠ヨВ鍐寵繖涓棶棰橈紝涓涓柟娉曟槸鍒犻櫎宸︿晶鑺傜偣涓駭鐢熻緙濈殑欏剁偣錛屼嬌涓ゆ潯杈硅兘澶熼噸鍚堛傚彟涓縐嶆柟娉曟槸浜轟負鍦板湪鍙充晶鍦板艦鍧椾腑鎻掑叆涓鏉¤竟錛岃繖鏉¤竟榪炴帴涓績鐐瑰拰閫犳垚瑁傜紳鐨勯《鐐癸紝浠庤屾秷闄よ緙濄傚湪娓叉煋鍦板艦鏃訛紝鍙互閲囧彇涓嬮潰鐨勫姙娉曢伩鍏嶈緙濈殑浜х敓錛?/span>
1.鍦ㄩ澶勭悊闃舵錛屼負鎵鏈夐《鐐瑰垱寤轟竴涓爣璁版暟緇勶紝鏍囪浠ヨ欏剁偣涓轟腑蹇冪偣鐨勮妭鐐瑰湪鏌愪竴甯ф槸鍚﹁緇嗗垎銆傚鏋滆緇嗗垎鍒欐爣璁頒負1錛屽惁鍒欐爣璁?銆?/span>
2.浠庢牴鑺傜偣寮濮嬶紝浠ュ箍搴︿紭鍏堢殑欏哄簭閬嶅巻鍥涘弶鏍戯紝浣跨敤涔嬪墠鎻愬嚭鐨勬潯浠跺紡鍒ゆ柇鑺傜偣鏄惁闇瑕佸垎鍓層傚鏋滃叕寮忚〃鏄庨渶瑕佸垎鍓詫紝騫朵笖涓庤妭鐐圭浉閭葷殑鍥涗釜鑺傜偣鐨勪腑蹇冪偣閮借鏍囪涓?錛岄偅涔堟妸榪欎釜鑺傜偣鍙婂叾鍥涗釜瀛愯妭鐐圭殑鏍囪璁句負1錛屽茍閫掑綊緇嗗垎榪欎釜鑺傜偣銆傚惁鍒欙紝灝嗚繖涓妭鐐圭殑鏍囪璁句負1錛屾妸榪欎釜鑺傜偣鐨勫洓涓瓙鑺傜偣鐨勬爣璁拌涓?錛岀劧鍚庨噰鐢ㄤ笅闈㈢殑鏂規硶緇樺埗榪欎釜鍦板艦鍧楋細
1)灝嗚妭鐐圭殑涓績欏剁偣鍜屽洓涓竟瑙掔偣娣誨姞鍒板嵆灝嗙粯鍒剁殑涓夎鎵囧艦鍒楄〃涓?br> 2)渚濇媯鏌ヤ笌鍥涙潯杈圭浉閭葷殑鑺傜偣鐨勬爣璁版暟緇勶紝濡傛灉鐩稿簲鐨勬爣璁頒負1錛岄偅涔堝皢璇ョ偣娣誨姞鍒頒笁瑙掓墖褰㈢殑欏剁偣鍒楄〃涓紝鍚﹀垯璺寵繃璇ョ偣銆?br> 3)緇樺埗涓夎鎵囧艦銆?/span>
鎴戜滑鏈緇堢殑浼唬鐮佸涓嬨?/span>
|
bool IsNodeInFrustum(QuadTreeNode *node) { return (node->BoudingSphere in frustum); } bool NeighbourIsValid(QuadTreeNode *node) { return (all four neighbours of node are identified as 1) } void RenderTerrain() { list<QuadTreeNode *>next,current,draw; int level =0; { for each thisNode in current { if (thisNode->DeltaH/(distance*distance) > k && NeighbourIsValid(thisNode) ) { SetFlag(thisNode,1); for j= 1 to 4 { next.push_back(thisNode->Children[j]); SetFlag(thisNode->Children[j],1) } } else { SetFlag(thisNode,1); for j= 1 to 4 { draw.push_back(thisNode->Children[j]); SetFlag(thisNode->Children[j],0); } } } SwapList(current,next); level++; } GraphicsAPI->DrawPrimitives(draw); } |
鍙﹀錛屼竴涓噸瑕佺殑浼樺寲鏄埄鐢ㄧ‖浠剁殑緙撳啿鍖烘垨欏剁偣鏁扮粍(瀵逛簬涓嶆敮鎸侀《鐐圭紦鍐茬殑紜歡鑰岃█)銆傚洜涓哄湴褰㈡棤璁烘庢牱綆鍖栵紝欏剁偣鏁版嵁鎬繪槸鍥哄畾涓嶅彉鐨勩傛垜浠湪姣忎竴甯у姩鎬佷駭鐢熺殑浠呬粎鏄《鐐圭儲寮曪紝鍥犳鎴戜滑鏈夊繀瑕佸疄鐜板皢鍦板艦鐨勬墍鏈夐《鐐規暟鎹緭鍏ュ埌欏剁偣緙撳啿涓紝鐒跺悗鍦ㄦ覆鏌撴椂涓嬈℃у皢鎵鏈夌殑绱㈠紩浼犵粰鏄懼崱錛屼互鎻愰珮閫熷害銆傚疄楠岃〃鏄庯紝浣跨敤欏剁偣緙撳啿姣旂洿鎺ヤ嬌鐢╣lBegin/glEnd緇樺埗鍥懼艦瑕佸揩5鍊嶄互涓娿?/span>
浠ヤ笂璁茶堪浜嗗浣曞仛鍒板疄鏃跺湴娓叉煋澶у瀷鍦板艦銆備富瑕佸簲鐢ㄤ簡LOD鍜孷FC涓ょ鎵嬫鏉ョ簿綆涓夎褰㈡暟閲忋傜劧鑰孷FC鍙兘鍓旈櫎涓嶅湪瑙嗚浣撳唴鐨勫浘褰紝鑰屽浜庡湪瑙嗚浣撳唴浣嗚鍏朵粬鏇磋繎鐨勭墿浣撻伄鎸$殑鎯呭喌鍗存棤鑳戒負鍔涖傚鏋滆瀹炵幇鍦板艦鐨勮嚜閬尅鍓旈櫎錛屽湴騫崇嚎綆楁硶鏄竴涓ソ鐨勯夋嫨銆傜劧鑰屽綋浣犵殑鍦烘櫙涓嶄粎浠呮槸鍖呭惈鍦板艦鏃訛紝鍦板鉤綰跨畻娉曚篃鍙兘澶勭悊鍦板艦鐨勮嚜閬尅鎯呭喌銆傚洜涓哄湴騫崇嚎綆楁硶鍙2.5D鐨勫湴鍥?鍗沖湪XZ騫抽潰涓婃棤閲嶅悎鎶曞獎鐨勫満鏅?鏈夋晥銆傚浜庡畬鍏?D鍦烘櫙錛屽湴騫崇嚎騫朵笉鑳藉緢濂界殑宸ヤ綔銆傛墍浠ュ綋浣犲湪寮曟搸涓嬌鐢ㄥ湴褰㈡椂錛屽彲浠ヨ冭檻灝嗗湴褰㈠垎鍧楀悗鏀懼叆鍦烘櫙鐨勭鐞嗘爲涓紝濡侭SP鎴朞ctree絳夈傜劧鍚庢牴鎹紩鎿庣殑鎬ц川浣跨敤鍏ュ彛(Portal)銆丳VS鎴栬呴伄鎸℃祴璇?Occlusion Culling)絳夋柟娉曡繘琛岄伄鎸″墧闄ゃ傚煎緱寮鴻皟鐨勬槸錛岄伄鎸℃祴璇曟槸涓涓潪甯哥伒媧葷殑瀹炴椂鐨勫墧闄ょ畻娉曪紝涓旀棤闇浠諱綍棰勮綆楄繃紼嬨備絾瑕佹兂鏈夋晥鐨勫疄鐜板畠騫朵笉鏄竴浠跺鏄撶殑浜嬨傛垜鏇懼皢鍦板艦鍒嗗潡鍚庝嬌鐢ㄩ伄鎸″墧闄ゆ潵瀹屾垚鍦板艦鐨勮嚜閬尅錛屼絾鏄覆鏌撻熷害涓嶄絾娌℃湁鎻愬崌錛屽弽鑰屾湁杞誨井鐨勪笅闄嶃傚洜姝ゅ鏋滆浣跨敤閬尅鍓旈櫎鐨勮瘽蹇呴』鍜屽紩鎿庣粨鍚堣搗鏉ョ粺涓榪涜閬尅嫻嬭瘯錛屾墠鏈夊彲鑳芥彁楂樻晥鐜囥?/span>
鐜板湪浣犲簲璇ヤ簡瑙d簡鍩烘湰鐨勫湴褰㈠疄鏃舵覆鏌撴柟娉曘傝鎯寵鍦板艦鐨勫瑙傛洿鍔犵湡瀹烇紝鎴戜滑榪橀渶瑕佹洿澶氱殑宸ヤ綔銆傛垜浠渶瑕佷負鍦板艦鍔犱笂綰圭悊璐村浘鍜屽厜鐓с傞鍏堣冭檻鍦板艦鐨勫厜鐓с傜敱浜庡湴褰㈢殑澶氳竟褰㈢綉鏍兼槸瀹炴椂浜х敓鐨勶紝瀹冧細闅忕潃瑙嗙偣鐨勭Щ鍔ㄨ屽彉鍖栵紝鍥犳濡傛灉浣犵洿鎺ヤ嬌鐢∣penGL鍐呯疆鐨勯《鐐瑰厜鐓э紝浣犱細寰楀埌鏋佸害涓嶇ǔ瀹氱殑鍏夌収鏁堟灉銆備綘浼氱湅鍒板湴褰㈣〃闈細鍥犱負浣犵殑縐誨姩鑰屼笉鏂煩鍔ㄣ傚洜姝ゆ垜浠繀欏諱嬌鐢ㄥ叾浠栫殑鍏夌収鏂規硶鏉ラ伩鍏嶈繖涓棶棰樸傛垜浠兂鍒頒簡鍏夌収璐村浘銆傚厜鐓ц創鍥炬槸涓涓父鎴忎腑甯哥敤鐨勫厜鐓ф妧鏈傚畠鏄竴涓鐩栦簡鍦烘櫙涓墍鏈夊杈瑰艦鐨勮創鍥俱傞氳繃緇欒創鍥捐祴鍊鹼紝鎴戜滑鍙互寰楀埌澶氳竟褰㈣〃闈㈠鏉傜殑鍏夌収鏁堟灉銆備嬌鐢ㄥソ鐨勭畻娉曡綆楀嚭鏉ョ殑鍏夌収璐村浘鍙互妯℃嫙鏋佸害閫肩湡鐨勫厜褰辨晥鏋溿傚畠緇欐垜浠甫鏉ョ殑瑙嗚浜彈榪滆繙鍦拌秴榪囦簡OpenGL鐨勫唴緗厜鐓с傛湁鍏沖厜鐓ц創鍥劇殑璁$畻鍙互鍙傝冩垜緲昏瘧鐨勪竴綃囨枃绔狅細杈愬皠搴︾畻娉?Radiosity)

浣犲彲浠ョ畝鍗曞湴涓哄湴褰㈣鐩栦笂鍗曚竴鐨勭汗鐞嗭紝榪欑湅璧鋒潵浜涜澧炲姞浜嗗湴褰㈢殑鐪熷疄鎬э細

鍦ㄤ笂鍥句腑錛屾垜浠垱寤轟簡涓涓湴褰紝騫惰繍鐢ㄤ簡涓涓噸澶嶇殑綰圭悊銆傝繖涓繃紼嬭鍦板艦鐨勬棤璁哄摢涓涓尯鍩熺湅璧鋒潵閮芥槸涓鏍風殑錛堜緥濡傞兘鏄崏鍦幫級銆傝繖鏄劇劧涓嶅お鐪熷疄錛屼篃榪囦簬涔忓懗銆傛垨璁鎬綘浼氬垱寤轟簡涓騫呰秴澶х殑鍥劇墖錛屼互鎷変幾瑕嗙洊鐨勬柟寮忔槧灝勫埌鍦板艦琛ㄩ潰銆傝繖鏍峰仛鐨勫悗鏋滄槸鍐呭瓨寮閿榪囦簬搴炲ぇ錛岃繖鏍峰仛涔熷緢浼氬彈鍒扮‖浠剁殑闄愬埗銆傚洜姝ゆ垜浠簲璇ヤ嬌鐢ㄤ竴縐嶆洿濂界殑綰圭悊璐村浘鏂瑰紡錛岀汗鐞嗙儲寮曡創鍥俱?/span>
綰圭悊绱㈠紩璐村浘瀵逛笁涓彲閲嶅鐨勭汗鐞嗚繘琛岀儲寮曡創鍥俱傛墍璋撶儲寮曡創鍥撅紝灝辨槸瀵逛笁涓彲閲嶅綰圭悊榪涜绱㈠紩錛屼互鍐沖畾鍦板艦鐨勫摢浜涘尯鍩熼渶瑕佷嬌鐢ㄥ摢浜涚汗鐞嗙殑娣峰悎鏉ヨ創鍥俱傚洜涓哄浜庝換鎰忕殑璐村浘錛岄兘鐢變竴緇勫寘鍚?涓鑹查氶亾錛堝嵆R銆丟銆丅錛夌殑鍍忕礌緇勬垚銆傜敤浜庣儲寮曠殑璐村浘鐨勫儚绱犲茍涓嶈〃紺哄湴褰㈢殑鏌愪釜鍖哄煙鐨勫叿浣撻鑹詫紝鑰屾槸琛ㄧず鍦板艦鐨勬煇涓尯鍩熺敤浣曠鍏蜂綋鐨勭汗鐞嗚創鍥俱傚洜涓哄叿浣撶殑綰圭悊緇嗚妭瀛樺偍鍦ㄨ繖涓変釜鍙噸澶嶇殑綰圭悊涓紝鍥犳绱㈠紩璐村浘鐨勮創鍥炬柟寮忎篃涓烘媺浼稿埌鍦板艦琛ㄩ潰錛屼絾瀹冪殑鍒嗚鯨鐜囧彲浠ュぇ澶ч檷浣庛?/span>
綰圭悊绱㈠紩璐村浘鐨勫伐浣滄柟寮忓涓嬶細瀵逛簬鍦板艦鎶曞獎鍒板睆騫曚笂鐨勫儚绱狅紝鏌ユ壘璇ュ儚绱犳墍鏄犲皠鍒扮儲寮曡創鍥句笂鐨勫儚绱犮傜劧鍚庢牴鎹繖涓鍍忕礌R銆丟銆丅鍒嗛噺鐨勪笉鍚岋紝鍐沖畾R銆丟銆丅鍒嗛噺鎵浠h〃鐨勫叿浣撶汗鐞嗚創鍥劇殑娣峰悎鍥犲瓙銆傛牴鎹繖涓販鍚堝洜瀛愭販鍚堜笁涓彲閲嶅璐村浘鍚庯紝灝嗘販鍚堝緱鍒扮殑鏈緇堥鑹插艱緭鍑哄埌灞忓箷涓娿?/span>
渚嬪錛屼護绱㈠紩璐村浘鐨凴鍒嗛噺浠h〃娌欐嘩鐨勭汗鐞嗭紝G鍒嗛噺浠h〃鑽夊湴錛孊鍒嗛噺浠h〃宀╃煶銆傚鏋滅儲寮曡創鍥句笂涓涓儚绱犵殑鍊兼槸(0,255,0)錛屽嵆緇胯壊錛屽垯榪欎釜鍍忕礌鎵瀵瑰簲鐨勫湴褰㈠尯鍩熺殑鍏蜂綋綰圭悊灝變負鑽夊湴銆傚鏋滆鍍忕礌棰滆壊鍊兼槸(127,127,0)錛屽嵆榛勮壊錛屽垯璇ュ儚绱犳墍瀵瑰簲鐨勫湴褰㈠尯鍩熺殑綰圭悊涓鴻崏鍦板拰娌欐嘩鐨勬販鍚堬紝鐪嬭搗鏉ユ棦鏈夎崏錛屽張鏈夋矙銆傚張濡備笅鍥炬樉紺轟簡涓涓牱鏈儲寮曡創鍥撅紝浠ュ強浣跨敤璇ヨ創鍥劇儲寮曠汗鐞嗕箣鍚庣殑娓叉煋鏁堟灉銆?/span>
|
|
|
|
绱㈠紩璐村浘錛圧=娌欐嘩錛孏=鑽夊湴,B=宀╃煶錛?/span> |
娓叉煋鏁堟灉 |
鍘熺悊寰堢畝鍗曪紝涓嬮潰璁茶В涓涓嬪叿浣撶殑瀹炵幇榪囩▼銆傞鍏堬紝鎴戜滑鍑嗗4涓汗鐞嗭紝鍏朵腑1涓汗鐞嗙儲寮曡創鍥撅紝瀹冨皢琚媺浼歌鐩栨暣涓湴褰紝鐒跺悗3寮犵粏鑺傝創鍥撅紝騫跺皢瀹冧滑緇戝畾鍒扮浉搴旂殑綰圭悊閫氶亾涓娿傜劧鍚庝嬌鐢╒ertex Shader涓烘瘡涓《鐐硅嚜鍔ㄨ綆楃儲寮曡創鍥劇殑綰圭悊鍧愭爣錛屽湪Fragment Shader閲岋紝瀵圭儲寮曡創鍥捐繘琛岀汗鐞嗘煡鎵撅紝浣跨敤鏌ユ壘寰楀埌鐨勯鑹插肩殑RGB棰滆壊淇℃伅娣峰悎3寮犵粏鑺傝創鍥撅紝寰楀埌褰撳墠鍍忕礌鐨勯鑹層傛渶鍚庤繕搴旇鎶婅繖涓鑹插拰鍏夌収璐村浘涓殑鍊肩浉涔橈紝寰楀埌鏈緇堢殑緇撴灉銆備笅闈㈡槸鐩稿叧鐨凷hader浠g爜錛屼嬌鐢℅LSL緙栧啓銆?/span>
| Vertex Shader:
uniform float TexInc; //綰圭悊緙╂斁鍊?鐢ㄤ簬鏌ユ壘绱㈠紩綰圭悊 |
| Fragment Shader:
uniform sampler2D IndexMap; |
鏈鍚庯紝濡傛灉浣犲鏈枃鏈変笉瑙d箣澶勶紝嬈㈣繋鍜屾垜鍏卞悓璁ㄨ銆?/span>