锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产精品呻吟,国产精品久久久久久久一区探花,久久国产免费http://www.shnenglu.com/flashboy/archive/2009/12/05/102609.htmlRedLightRedLightSat, 05 Dec 2009 09:36:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/12/05/102609.htmlhttp://www.shnenglu.com/flashboy/comments/102609.htmlhttp://www.shnenglu.com/flashboy/archive/2009/12/05/102609.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/102609.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/102609.html鏈榪戞垜琚畨鎺掑埌涓涓皬緇勪腑錛屽仛鐨勯」鐩槸涓涓綋鎰熸父鎴忥紝涔嬪墠鑰冭檻榪囩敤ogre寮婧愬紩鎿庢潵鍋氾紝鍙儨鎴戝榪欎笢瑗垮張涓嶇啛鐨勶紝鍚漢瀹惰榪樿鐢ㄧ涓夋柟綾誨簱CEGUI, 榪樿閰嶇疆涓浜涗笢瑗匡紝涓鍚ご閮藉ぇ浜嗭紝鍏夊涔犵悊鎯抽兘鐢ㄥ崐涓湀浜嗭紝鎴戜滑鐨勫伐紼嬪彧緇欎袱涓湀鐨勬椂闂達紝鍞夊憖錛佺畻浜嗗惂錛岃嚜宸變笉鏄繕鏈変簺涔變竷鍏碂鐨勪唬鐮佸彲鐢ㄥ悧錛熺嫚涓嬪喅蹇冿紝鍐沖畾騫插畠涓鎶婏紒鍝曡緵鑻︿竴鐐癸紝鍋氫笅鏉ヤ竴涓父鎴忓紩鎿庝互鍚庡氨瀹規槗騫蹭簨浜嗐?br>緇忚繃鍜屽彟澶栦竴涓悓浜嬩袱涓湀鐨勬椂闂村鏂楋紝涓璺腑铏借閬囧埌浜涘洶闅撅紝涔熷父鍔犵彮鐨勶紝欏圭洰緇堜簬涔熷仛瀹屼簡銆?br>




涓涓父鎴忓紩鎿庡師鍨嬪熀鏈泲鐢熶簡錛屾垜浠懡鍚嶅畠涓?RedLight錛屽畠鍩烘湰瀹炵幇浜?br>
(0) Win32紼嬪簭娓叉煋妗嗘灦
(1) UI鐨勫熀鏈秷鎭氦浜掓祦紼嬶紝XML紿椾綋閰嶇疆綆$悊錛孶I鐨偆閰嶇疆綆$悊錛屽熀鏈殑UI鎺т歡搴擄紝澶氬垎杈╃巼鏃犵紳UI鎷煎浘
(2) 瀹ゅ鍦烘櫙綆$悊
(3) 鎽勭浉鏈鴻礬寰勬憚鍍?br>(4) 3D Max8妯″瀷鍙婇楠煎姩鐢誨鍑烘彃浠?br>(5) 妯″瀷娓叉煋, 鍏抽敭甯у姩鐢誨強楠ㄩ鍔ㄧ敾鎺у埗
(6) 鍩烘湰鐨勬按闈㈠弽灝勬晥鏋?br>(7) 綆鍗曠殑闈㈢矑瀛愮郴緇?br>(8) 澹伴煶鎺у埗鎺ュ彛

榪欐槸涓涓崟鏈烘父鎴忓紩鎿庣殑鍘熷瀷錛屽姛鑳芥湁闄愶紝浣嗗畠鎬葷畻涓嶈頸浣垮懡瀹屾垚浜嗕竴涓」鐩簡錛屼互鍚庡啀鎵╁睍浣垮畠鏃ョ泭寮哄ぇ鍚э紒

RedLight 2009-12-05 17:36 鍙戣〃璇勮
]]>
BigWorld寮曟搸鍒濊瘑澶цhttp://www.shnenglu.com/flashboy/archive/2009/11/14/100914.htmlRedLightRedLightSat, 14 Nov 2009 05:16:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/11/14/100914.htmlhttp://www.shnenglu.com/flashboy/comments/100914.htmlhttp://www.shnenglu.com/flashboy/archive/2009/11/14/100914.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/100914.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/100914.html闃呰鍏ㄦ枃

RedLight 2009-11-14 13:16 鍙戣〃璇勮
]]>
D3D涓嶰penGL甯哥敤API瀵硅瘧http://www.shnenglu.com/flashboy/archive/2009/11/14/100912.htmlRedLightRedLightSat, 14 Nov 2009 04:49:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/11/14/100912.htmlhttp://www.shnenglu.com/flashboy/comments/100912.htmlhttp://www.shnenglu.com/flashboy/archive/2009/11/14/100912.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/100912.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/100912.html浣滀負涓涓?D紼嬪簭鍛? 鎴戠敤浜哋penGL涓ゅ勾澶? 鏈榪戝湪鎼炰竴涓」鐩? 浠嶰penGL杞埌D3D, 铏界劧宸ョ▼澶栧湪鐨勬鏋墮兘灝佽寰椾笉閿? 浣嗘兂瀹屽叏鍦頒粠OpenGL杞崲鍒癉3D, 鐪嬭搗鏉ヨ繕鏄湁闅懼害鐨? 鑺變簡鎴戜袱涓槦鏈熺殑鏃墮棿, 鎴戠粓浜庤漿鎹㈣繃鏉ヤ簡銆?br>D3D涓嶰penGL鐨勫嚑鐐規瘮杈冩槑鏄句笉鍚岀殑鍦版柟:
(涓)銆佹浜ゆ姇褰辨椂錛歄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> 



RedLight 2009-11-14 12:49 鍙戣〃璇勮
]]>
D3D甯哥敤APIhttp://www.shnenglu.com/flashboy/archive/2009/09/17/96536.htmlRedLightRedLightThu, 17 Sep 2009 07:55:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/09/17/96536.htmlhttp://www.shnenglu.com/flashboy/comments/96536.htmlhttp://www.shnenglu.com/flashboy/archive/2009/09/17/96536.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/96536.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/96536.htmlD3DAPI澶у叏錛屽叏閮ㄥ嚱鏁?/h4>

//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  涓栫晫鍙樻崲



RedLight 2009-09-17 15:55 鍙戣〃璇勮
]]>
D3d9鐨勪竴浜涙洿鏂?(杞?http://www.shnenglu.com/flashboy/archive/2009/09/12/96003.htmlRedLightRedLightSat, 12 Sep 2009 07:40:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/09/12/96003.htmlhttp://www.shnenglu.com/flashboy/comments/96003.htmlhttp://www.shnenglu.com/flashboy/archive/2009/09/12/96003.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/96003.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/96003.html
鐢變簬Aug 8閫犳垚鐨凞3D9鎭愭儳鐥囧凡緇忓畬鍏ㄦ秷闄や簡錛岃繖涓绔犲皢浼氱粰澶у浠嬬粛灝?D寮曟搸杞悜D3D9鐨勫悇涓柟闈紝鍖呮嫭緇堜簬鍑虹幇鐨勫叏灞忓箷妯″紡銆備粠榪欑珷浠ュ悗錛屾垜灝嗕嬌鐢―3D9浣滀負璁茶В鐨勮璦緇х畫D2D鏁欑▼銆?br>
銆怬P緇撴潫錛屽紑濮嬫鐗囥?br>
銆嶹hy錛熴?br>
銆銆浼拌澶у棣栧厛瑕侀棶鐨勫氨鏄?#8220;Why錛?#8221;涓轟粈涔堣鍓嶈繘鍒癉3D9錛熺悊鐢卞涓嬶細
1銆丏3D9淇浜咲3D8宸茬煡鐨勬墍鏈塀ug錛屽洜姝よ繍琛岃搗鏉ユ洿紼沖畾錛岄熷害涔熻蹇?br>2銆丏3D9鎻愪緵浜嗚澶氫究鍒╃殑鏂板姛鑳斤紝铏界劧緇濆ぇ澶氭暟鏄潰鍚?D鐨勶紝浣嗘槸涔熸湁涓嶅皯2D閫傜敤鐨勶紝姣斿IDirect3DDevice9::StretchRect錛屼互鍙婂IDirect3DSurface9鐨勬敼榪涚瓑絳夈侱3DX搴撳氨鏇村浜嗭紝姣斿D3DXSaveSurfaceToFileInMemory錛屼竴寮濮嬫病鍙戠幇榪欎釜鍑芥暟鏈夊暐鐢ㄥ錛岀幇鍦ㄥ熀鏈涓嶅紑浜嗐?br>3銆丠LSL銆傚氨鍍忎笂涓璇濇垜璇寸殑閭f牱錛孌2D鏁欑▼浠ュ悗浼氭湁PixelShader鐨勫唴瀹廣傛垜鍙笉鎯蟲嬁姹囩紪鏉ュ啓Shader錛屼細姝諱漢鐨勶紙紲濊春鎴戝惂錛岀粓浜庢姏寮冩眹緙朣hader浜?#8230;…錛夈傝櫧鐒惰榪欎笉鏄喅瀹氭х殑鐞嗙敱錛屽洜涓鴻繕鏈塁g浠涔堢殑錛屼笉榪囨垜鎯崇紪鍐欐樉鍗℃棤鍏崇殑浠g爜錛屽洜姝ゆ垜涓嶅幓鐮旂┒Cg錛堝弽姝e拰HLSL宸笉澶氾級浠ュ強R2VB涔嬬被銆?br>4銆両D3DXFont錛屽線涓嬬湅浣犲氨鐭ラ亾浜嗐?br>
銆奃3D鐨勫彉鍖栥?br>
銆庣晫闈㈠悕縐板彉鍖栥?br>
銆銆涓鍙ヨ瘽錛?鏀規垚9灝辮銆?br>
銆?#8220;鍒涘緩”鍨嬫柟娉曠殑涓涓粺涓鍙樺寲銆?br>
銆銆璁稿Create*()鏂規硶錛屾瘮濡傚垱寤鴻澶囥佸垱寤虹汗鐞嗐佸垱寤洪《鐐圭紦鍐茬瓑絳夛紝澶氫簡涓涓狧ANDLE* pSharedHandle鍙傛暟錛屾棤鐢紝NULL涔嬶紙鐪嬫潵寰蔣鍘熸墦綆楀紕涓叡浜彞鏌勪箣綾伙紝涓嶈繃琚獶3D10宸ㄥぇ鐨勫彉鍖栨誕浜戜簡錛?br>
銆庡垱寤篋3D璁懼鐨勫彉鍖栥?br>
銆銆D3DPRESENT_PARAMS鐨凢ullScreen_PresentationInterval鍙樻垚浜哖resentationInterval錛屼篃灝辨槸璇村嵆浣垮湪紿楀彛妯″紡涓嬩篃鍙互鍋氬埌鍨傜洿鍚屾鏉ラ槻姝㈡挄瑁傜幇璞★紙2D鐨勭闊沖晩錛夈傜浉搴旂殑錛孌3DSWAPEFFECT_COPY_VSYNC娑堝け浜嗭紝鍙嶆榪欎釜鏁堟灉涔熶笉鍜嬬殑錛屾秷澶變簡涔熷ソ銆?br>銆銆瑕佸仛鍒板瀭鐩村悓姝ラ渶瑕佺粰PresentationInterval璧嬪糄3DPRESENT_INTERVAL_DEFAULT鎴朌3DPRESENT_INTERVAL_ONE銆傚叾涓璂3DPRESENT_INTERVAL_ONE鐨勬晥鏋滄瘮D3DPRESENT_INTERVAL_DEFAULT濂戒竴鐐癸紝涓嶈繃鐩稿簲鐨勪篃浼氬崰鐢ㄥ涓鐐圭偣緋葷粺璧勬簮……鐪熺殑鍙湁涓鐐圭偣鑰屽凡錛屽疄鍦ㄦ槸鏃犳墍璋撶殑……
銆銆濡傛灉涓嶈鍨傜洿鍚屾錛屾兂瑕佺湅鐪嬪疄闄呯ク閫熺殑璇濓紝D3DPRESENT_INTERVAL_IMMEDIATE銆?br>銆銆娉ㄦ剰鍦ㄧ獥鍙fā寮忎笅錛屼綘鍙兘浣跨敤榪欎笁縐峆resent妯″紡錛屽叏灞忓箷妯″紡涓嬪氨鍙互浣跨敤鍒殑錛堜絾鏄棣栧厛媯嫻婦3DCAPS9浠ユ煡鐪嬫樉鍗℃槸鍚︽敮鎸侊級銆備笉榪囨垜鎰熻瀵?9錛呯殑娓告垙鏉ヨ錛屾湁榪欎笁涓氨瓚沖浜嗐?br>銆銆鍙﹀鍦ㄧ獥鍙fā寮忎笅錛孊ackBufferFormat涔熷彲浠ヨ緗垚D3DFMT_UNKNOWN錛孌3D浼氳嚜鍔ㄨ幏鍙栧綋鍓嶆闈㈢殑鏍煎紡璁懼畾鎴愬悗澶囩紦鍐茬殑鏍煎紡錛岀渷鍘籊etDisplayMode銆傚疄闄呬笂錛岀獥鍙fā寮忎笅鐨勫悗澶囩紦鍐插凡緇忎笉闇瑕佸拰妗岄潰鏍煎紡鐩稿悓錛屼綘鍙互閫氳繃IDirect3D9::CheckDeviceFormatConversion鏉ユ鏌ワ紝濡傛灉榪欎釜璁懼鏀寔榪欎袱縐嶉鑹叉牸寮忎箣闂寸殑杞崲錛屽氨鍙互緇欑▼搴忕殑鍚庡緙撳啿璁懼畾涓婁笉鍚岀殑鏍煎紡銆傛垜璇曡繃鍦ㄦ闈㈡牸寮忎負32Bit錛圖3DFMT_X8R8G8B8錛夋椂灝嗙▼搴忕殑鍚庡緙撳啿鏍煎紡璁劇疆涓篋3DFMT_R5G6B5錛?6Bit錛夛紝鍙戠幇浜嗛熷害鎻愬崌錛屼篃灝辨槸璇磋繖涓瀹氭槸鏈夋剰涔夌殑銆?br>銆銆鍙垱寤虹殑璁懼綾誨瀷澶氫簡涓縐岲3DDEVTYPE_NULLREF錛屽湪瀹夎浜咲3D SDK鐨勬満瀛愪笂絳夊悓浜嶥3DDEYTYPE_REF錛屽湪鍏朵粬鐨勬満瀛愪笂錛岃繖縐嶈澶囧疄闄呬笂娌℃湁鍒涘緩鐪熸鎰忎箟鐨凞3D璁懼錛屽彧鏄厑璁鎬綘鍒涘緩鐨勭汗鐞嗐佽〃闈㈢瓑璧勬簮錛屼絾鏄疪ender銆丳resent絳夋搷浣滈兘浼氭棤鏁堬紙瀹為檯涓婅繖浜涜祫婧愰兘鍒涘緩鍦ㄤ簡D3DPOOL_SCRATCH姹犻噷錛屼笉綆′綘璁懼畾浣跨敤鐨勬槸浠涔圥OOL錛夈備篃灝辨槸璇達紝浠呬粎鍦ㄦā鎷熷熀鏈殑榪愯鑰屽凡銆備綘鍙互鐢ㄨ繖涓澶囨潵緙栧啓涓涓埄鐢―3DX鍑芥暟搴撹繘琛屽浘鍍忔牸寮忚漿鎹㈢殑紼嬪簭錛屾瘮濡傛妸涓澶у爢涓嶅悓鐨勬牸寮忚漿鎹㈡垚鏄撲簬D3D9浣跨敤鐨凞DS鏍煎紡銆傚洜涓哄疄闄呬笂娌℃湁鍒涘緩璁懼錛屼綘鐢氳嚦鍙互緙栧啓鎴愭帶鍒跺彴鐨勶紝閫氳繃GetConsoleWindow鐨勬柟娉曡幏寰桯WND銆侻ercury 3鐢ㄧ殑MIF鏍煎紡鐨勮漿鎹㈠櫒灝辨槸榪欎箞鍋氬嚭鏉ョ殑銆傛敞鎰廌3DDEVTYPE_NULLREF鍙兘鐢ㄥ湪IDirect3D::CreateDevice鏃訛紝鍏朵粬鐨勬柟娉曢兘涓嶈銆?br>
銆庡垱寤鴻〃闈㈢殑鍙樺寲銆?br>
銆銆鍒涘緩琛ㄩ潰錛圫urface錛夌殑鏂規硶鍙樻垚浜咺Direct3DDevice9::CreateOffscreenPlainSurface錛屽弬鏁板緢綆鍗曚笉鐢ㄥ璇達紝闇瑕佹敞鎰忕殑鏄彲浠ラ夋嫨POOL浜嗐?br>
銆庤瀹欶VF鐨勫彉鍖栥?br>
銆銆璁懼畾FVF鏃訛紝鍘熸潵閫氳繃IDirect3DDevice8::SetVertexShader錛岀幇鍦ㄦ湁浜嗕竴涓笓闂ㄧ敤鏉ヨ瀹欶VF鐨勬柟娉曪細IDirect3DDevice9::SetFVF銆傝繖鏄釜寰堝ソ鐨勫彉鍖栵紝鐪佸緱鎶奆VF鍜孲hader寮勬販錛堥澶栬瘽錛氫篃灝辨槸鍥犱負榪欎釜鍙樺寲錛岃Shader鍦ㄨ澶嘡eset鍚庡緱浠ヤ繚瀛橈紝涓嶉敊涓嶉敊錛?br>
銆庤幏鍙栧悗澶囩紦鍐層?br>
銆銆D3D9鐜板湪鍏佽鏈夊涓悗澶囩紦鍐蹭氦鎹㈤摼錛屼笉榪囧浜?D鏉ヨ錛屽熀鏈笉闇瑕佽繖縐嶄笢瑗匡紝IDirect3DDevice9::GetBackBuffer澶氬嚭鏉ョ殑絎竴涓弬鏁拌祴鍊?鍗沖彲銆傚鏋滀綘鏈夊叴瓚o紝鍙互鍘葷爺絀朵竴涓嬭繖涓帺鎰忥紝鏈夋椂鍊欏彲浠ョ敤鏉ュ仛鍒嗗満銆?br>
銆?font size=+0>SetStreamSource銆?br>
銆銆榪欎釜鏂規硶鐨勫姛鑳借鎵╁睍浜嗭紝瀵規瘮鍙傛暟灝卞彲浠ョ煡閬擄紝澶氬嚭鏉ョ殑OffsetInBytes鍏佽浣犻夋嫨涓涓《鐐圭紦鍐茬殑Offset錛孌3D9灝嗕粠榪欎釜Offset涔嬪悗寮濮嬭鍙栨暟鎹傚洜姝や綘鍙互鎶婂嚑緇勭敤鏉ユ覆鏌撶汗鐞嗙殑姝f柟褰㈤《鐐瑰瓨鍌ㄥ埌涓涓《鐐圭紦鍐查噷闈€?br>
銆?font size=+0>SetSamplerState銆?br>
銆銆榪欎釜鏄疍3D9鐨勬柊鏂規硶錛屾妸鍘熷厛SetTextureStageState鐨勪竴浜涘姛鑳界嫭绔嬩簡鍑烘潵錛屽拰2D鍏崇郴鏈瀵嗗垏鐨勫氨鏄汗鐞嗚繃婊や簡銆傚師鍏堢殑D3DTSS_MINFILTER鍙樻垚浜咲3DSAMP_MINFILTER錛岀浉搴旂殑D3DTSS_MAGFILTER涔熷彉鎴怐3DSAMP_MAGFILTER錛孌3DTSS_MAXANISOTROPY鍙樻垚D3DSAMP_MAXANISOTROPY銆傚彟澶栬繕鏈夋洿澶氱殑錛屾瘮濡傜汗鐞嗗鍧絳夈備綘鍘葷湅涓涓婦3DSAMPLERSTATETYPE鏋氫婦綾誨瀷鐨勫唴瀹瑰氨鐭ラ亾瀹?#8220;榪佺Щ”浜嗕簺浠涔堛?br>銆銆榪欎釜鍙樺寲瀵逛簬Shader鏉ヨ寰堟柟渚褲傛敼鎴怱ampler鐨勪笢瑗垮湪PixelShader榪囩▼涔熶細鏈夋晥錛岃屾病鏈夋洿鏀圭殑涓滆タ鍦≒ixelShader灝變笉浼氭湁鏁堜簡銆侱3D8鏃跺欐妸榪欎簺鍏ㄩ兘鏀懼湪浜嗕竴璧鳳紝瀹規槗閫犳垚娣蜂貢銆?br>
銆?font size=+0>SetRenderTarget銆?br>
銆銆D3D9鐜板湪鍏佽澶氶噸RenderTarget瀛樺湪錛屼笉榪囨垜浠熀鏈笂鍙敤涓涓紝RenderTargetIndex璁句負0錛岀浜屼釜鍙傛暟浠嶇劧鏄渶瑕佽瀹氱殑琛ㄩ潰銆備笌D3D8鐩稿悓鐨勬槸錛屽湪璁懼畾涔嬪墠浠嶇劧闇瑕佸厛閫氳繃GetSurfaceLevel鑾峰緱琛ㄩ潰鎵嶈銆?br>
銆庨《鐐圭紦鍐茬殑閿佸畾銆?br>
銆銆娉ㄦ剰IDirect3DVertexBuffer9::Lock鐨勭涓変釜鍙傛暟錛屼粠鍘熸潵鐨凚YTE**鍙樻垚浜唙oid**銆備篃灝辨槸榪欐牱浜?#8230;…

銆庡叾浠栫殑涓浜涘彉鍖栥?br>
1銆丆opyRects鍙樻垚浜哢pdateSurface銆傚拰UpdateTexture涓鏍鳳紝鍙兘浠嶥3DPOOL_SYSTEMMEM鎷瘋礉鍒癉3DPOOL_DEFAULT
2銆佸鍔犱簡涓涓瘮杈冩湁鐢ㄧ殑IDirect3DDevice9::ColorFill鏂規硶錛屼綔鐢ㄦ槸鍚慏3DPOOL_DEFAULT鐨勬煇涓尯鍩熷~鍏呴鑹詫紝鍜孋lear鐨勫姛鑳界被浼鹼紝浣嗘槸鍦ㄤ嬌鐢ㄧ洰鐨勪笂瑕佹瘮Clear鏄庣‘鐨勫錛屽茍涓旂敱浜庝笉鐗墊壇娣卞害緙撳啿涔嬬被錛岄熷害瑕佸揩涓浜涖?br>3銆佸鍔犱簡涓涓狪Direct3DDevice9::StretchRect鏂規硶錛岄氳繃榪欎釜鏂規硶灝卞彲浠ュ湪D3DPOOL_DEFAULT鐨勮〃闈㈡垨綰圭悊涔嬮棿榪涜甯﹁繃婊ゅ櫒鐨勭緝鏀炬搷浣滐紝鍏嶅幓鍒╃敤Render鐨勮繃紼嬶紝闈炲父鏈夌敤銆備笉榪囪繖涓柟娉曠敱浜庝嬌鐢ㄤ簡紜歡澶勭悊錛岄檺鍒惰緝澶氾紝璇峰ぇ瀹朵粩緇嗙湅SDK鏂囨。鐨凴emarks閮ㄥ垎銆?br>
銆奃3DX鐨勫彉鍖栥?br>
銆銆D3DX鐨勫彉鍖栧疄闄呬笂鐩稿綋鐨勫錛屼絾姝e鎴戜竴寮濮嬫墍璇達紝鍩烘湰閮芥槸闈㈠悜3D鐨勩傞渶瑕佹垜浠敞鎰忕殑鏈変互涓嬪嚑縐嶏細
1銆丏3DX***FromFile涔嬬被鐨勫嚱鏁版敮鎸佺殑鍥懼儚鏍煎紡澧炲姞浜嗭紝涓嶈繃鎵澧炲姞鐨勯兘鏄緢灝戣鐨勬牸寮忋傚鉤鏃跺熀鏈笂榪樻槸鐢˙MP銆乀GA鍜孭NG灝辮凍澶熴?br>2銆佸鍔犱簡D3DXSave***ToFileInMemory錛屽皢浼氭妸鏂囦歡鍐欏叆鍐呭瓨銆傝繖涓嚱鏁扮殑浣滅敤浼間箮涓嶆槸寰堝鏄撴兂鍒幫紝浣嗘槸濡傛灉浣犺鍐欎竴涓泦鎴愪簡杞崲銆佹墦鍖呭姛鑳界殑宸ュ叿錛岃繖涓氨寰堟湁鐢ㄤ簡錛岀渷鍘諱簡閫氳繃涓存椂鏂囦歡鎿嶄綔閫犳垚鐨勫悇縐嶉棶棰樸傚彟澶栧鏋滀綘鐔熸倝鏌愮鍥懼艦鏂囦歡鐨勬牸寮忕殑璇濓紝榪樺彲浠ラ氳繃鐩存帴璁塊棶榪欎釜鏂囦歡鑾峰緱RAW淇℃伅銆傛敞鎰忥紝榪欑被鍑芥暟鍐欏叆鐨勬槸涓涓狪D3DXBuffer錛岃繖涓笢瑗垮緢綆鍗曪紝鍙湁涓や釜鐗瑰畾鐨勬柟娉曪紝涓鐪嬩究鎳傦紝涓嶅啀澶氳█銆?br>3銆佸鍔犱簡涓涓狪D3DXLine錛屽彲浠ユ柟渚夸綘鍦?D涓婄敾綰匡紝鍒涘緩ID3DXLine鐨勬柟娉曟槸D3DXCreateLine銆傝繖涓笢瑗夸篃涓嶅鏉傦紝浣跨敤鏂規硶鏈夌偣鍍廔D3DXSprite錛岀◢寰爺絀朵竴涓嬪氨鑳藉紕鎳傦紝娉ㄦ剰姣忔Draw鐨勬槸D3DPT_LINESTRIP銆傜敤瀹冩瘮鐩存帴鐢ㄩ《鐐圭紦鍐茬殑濂藉鏄彲浠ユ柟渚跨殑鎵撳紑鍙嶉敮榻匡紝鏁堟灉鍢?#8230;…鍩烘湰婊℃剰銆?br>4銆佸鍔犱簡涓涓狪D3DXRenderToSurface錛?#8220;鐞嗚涓婃潵璇?#8221;鏂逛究浜嗗埄鐢≧enderTarget鐨勮繃紼?#8230;…涓嶈繃鎴戞劅瑙夊弽鑰屽紕寰楀鏉備簡銆傚垱寤虹殑鏂規硶鏄疍3DXCreateRenderToSurface錛屾湁蹇冩儏鐨勬湅鍙嬭嚜宸辯爺絀剁湅鐪嬪惂錛屾垜灝變笉璁蹭簡銆?br>
銆銆ID3DXSprite鍜孖D3DXFont鍦⊿ummer 2004鐨凞X9 SDK錛堜篃灝辨槸絎竴鐗圖X9.0c錛夊紑濮嬪彂鐢熶簡寰堝ぇ鍙樺寲錛屼笅闈㈣榪幫細

銆嶪D3DXSprite銆?br>
銆銆浣犱細鍙戠幇ID3DXSprite::DrawTransform涓嶈浜嗭紝鍙栬屼唬涔嬬殑鏄叾鍔熻兘琚暣鍚堝埌ID3DXSprite::SetTransform閲岄潰錛屼篃灝辨槸璇翠負浜嗙緝鏀懼拰鏃嬭漿錛屾垜浠笉寰椾笉鍜岀煩闃墊墦浜ら亾浜嗐傚叾瀹炰篃涓嶄細澶鏉傦紝鍥犱負鎴戜滑鍙槸鍋氫竴浜涚煩闃佃繍綆楋紝瀛﹁繃綰挎т唬鏁扮殑鏈嬪弸鑲畾浼氬緢鐔熸倝錛屽氨綆椾綘涓嶆庝箞鐔熸倝綰挎т唬鏁幫紝涔熸病鍏崇郴錛孌3DX鍑芥暟搴撴彁渚涗簡鐜版垚鐨勭煩闃佃繍綆楀嚱鏁幫紝浣犲彧瑕佺敤灝辮浜嗐?br>
D3DXMatrixScaling
D3DXMatrixRotationZ
D3DXMatrixTranslation

銆銆鎸夌収欏哄簭璋冪敤榪欎笁涓嚱鏁?#8230;…鎴栬瀛﹁繃3D鐨勯┈涓婂氨鎯沖埌榪欑偣浜嗭紝鐨勭‘鏄病閿欏暒銆傛敞鎰忛『搴忓摝錛歋caling -> Rotation -> Translation錛岀畝縐癝RT錛堢湅榪囧叏閲戝睘鐙傛疆鍚楋紵鐪嬭繃鐨勮瘽榪欎釜鍗曡瘝寰堝ソ璁板惂^_^錛夛紝寮勯敊浜嗗彲鏄緱涓嶅埌姝g‘緇撴灉鐨勩?br>銆銆浣犳槸涓嶆槸鎯沖埌鎶婂悓涓涓狣3DXMATRIX褰撲綔鍙傛暟浣跨敤涓夋錛熼敊鍟︼紒浣犺鐢ㄧ煩闃典箻娉曘傚垱寤轟笁涓狣3DXMATRIX錛屾瘮濡俶at1銆乵at2銆乵at3錛屽垎鍒敤榪欎笁涓嚱鏁板皢鍏跺垱寤轟負緙╂斁鐭╅樀銆佹棆杞煩闃靛拰騫崇Щ鐭╅樀錛岀劧鍚庡湪ID3DXSprite::SetTransform鏃訛紝榪欐牱鍐欙細

SetTransform(mat1 * mat2 * mat3);

銆銆鏈夊楹葷儲鐨勬槸涓嶏紵ID3DXSprite鏂逛究浜嗗仛3D鐨勶紝鍙鑻︿簡鍋?D鐨勶紝鎵浠ユ垜宸茬粡涓嶇洿鎺ョ敤榪欎釜浜嗭紙浠涔堝彨涓嶇洿鎺ョ敤錛熷線涓嬬湅錛夈?br>
銆嶪D3DXFont銆?br>
銆銆澶у鏉ユ鍛煎惂錛丼ummer 2004鏀硅繘鐨処D3DXFont褰誨簳鏋瘷鎺変簡涓婁竴璇濋偅涓瓧浣撳紩鎿?#8230;…
銆銆榪欎笢瑗跨殑鏀硅繘錛屾庝箞璇村憿錛屽簲璇ヨ鏄敼澶存崲闈㈠惂錛岄熷害銆佹晥鏋滈兘鍜屼互鍓嶄笉鏄竴涓暟閲忕駭銆傚彲鎬滅殑PixelFont錛屾墠瀛樺湪浜嗕竴璇濆氨瑕佽鎶涘純浜嗐?br>銆銆ID3DXFont澶氬嚭鏉ョ殑鍑犱釜鏂規硶錛孭reload*()榪欑被鐨勶紝灝辨槸鎶婁竴浜涘父鐢ㄧ殑瀛楃殑瀛楁ā鎻愬墠璇誨彇鍒板唴瀛橀噷闈㈠姞蹇熷害錛屽悓鏃惰繕鍙互浣跨敤ID3DXSprite娓叉煋錛岃繘涓姝ュ姞蹇熷害銆傝櫧鐒跺唴閮ㄤ粛鐒舵湁GDI鐨勯儴鍒嗭紝涓嶈繃寰堟槑鏄懼伐浣滄柟寮忓彂鐢熶簡鏋佸ぇ鐨勫彉鍖栥傛牴鎹垜鐨勪及璁★紝榪欐鐨処D3DXFont寰堣仾鏄庣殑鍒╃敤GDI鑾峰緱鏂囧瓧鐨勮疆寤擄紝鐒跺悗閫氳繃綰圭悊鏉ユ覆鏌撱傝繖鏍風殑閫熷害灝卞揩寰楀浜嗭紝鑰屼笖鏂囧瓧璐ㄩ噺涔熷緱鍒頒簡寰堝ソ鐨勬帶鍒訛紝鍩烘湰鍜岀洿鎺ョ敤GDI鐨勮川閲忕浉鍚屼簡銆?br>銆銆鐢變簬PreloadCharacters()鍜孭reloadGlyphs()涓嶆槸閭d箞濂界悊瑙o紝涓鑸敤PreloadText()灝辮銆傚緩璁皢鎵鏈堿SCII瀛楃銆佹爣鐐圭鍙峰拰閮ㄥ垎姹夊瓧棰勮榪涘幓銆傝繖涓璇昏繃紼嬬暐寰湁鐐規參錛岃屼笖鏍規嵁棰勮鐨勬枃瀛楁暟閲忓拰浣犲垱寤烘枃瀛楃殑瀛楀彿錛屽崰鐢ㄧ殑鍐呭瓨涔熶笉鍚屻傝繖閲岀粰澶у涓鍫嗘枃瀛楋紝浣燙opy榪囧幓灝辮錛?br>
寮曠敤

const char strPreloadText[] = " 1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM~!@#$%^&*()-=[]\\;',./_+{}|:\"<>?銆銆併?#183;藟藝¨銆冣旓綖鈥?#8230;‘’“”銆斻曘堛夈娿嬨屻嶃庛忋栥椼愩戯紒錛傦純錕ワ紖錛嗭紘錛堬級錛婏紜錛岋紞錛庯紡錛愶紤錛掞紦錛旓紩錛栵紬錛橈紮錛氾紱錛滐紳錛烇紵錛狅肌錛跡錛わ譏錛︼姬錛緝錛極錛輯錛集錛幫急錛詫汲錛達嫉錛訛擠錛革脊錛猴薊錛鹼冀錛撅伎锝锝侊絺锝冿絼锝咃絾锝囷綀锝夛綂锝嬶綄锝嶏綆锝忥綈锝戯綊锝擄綌锝曪綎锝楋綐锝欙綒锝涳綔锝濇垜浜烘湁鐨勫拰涓諱駭涓嶄負榪欏伐瑕佸湪絎竴涓婃槸涓浗緇忓凡鍙戜簡姘戝悓";

銆銆娉ㄦ剰絎竴涓瓧絎︽槸絀烘牸鍝︼紒鎶婄┖鏍奸璇昏繘鍘誨彲鏄緢閲嶈鐨刕_^
銆銆鐪嬩笂鍘誨茍涓嶅錛屽洜涓鴻鑰冭檻鍒板唴瀛樺崰鐢ㄥ強閫熷害錛屾垜鍙璇諱簡涓浜涚鍙峰拰浜旂瑪鐨勪竴閿瓧銆傝繖浜涘瓧絎﹀湪24鍙峰瓧鏃跺欏凡緇忓崰鐢ㄤ簡蹇?MB浜嗭紝姣旇搗PixelFont瀛楀簱鍗犵敤鐨勮澶у緱澶氥傚ぉ鐭ラ亾ID3DXFont鍒板簳棰勮浜嗕簺浠涔?#8230;…
銆銆PreloadText()鐨勭浜屼釜鍙傛暟涓嶈鐢╯trlen錛宻izeof(strPreloadText)鍗沖彲銆?br>銆銆鐒跺悗灝辨槸鍒╃敤ID3DXSprite鏉ユ覆鏌撱傛敞鎰廔D3DXFont::DrawText鐨勭涓涓弬鏁板氨鏄疞PD3DXSPRITE錛屽洜姝ゅ鏋滆鍒╃敤ID3DXSprite錛岃灝咺D3DXFont::DrawText鏀懼埌ID3DXSprite::Begin鍜孖D3DXSprite::End涔嬮棿銆傝繖灝辨槸鎴戝垰鎵嶈鐨勪笉鐩存帴鐢↖D3DXSprite鐨勬剰鎬濓紝ID3DXFont浼氬畬鎴怚D3DXSprite鐨勫叏閮ㄨ皟鐢紝浣犱笉鐢ㄦ媴蹇冦?br>銆銆鍙﹀浣犲簲璇ユ敞鎰忓埌ID3DXSprite::Begin澧炲姞浜嗗弬鏁幫紝瀹為檯涓奃X鏂囨。閲岄潰娌¤錛屼絾鏄ず渚嬮噷闈㈡湁錛屽鏋滄兂璁㊣D3DXSprite鍙戞尌浣滅敤騫朵笖鏈澶у箙搴︾殑鎻愬崌鏁堢巼錛屽弬鏁頒笂璁懼畾D3DXSPRITE_ALPHABLEND | D3DXSPRITE_SORT_TEXTURE鍗沖彲銆傛剰鎬濆緢鏄庣櫧錛氭墦寮Alpha榪囨護鍜岀汗鐞嗙瓫閫夈傝繖閲孌X鏂囨。涓婃湁涓敊璇竴鐩存病鏀癸細鏂囨。閲岀粰鍑虹殑鏄疍3DXSprite__SORT_TEXTURE錛屼絾鏄綘鍙互璇曡瘯錛岀粷瀵規姤閿欍?br>銆銆鍓╀笅鐨勫氨娌″暐浜嗭紝ID3DXFont鐨勪嬌鐢ㄦ柟娉曚笂涓璇濆凡緇忚榪囥傝娉ㄦ剰鐨勬槸D3DXCreateFont鍜孌3DXCreateFontIndirect閮藉彂鐢熶簡鍙樺寲銆侱3DXCreateFont宸茬粡涓嶅啀鐗墊壇GDI浜嗭紝D3DXCreateFontIndirect鎵浣跨敤鐨勭粨鏋勪篃鍙樻垚浜咲3DXFONT_DESC錛岀浉瀵逛簬LOGFONT緇撴瀯錛岄櫎鍘諱簡涓浜涚敤涓嶇潃鐨勫弬鏁幫紝澧炲姞浜嗕竴涓狹ipLevels錛屽氨鏄疢ipMap絳夌駭鍟︼紝涓嶇敤澶氳錛?D涓嬪彧鐢?銆傚叾浠栫殑涓婁竴璇濋兘鏈夈傚疄闄呬笂鐢變簬D3DXCreateFont宸茬粡涓嶅啀鍏寵仈GDI錛孌3DXCreateFontIndirect鐨勫瓨鍦ㄤ粎浠呮槸鐢變簬鍘嗗彶鍘熷洜錛堜負浜嗗吋瀹瑰儚鎴戣繖縐嶄漢鐨勪嬌鐢ㄤ範鎯級錛屽ぇ瀹惰繕鏄敤D3DXCreateFont鍚э紝鐪佷簨銆?br>銆銆鎴浘灝變笉璐翠簡錛屾病鍟ユ剰涔夈備綘鍙兘瑙夊緱鐩存帴鍚戝悗澶囩紦鍐蹭笂DrawText榪樹笉澶熷ソ鐪嬶紝閭d箞灝卞厛鐢誨埌涓寮犵汗鐞嗕笂錛岀劧鍚庡皢綰圭悊閿欎綅娓叉煋鍒板悗澶囩紦鍐插茍涓旀墦寮綰垮瀷榪囨護錛屽氨鍙互杈懼埌鍜孭ixelFont鐩稿悓鐨勬晥鏋滀簡銆?br>銆銆閫熷害鍢?#8230;…鎴戠敾浜嗘暣鏁翠竴灞忓箷瀛楋紝鍦ㄤ笉緙撳啿鏂囧瓧鐨勬儏鍐典笅錛堣繖涓?#8220;緙撳啿鏂囧瓧”鍜孖D3DXFont鐨勬枃瀛楃紦鍐插彲涓嶆槸涓鍥炰簨鍟婏紒鐪嬭繃涓婁竴璇濈殑閮藉簲璇ョ煡閬撴垜榪欓噷鎸囩殑鏄粈涔堬級錛岄熷害浠嶇劧鍦?20FPS浠ヤ笂銆傛垨璁鎬綘浼氳寰楅熷害榪樻槸鏈夌偣鎱紝浣嗘槸錛屽鏋滅敤D3D8鐨処D3DXFont鐢諱笂榪欎箞涓灞忓箷錛屽熀鏈氨鍙墿20FPS浜嗐?br>銆銆浣跨敤ID3DXFont鏇挎崲鎺塒ixelFont鐨勪紭鍔垮氨鏄彲浠ユ柟渚跨殑鑷畾涔夊瓧浣撳瓧鍙蜂簡錛屽茍涓斾篃涓嶅啀鍙桮B2312瀛楀簱鐨勯檺鍒躲傛墍浠ュぇ瀹墮兘鎹簡鍚?#8230;…閮芥崲浜嗗惂……鎶奝ixelFont蹇樹簡鍚?#8230;…

銆庣ǔ瀹氱殑DX9 SDK鐗堟湰銆?br>
銆銆鎴戠幇鍦ㄧ敤鐨勬槸April 2006錛岃屼笖搴旇浼氱敤寰堥暱鏃墮棿銆侫ugust 2006鎴戞槸鑲畾涓嶄細鍘葷敤鍟︼紒鍗充嬌鎴戜笉鍐嶆亹鎯3D9錛屼篃浼氬榪欎釜SDK閬胯涓夊垎鐨勩傚叾瀹炲浜?D錛屾垜鎰熻鐢ㄥ埌April 2006灝辮凍澶熶簡錛屼箣鍚庣殑DX9 SDK涓昏鍦―3DX鐨?D鍑芥暟搴撻儴鍒嗚繘琛屾洿鏀?#8230;…鍏跺疄涔熸槸縐嬪悗鐨勮殏铓辮功杈句笉浜嗗嚑澶╋紝D3D10椹笂灝辮鍑烘潵浜嗐傝璇碊3D10鍟?#8230;…浣犺繕鏄湅鎴戝彟澶栦竴綃囨棩蹇楀ソ浜嗭紝鎬諱箣鎵撴鎴戦兘涓嶆嬁瀹冨仛2D銆?br>
銆銆瀹為檯涓婁粎浠呮槸2D鐨勮瘽錛屼粠D3D8杞悜D3D9騫舵病鏈夊灝戝彉鍖栵紝涓昏鏄ǔ瀹氬槢錛佸彧瑕佷綘涓嶈皟鐢ㄤ竴浜汥3D9涓撶敤鐨勫姛鑳斤紝鍗充嬌鎷緿3D9鏉ュ仛2D錛屽湪緇濆ぇ澶氭暟鏄懼崱涓婅繕鏄兘澶熻繍琛岀殑銆傚棷……GF2絳夌駭浠ヤ笂鍚э紝GF2涔嬪墠鐨勶紝涔熷お鑰佷簡錛屾棤瑙嗗ソ浜嗐?br>
銆婂啀涓婄偣鑿滃ソ浜嗭細鍏ㄥ睆騫曟ā寮忋?br>
銆銆鍏跺疄騫朵笉鏄涔堝鏉傜殑闂錛岃鎴戞嫋浜嗚繖涔堜箙……涓嶆嫋浜嗭紝榪欓噷灝辨暀緇欏ぇ瀹跺浣曞仛鍏ㄥ睆騫曟ā寮忎互鍙婂浣曞鐞嗚澶囦涪澶辯殑闂銆?br>
銆庡垱寤哄叏灞忓箷妯″紡銆?br>
銆銆D3DPRESENT_PARAMS閲岄潰錛學indowed璁懼畾涓篺alse錛屽茍涓斾竴瀹氳璁懼畾BackBufferWidth鍜孊ackBufferHeight錛屽畬姣曘?br>銆銆鍝堝搱錛屽氨榪欎箞綆鍗曪紝鎴栬鏃╁氨鏈変漢灝濊瘯榪囦簡錛屼絾鏄綘璇曡瘯鎸変笅Alt+Tab錛屽啀鍒囨崲鍥炲幓錛屼繚璇佷綘浠涔堥兘鐪嬩笉鍒般?br>銆銆涔嬪墠鏇劇粡璇磋繃錛孌X8涔嬪墠鐨勭増鏈紝鍦ㄥ叏灞忓箷涓嬪伐浣滄瘮鍦ㄧ獥鍙d笅瀹規槗錛屽埌DX8涔嬪悗灝卞垯瀹屽叏棰犲掕繃鏉ャ傚洜涓哄湪紿楀彛妯″紡涓嬩笉鐢ㄦ媴蹇冭澶囦涪澶憋紙闄ら潪浣犳洿鏀規闈㈠垎杈ㄧ巼錛夛紝鍏ㄥ睆騫曟ā寮忎笅灝變細鏈夎繖涓棶棰樹簡銆備笅闈㈣榪幫細

銆庤澶囥佽祫婧愪涪澶便?br>
銆銆璁懼涓㈠け浼氬彂鐢熷湪鍏ㄥ睆騫曟ā寮忎笅鍒囨崲鍥炴闈㈡椂錛堜笉璁烘槸閫氳繃Alt+Tab榪樻槸QQ涓婃湁浜虹粰浣犲彂浜嗗紶鍥劇墖-_-bbb錛夛紝鑰屼笖濡傛灉鍦ㄨ皟鐢↖Direct3DDevice9::Reset錛堜粠鐜板湪寮濮嬪氨鏄疍3D9浜嗗晩錛佸繕璁癉3D8鍚?#8230;…錛夌殑鏃跺欏彂鐢熼敊璇紝璁懼涔熶細涓㈠け銆?br>銆銆璁懼涓㈠け浼氶犳垚璧勬簮涓㈠け錛氭墍鏈夊垱寤哄湪D3DPOOL_DEFAULT姹犵殑璧勬簮閮戒細涓㈠け錛岄渶瑕侀噸鏂板垱寤猴紝鍏跺唴瀹瑰綋鐒朵篃浼氭秷澶憋紝闇瑕侀噸鍐欍?br>銆銆鐒惰屽垱寤哄湪D3DPOOL_SYSTEMMEM鍜孌3DPOOL_SCRATCH姹犵殑璧勬簮涓嶄細鍙楀埌褰卞搷銆傚垱寤哄湪D3DPOOL_MANAGED姹犵殑璧勬簮涔熶笉浼氫涪澶憋紝鑰屼笖鍦ㄨ澶囬噸鏂板彲鐢ㄧ殑鏃跺欙紝D3DPOOL_MANAGED姹犵殑璧勬簮涔熷彲浠ョ珛鍗蟲姇鍏ヤ嬌鐢紝鍐呭涔熶笉浼氭敼鍙樸傜湅榪欎釜姹犲悕瀛楋細鎵樼姹犲氨鑳界煡閬擄紝D3D甯綘澶勭悊浜嗘墍鏈夐棶棰樸?br>銆銆鍥犳閬垮厤璁懼涓㈠け鍚庤祫婧愪涪澶辯殑綆鏄撴柟娉曞氨鏄皢鎵鏈夎祫婧愬垱寤哄湪D3DPOOL_MANAGED姹犲唴銆備笉榪囪繖騫朵笉鏄釜濂芥柟娉曪紝榪欐剰鍛崇潃涓嶈兘鐢ㄦ覆鏌撳璞♀斺旇寰楀悧錛烺enderTarget鍙兘鍒涘緩鍦―3DPOOL_DEFAULT銆傚疄闄呬笂鏈濂界殑鏂規硶鏄窡韙墍鏈塂3DPOOL_DEFAULT璧勬簮錛屾瘮濡傚埄鐢╯td::list錛屽皢鎵鏈塂3DPOOL_DEFAULT璧勬簮鍕句綇錛屽湪璁懼鍙戠敓涓㈠け鐨勬椂鍊欓噴鏀炬帀璧勬簮錛岃澶囧彲浠ョ戶緇嬌鐢ㄧ殑鏃跺欓噸鏂板垱寤鴻祫婧愶紝璁板緱鎶婃暟鎹啓鍥炲幓銆傚浜庡叾浠栫殑姹犲氨涓嶇敤榪欎箞鎶樿吘浜嗐?br>
銆庡綋璁懼涓㈠け涔嬪悗銆?br>
銆銆涓嶈閫氳繃浠諱綍鏂瑰紡鍙戠敓浜嗚澶囦涪澶憋紝鎵鏈夌殑鎿嶄綔鍑犱箮閮戒細澶辨晥錛屽彧鏈塕elease()鍙互鐢ㄢ斺斿叾瀹濪3D浼氫繚璇佹湁閮ㄥ垎鎿嶄綔鍙互鎴愬姛錛屼絾鏄篃浠呬粎鏄?#8220;鍙互”鎴愬姛鑰屼笉鏄?#8220;涓瀹?#8221;鎴愬姛錛屾墍浠ヤ綘榪樹笉濡傝瀹氫涪澶辯殑鏃跺欏叏閮戒細澶辮觸姣旇緝濂解斺斾互鍙奍Direct3DDevice9::TestCooperativeLevel銆傚洜姝ゅ湪璁懼涓㈠け涔嬪悗錛屼綘搴旇鍋滄鏁翠釜娓告垙寰幆錛岃岄氳繃鍙嶅璋冪敤IDirect3DDevice9::TestCooperativeLevel鍒ゆ柇璁懼鏄惁鍙敤銆?br>
銆嶪Direct3DDevice9::TestCooperativeLevel銆?br>
銆銆榪欎釜鏂規硶媯嫻嬪綋鍓嶇殑璁懼鐘舵併傝繑鍥炲兼湁鍥涚錛欴3D_OK涓鍒囨甯革紝D3DERR_DEVICELOST璁懼涓㈠け錛孌3DERR_DEVICENOTRESET璁懼鍙互Reset銆傚彟澶栬繕鏈塂3D9鏂板鐨凞3DERR_DRIVERINTERNALERROR錛岄亣鍒拌繖涓綘灝卞畬铔嬩簡錛屽熀鏈笉鍙兘鎭㈠浜嗭紝緇堟紼嬪簭鍚с?br>銆銆鎸夌収欏哄簭鏉ヨ錛屽鏋滄父鎴忓湪姝e父榪愯錛孌3D_OK浼氳繑鍥烇紱濡傛灉鍙戠敓浜嗚澶囦涪澶卞茍涓斿湪榪欎釜鏃跺欎笉鑳芥仮澶嶏紝姣斿鍏ㄥ睆騫曟ā寮忕殑鏃跺欑敤鎴峰垏鎹㈠埌浜哤indows妗岄潰錛屽氨浼氳繑鍥濪3DERR_DEVICELOST錛涘鏋滅敤鎴峰張鍒囨崲鍥炰簡娓告垙錛岃澶囧彲浠ユ仮澶嶄簡錛堣繕娌℃仮澶嶅憿錛佸彧鏄?#8220;鍙互”鎭㈠鑰屽凡錛夛紝灝變細榪斿洖D3DERR_DEVICENOTRESET銆?br>銆銆鍙﹀錛孖Direct3DDevice9::Present涔熶細榪斿洖綾諱技鐨勫鹼紝涓嶈繃浣犳渶濂藉埆鎸囨湜榪欎釜錛岃佽佸疄瀹炵殑鐢═estCooperativeLevel銆傚洜涓篜resent鍦ㄨ澶囧彲浠ユ仮澶嶇殑鏃跺欒繕鏄繑鍥濪3DERR_DEVICELOST錛堝涓鍙ワ細D3D10鐨勬椂鍊橳estCooperativeLevel灝變細瀹屽叏鏁村悎鍒癙resent閲岄潰浜嗭紝鍙枩鍙春鍙枩鍙春錛?br>
銆庡鐞嗚澶囦涪澶便?br>
銆銆鐪嬩笅闈㈢殑浼唬鐮侊細

switch (IDirect3DDevice9::TestCooperativeLevel()){
銆銆case D3D_OK:
銆銆銆銆GameLoop();
銆銆銆銆break;
銆銆case D3DERR_DEVICELOST:
銆銆銆銆break;
銆銆case D3DERR_DEVICENOTRESET
銆銆銆銆OnLostDevice();
銆銆銆銆IDirect3DDevice9::Reset();
銆銆銆銆OnResetDevice();
銆銆銆銆break;
銆銆default:
銆銆銆銆QuitGame();
銆銆銆銆break;
}

銆銆GameLoop()灝辨槸浣犵殑娓告垙榪愯鐨勮繃紼嬩簡銆傛妸榪欎釜switch鍐欏湪鎴戜滑娓告垙妗嗘灦鐨凣ameMain()閮ㄥ垎錛屽叿浣撶殑浣嶇疆鍙互鐪嬩換浣曚竴璇濋檮甯︾殑婧愪唬鐮併?br>銆銆濂藉儚鎴戜竴鐩存病鏈夎IDirect3DDevice9::Reset鐨勫弬鏁板晩錛熷洜涓哄彧鏈変竴涓弬鏁幫紝灝辨槸鎸囧悜D3DPRESENT_PARAMS鐨勬寚閽堛傛妸浣犵涓嬈″垱寤鴻澶囨椂浣跨敤鐨凞3DPRESENT_PARAMS緇撴瀯淇濆瓨璧鋒潵錛屼緵Reset鏉ョ敤銆?br>銆銆OnLostDevice()灝辨槸Release鎺夋墍鏈塂3DPOOL_DEFAULT鐨勮祫婧愶紝OnResetDevice()灝辨槸Create*()鎭㈠鍟︼紒浣犲彲鑳芥敞鎰忓埌ID3DXFont銆両D3DXSprite絳夌瓑閮芥湁鍚屽悕鐨勬柟娉曪紝灝辨槸鍦ㄨ繖涓椂鍊欒皟鐢ㄧ殑銆傚鏋滀綘娌℃湁榪欎箞鍋氾紝涔熷氨鏄榪樹繚鐣欑潃浠諱綍D3DPOOL_DEFAULT鐨勮祫婧愮殑璇濓紝IDirect3DDevice9::Reset灝變竴瀹氫細澶辮觸銆?br>銆銆鍙﹀鍦∣nResetDevice閲岄潰浣犺繕瑕侀噸鏂拌繘琛?font size=+0>SetRenderState銆?font size=+0>SetSamplerState絳夌瓑錛孯eset涔嬪悗榪欎簺涓滆タ涔熶涪澶變簡銆傚疄闄呬笂Reset鍜岄噸鏂板垱寤轟竴嬈¤澶囩被浼鹼紝鎵涓嶅悓鐨勬槸閲嶆柊鍒涘緩璁懼鐨勮瘽浣犻渶瑕佽繛D3DPOOL_MANAGED鐨勮祫婧愪篃Release鎺夈傝繖涓瘽棰樺氨涓嶈璁轟簡銆?br>銆銆浠庝唬鐮佸彲浠ョ湅鍑烘潵錛孌3DERR_DEVICELOST鏃剁▼搴忎粈涔堥兘娌″仛錛屽彧鏄湪鍌葷瓑銆傛垜璁や負榪欐槸涓涓ソ涔犳儻錛屽洜涓哄疄鍦ㄤ笉鑳戒繚璇佸湪D3DERR_DEVICELOST鏃墮櫎浜哛elease榪樿兘騫蹭粈涔堬紝涓庡叾榪欐牱榪樹笉濡傜瓑璁懼鑳界敤浜嗗啀璇淬?br>
銆銆瀹炲湪鎳掑緱綆¤祫婧愮殑璇濓紝鍏ㄩ儴D3DPOOL_MANAGED濂戒簡銆傝嚦浜庢覆鏌撳璞★紵鑷繁鎯沖姙娉曘?br>
銆庝漢宸ュ埗閫?#8220;璁懼涓㈠け”銆?br>
銆銆“騫插槢榪樿鍒墮犺澶囦涪澶卞晩錛?#8221;濡傛灉鏇存敼娓告垙鍒嗚鯨鐜囥佽壊娣便佸垏鎹㈠叏灞忓箷鍙婄獥鍙g姸鎬侊紝榪涜榪欐牱鐨勬搷浣滀篃瑕侀氳繃Reset錛屽悓鏍風殑錛孯eset涔嬪墠涔熻閲婃斁鎺夋墍鏈塂3DPOOL_DEFAULT璧勬簮錛堝叾瀹炰弗鏍兼潵璇達紝榪樻湁鏇村鐨勮祫婧愪篃瑕侀噴鏀撅紝涓嶈繃鍦?D涓嬪熀鏈笉浼氬垱寤鴻繖綾昏祫婧愶紝浣犲氨涓嶇敤綆′簡錛夊茍涓旇皟鐢↖D3DXSprite::OnLostDevice涔嬬被鐨勬柟娉曘傝繖灝辨槸浜哄伐鍒墮?#8220;璁懼涓㈠け”浜嗐傚疄闄呬笂鍦ㄨ繖涓繃紼嬭澶囧茍娌℃湁鐪熸鐨勪涪澶憋紝鍙槸浼氭湁涓孌墊椂闂村浜庝笉鍙敤鐨勭姸鎬侊紝姝ゆ椂Reset灝氭湭榪斿洖錛屾暣涓狣3D璁懼灝卞ソ鍍忔浜嗕竴鏍楓備婦涓緥瀛愶紝浣犲垏鎹㈡闈㈠垎杈ㄧ巼錛屼細鏈夐偅涔堜竴孌墊椂闂存樉紺哄櫒涓婁粈涔堥兘涓嶆樉紺猴紝鐒跺悗寰堝揩灝辨甯鎬簡銆傚拰榪欎釜鐜拌薄鏄悓涓涓師鍥犮俁eset鎴愬姛鍚庤寰楁仮澶嶈祫婧愩?br>銆銆浣犲彲鑳芥敞鎰忓埌榪欓噷鐨凴eset鍜屼笂闈㈢殑Reset涓嶆槸涓鍥炰簨銆傜殑紜槸榪欐牱錛岃繖閲屾槸涓轟簡閲嶈鐘舵佽屼笉鏄仮澶嶈澶囥傚洜姝ゆ洿鏀瑰垎杈ㄧ巼銆佽壊娣辯殑Reset闇瑕佸啓鍒皊witch澶栭潰錛屼篃灝辨槸鍒拰瀹冩悈鍜岀殑鎰忔?_-bb銆傝屼笖浣犲彧闇瑕丱nLostDevice -> Reset -> OnResetDevice銆傝浣忥細姝g‘鐨勮皟鐢≧eset涓嶄細閫犳垚璁懼涓㈠け錛岃繖涓蹇靛埆寮勬販浜嗐?br>
銆庡垏鎹㈠叏灞忓箷妯″紡鏃剁殑娉ㄦ剰浜嬮」銆?br>
銆銆娉ㄦ剰WindowStyle鐨勫彉鍖栥傚垏鎹㈡垚鍏ㄥ睆騫曟ā寮忓悗錛屽彧鑳戒嬌鐢╓S_POPUP錛屼笉鐒舵樉紺轟細鍙樺緱鎬殑錛屼綘鍙互閫氳繃SetWindowLongPtr鍑芥暟鏇存敼紿楀彛澶栬錛岀浜屼釜鍙傛暟鎸囧畾GWL_STYLE鍗沖彲銆傚埆蹇樹簡WS_VISIBLE鍟婏紒涓嶇劧浣犱粈涔堥兘鐪嬩笉瑙併?br>
銆庢洿璇︾粏鐨勬枃妗c?br>
銆銆鎴戣繖閲屽彧鏄畝鍗曡璁轟簡閫犳垚璁懼涓㈠け鐨勫師鍥犲強澶勭悊鏂規硶錛屾洿璇︾粏鐨勫唴瀹逛綘鍙互鍙傝僁X SDK鏂囨。鐨凩ost Device鏂囩珷錛屼漢瀹舵槸鏉冨▉鐨勩?br>
銆愪互涓婏紝姝g墖緇撴潫錛屽悗闈㈡槸ED銆?br>
銆銆鎴戜滑鍓嶈繘鍒頒簡D3D9錛岃刀涓婁簡鏃朵唬銆?br>銆銆鎴戜滑鍒涘緩浜嗗叏灞忓箷娓告垙錛岃刀涓婁簡鏃朵唬銆?br>銆銆鎴戝嵈鍙樺緱涓鑴戝瓙嫻嗙硦錛岃瑙備紬鎶涘純浜嗐?br>銆銆鍝堝搱錛屽紑鐜╃瑧鍟︼紝涓嶈繃榪欎竴璇濆緢涔卞掓槸鐪熺殑錛屽洜涓轟笉璁烘槸鏇存柊鍒癉3D9榪樻槸璁懼涓㈠け錛岀壍鎵殑涓滆タ閮藉お鏁eお鏉傦紝緇撴灉寮勫緱榪欎竴璇濅篃鏄竴鐩樻暎娌欙紙灞呯劧鍙堟病鏈夐檮甯︿唬鐮侊級銆傚攭錛屽ぇ瀹跺氨蹇嶄簡鍚э紝蹇嶄笉浜嗙殑璇濆氨鏉IA鎴戝惂銆?br>
銆銆鍏充簬鏇存柊鑷矰3D9鏇村鐨勫唴瀹癸紝浣犲彲浠ュ弬鑰僑DK鏂囨。鐨勩奀onverting to Direct3D 9銆嬨?br>
銆愪互涓婏紝ED緇撴潫錛屽悗闈㈡槸……銆?br>
銆銆絎竴瀛e畬緇撲簡……
銆銆鍥炶繃澶存潵鐪嬬湅錛屼粠絎竴璇濆垱寤轟竴涓猈indows紿楀彛錛屽埌榪欎竴璇濈殑璁懼涓㈠け錛岃瘽棰樼殑灞傛涓鐩村湪娣卞叆錛岀幇鍦ㄥ凡緇忔繁鍏ュ埌浜嗕笉鍐嶆槸“瀛︿範”鑰屾槸“鐮旂┒”鐨勮寖鍥淬傛垜涔熶笉鍐嶆兂浠呬粎鏄悶“鏁欏”鑰屾槸鎯沖拰澶у“璁ㄨ”銆備笉榪囩涓瀛d富瑕佽繕鏄暀瀛﹀惂銆傝兘鍧氭寔鐫鐪婦2D鏁欑▼鍒扮幇鍦ㄧ殑錛屽簲璇ュ熀鏈兘澶熷啓鍑哄畬鏁寸殑2D Demo鏉ヤ簡鍚с傚鏋滄湁浠涔堥棶棰樼殑璇濓紝嬈㈣繋鎻愬嚭錛屾垜鍦ㄧ湅鍒板悗浼氱珛鍒誨洖絳旂殑……鍙浣犺繖涓棶棰樹笉澶猂P鐨勮瘽……
銆銆閭d箞錛岀浜屽浼氭槸浠涔堟牱瀛愶紵
銆銆絎簩瀛e氨涓嶅啀鏄暀瀛︿簡錛岃屽紑濮嬫垜鍜屽ぇ瀹剁殑璁ㄨ榪囩▼銆傜浜屽鐨勭涓璇濓紝涔熷氨鏄09璇濓紝鎴戝皢鎻愪緵涓浜涢珮綰ф妧宸х粰澶у錛屽茍甯屾湜鏈夊叴瓚g殑鏈嬪弸鍜屾垜涓璧瘋繘琛岃繖浜涙妧宸х殑鐮旂┒銆傚彟澶栧湪絎簩瀛i噷闈紝鎴戜滑榪樿鍒涘緩涓涓?D鍥懼艦寮曟搸銆傚師鏉ユ墦綆楃粰澶у璁茶ВMedux 2錛屼笉榪囩幇鍦ㄦ劅瑙夎繖涓滆タ瀹炲湪灝忓効縐戯紝緇濆浼氳澶уB4鐨勩傞偅涔堟棦鐒跺姝わ紝騫茶剢浠嬬粛Mercury 3濂戒簡錛屾湁鎰忚鏃狅紵
銆銆閫忔紡涓鐐逛笅涓璇濈殑鍐呭鍚э細妯$硦綺懼害鍜屽嬈$汗鐞嗘覆鏌擄紝鍢垮樋錛屽惉涓婂幓鎸洪珮娣辯殑鏄笉錛熷疄闄呬笂瓚呯駭綆鍗曪紝灝辯湅浣犺兘涓嶈兘鎯沖埌鑰屽凡銆?br>銆銆甯屾湜浣犲湪鐪嬪畬榪欎竴璇濅箣鍚庯紝榪斿洖鍘誨啀鎶婂墠闈㈢殑鍐呭鐪嬬湅錛岀浉淇′綘浼氬緱鍒版柊鐨勬敹鑾楓傛悶涓嶅ソ浣犺繕鑳芥姄鍑哄嚑涓狟ug鍛紒鍥犱負鎴戞槸鎯沖埌浠涔堝啓浠涔堬紝娌′釜绔犳硶錛孊ug鏄毦鍏嶇殑銆?br>
 


闄勫姞:

Direct3D涓殑瀛椾綋涓庢枃鏈樉紺?br>
鍥懼艦緋葷粺涓負浜嗚幏寰楀綋鍓嶈繍琛岀▼搴忕殑鐩稿叧淇℃伅錛屽線寰闇瑕佸湪灞忓箷涓婃樉紺烘枃鏈紝Direct3D鐨勫姛鑳芥墿灞曟帴鍙D3DXFont瀵規鎻愪緵浜嗘柟渚跨殑瑙e喅鏂規硶銆?

 

 

鍒涘緩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);



RedLight 2009-09-12 15:40 鍙戣〃璇勮
]]>
浼樺寲3D鍥懼艦娓叉煋閫氶亾璐熻澆(杞?http://www.shnenglu.com/flashboy/archive/2009/09/01/94944.htmlRedLightRedLightTue, 01 Sep 2009 01:32:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/09/01/94944.htmlhttp://www.shnenglu.com/flashboy/comments/94944.htmlhttp://www.shnenglu.com/flashboy/archive/2009/09/01/94944.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/94944.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/94944.html
銆銆 涓鑸湪鍏夋爡鍖栦箣鍓嶇殑鐡墮縐頒綔”transform bound”, 涓夎褰㈣緗鐞嗗悗鐨勭摱棰堢О浣?#8221;fill bound”瀹氫綅鐡墮鐨勫姙娉?
  • 1.鏀瑰彉甯х紦鍐叉垨鑰呮覆鏌撶洰鏍?Render Target)鐨勯鑹叉繁搴?16 鍒?32 浣?, 濡傛灉甯ч熸敼鍙樹簡, 閭d箞鐡墮搴旇鍦ㄥ撫緙撳啿(RenderTarget)鐨勫~鍏呯巼涓娿?
  • 2.鍚﹀垯璇曡瘯鏀瑰彉璐村浘澶у皬鍜岃創鍥捐繃婊よ緗? 濡傛灉甯ч熷彉浜?閭d箞鐡墮搴旇鏄湪璐村浘榪欓噷銆?
  • 3.鍚﹀垯鏀瑰彉鍒嗚鯨鐜?濡傛灉甯ч熸敼鍙樹簡, 閭d箞鏀瑰彉涓涓媝ixel shader鐨勬寚浠ゆ暟閲? 濡傛灉甯ч熷彉浜? 閭d箞鐡墮搴旇灝辨槸pixel shader. 鍚﹀垯鐡墮灝卞湪鍏夋爡鍖栬繃紼嬩腑銆?
  • 4.鍚﹀垯, 鏀瑰彉欏剁偣鏍煎紡鐨勫ぇ灝? 濡傛灉甯ч熸敼鍙樹簡, 閭d箞鐡墮搴旇鍦ㄦ樉鍗″甫瀹戒笂銆?
  • 5.濡傛灉浠ヤ笂閮戒笉鏄? 閭d箞鐡墮灝卞湪CPU榪欎竴杈廣?
  • 浼樺寲鏂規硶36鏉?
  • 1.灝介噺鍑忓皯鏃犵敤鐨勯《鐐規暟鎹? 姣斿璐村浘鍧愭爣, 濡傛灉鏈塐bject浣跨敤2緇勬湁鐨勪嬌鐢?緇? 閭d箞涓?瑕佸皢浠栦滑鏀懼湪涓涓獀ertex buffer涓? 榪欐牱鍙互鍑忓皯浼犺緭鐨勬暟鎹噺銆?
  • 2.浣跨敤澶氫釜streamsource, 姣斿SkinMesh娓叉煋, 鍙互鎶婇《鐐瑰潗鏍囧拰娉曠嚎榪欎簺姣忎竴甯ч兘瑕佷慨鏀圭殑鏁版嵁鏀懼湪涓涓姩鎬乂B涓? 鍏跺畠涓嶉渶瑕佷慨鏀圭殑(濡傝創鍥懼潗鏍?鏀懼埌涓涓潤鎬乂B涓? 榪欐牱灝卞噺灝戜簡鏁版嵁浼犺緭閲忋?
  • 3.灝介噺浣跨敤16浣嶇殑绱㈠紩緙撳啿,閬垮厤32浣嶇殑. 涓鏂歸潰嫻垂甯﹀, 涓鏂歸潰涔熶笉鏄墍鏈夌殑鏄懼崱閮芥敮鎸?2浣嶇殑绱㈠紩緙撳啿銆?
  • 4.鍙互鑰冭檻浣跨敤vertex shader鏉ヨ綆楅潤鎬乂B涓殑鏁版嵁.姣斿SkinMesh鐨勯《鐐瑰彲浠ユ斁鍒皏ectex shader涓綆? 榪欐牱灝卞彲浠ラ伩鍏嶆瘡涓甯ч兘浠嶢GP鍐呭瓨涓悜鏄懼瓨浼犻佹暟鎹? 榪欐牱涔熷彲浠ヤ嬌鐢ㄩ潤鎬乂B浜嗐?
  • 5.鍧氬喅閬垮厤浣跨敤Draw**UP涓鏃忕殑鍑芥暟鏉ョ粯鍒跺杈瑰艦銆?
  • 6.鍦ㄨ璁$▼搴忎箣鍓嶅ソ濂借鍒掍竴涓嬫樉鍗″唴瀛樼殑浣跨敤, 紜繚framebuffer, 璐村浘, 闈欐乂B鑳藉姝eソ鏀懼叆鏄懼崱鐨勬湰鍦板唴瀛樹腑銆?
  • 7.灝介噺浣塊《鐐規牸寮忓ぇ灝忔槸32瀛楄妭鐨勫嶆暟.鍙互鑰冭檻浣跨敤鍘嬬緝榪囩殑欏剁偣鏍煎紡鐒跺悗鐢╲ertex shader鍘昏В. 鎴栬呯暀涓嬪啑浣欑殑閮ㄥ垎, 浣塊《鐐瑰ぇ灝忓垰濂戒嬌32瀛楄妭鐨勫嶆暟銆?br>
  • 8.欏剁偣鍦ㄩ《鐐圭紦鍐蹭腑鐨勯『搴忓敖閲忕鍚堢粯鍒剁殑欏哄簭, 鑰冭檻浣跨敤strips鏉ヤ唬鏇縧ist銆?
  • 9.濡傛灉鍙兘灝介噺澶氱殑浣跨敤static vertex buffer浠f浛dynamic vertex buffer銆?
  • 10.鍔ㄦ乂B浣跨敤DISCARD鍙傛暟鏉ock鏇存柊, 浣跨敤NOOVERWRITE鏉ユ坊鍔?灝介噺涓嶈浣跨敤涓嶅甫鍙傛暟鐨刲ock璋冪敤(0)銆?
  • 11.灝介噺鍑忓皯lock鐨勬鏁? 鏈変簺涓滆タ騫朵笉涓瀹氶潪瑕佹瘡涓甯ч兘鏇存柊VB, 姣斿浜虹墿鍔ㄧ敾涓鑸瘡縐掗挓鏇存柊30嬈B鍩烘湰涓婂氨澶熶簡銆?
  • 12.濡傛灉鏄洜涓洪渶瑕佺粯鍒剁殑欏剁偣鏁版嵁澶浜嗗彲浠ヨ冭檻浣跨敤LOD, 浣嗘槸鐜板湪鐨勬樉鍗$殑緇樺埗鑳藉姏閮藉緢寮哄姴, 鎵浠ラ渶瑕佹潈琛′竴涓婰OD鏄惁鑳藉甯︽潵鐩稿簲鐨勫ソ澶? 濡傛灉榪囧垎鐨勫己鍖朙OD寰堝彲鑳藉皢鐡墮杞Щ鍒癈PU榪欒竟銆?
  • 13.閬垮厤榪囧鐨勯《鐐硅綆?姣斿榪囧鐨勫厜婧? 榪囦簬澶嶆潅鐨勫厜鐓ц綆?澶嶆潅鐨勫厜鐓фā鍨?, 綰圭悊鑷姩鐢熸垚鐨勫紑鍚篃浼氬鍔犻《鐐圭殑璁$畻閲? 濡傛灉璐村浘鍧愭爣鍙樻崲鐭╅樀涓嶆槸鍗曚綅鐭╅樀, 涔熶細閫犳垚欏剁偣璁$畻閲忕殑澧炲姞, 鎵浠ュ鏋滅汗鐞嗗彉鎹㈠凡緇忕粨鏉? 璁板緱瑕佸皢綰圭悊鍙樻崲鐭╅樀璁句負鍗曚綅鐭╅樀鍚屾椂璋冩暣璐村浘鍧愭爣銆?
  • 14.閬垮厤Vertex shader鎸囦護鏁伴噺澶鎴栬呭垎鏀繃澶? 灝介噺鍑忓皯vertex shader鐨勯暱搴﹀拰澶嶆潅紼嬪害. 灝介噺浣跨敤swizzling浠f浛mov銆?
  • 15.濡傛灉鍥捐薄璐ㄩ噺鏂歸潰鐨勮綆?pixel shader)鑼冨洿寰堝ぇ, 騫朵笖寰堝鏉? 鍙互鑰冭檻璇曡瘯鍏ㄥ睆鍙嶈蛋鏍楓傝涓嶅畾鏇村揩銆?
  • 16.灝介噺鎸夌収front – back鐨勯『搴忔潵緇樺埗銆?
  • 17.鍦╯hader涓垽鏂璟鍊煎彲浠ラ伩鍏嶇粯鍒朵笉鍙鐨勮薄绱? 浣嗘槸nvidia寤鴻綆鍗曠殑shader涓嶈榪欎箞鍋?(Don't do this in a simple shader)銆?
  • 18.濡傛灉鍙兘, 灝介噺浣跨敤vertex shader鏉ヤ唬鏇縫ixel shader.灝嗚綆椾粠閫愯薄绱犲彉鎴愰愰《鐐廣?
  • 19.灝介噺闄嶄綆璐村浘鐨勫ぇ灝?榪囧ぇ鐨勮創鍥懼彲鑳介犳垚璐村浘cache榪囪澆, 浠庤屽鑷磋創鍥綾ache鍛戒腑闄嶄綆.榪囧ぇ鐨勮創鍥句細瀵艱嚧鏄懼瓨榪囪澆, 榪欐椂鍊欒創鍥炬槸浠庣郴緇熷唴瀛樹腑鍙栫殑銆?br>
  • 20.鍙鍙兘灝辯敤16浣嶈壊鐨勮創鍥? 濡傜幆澧冭創鍥炬垨鑰卻hadow map.瀹冧滑鐢?2浣嶈壊鐨勮創鍥懼疄鍦ㄦ槸嫻垂銆?
  • 21.鑰冭檻浣跨敤DXT 璐村浘鍘嬬緝銆?
  • 22.濡傛灉鍙兘,浣跨敤綆鍗曠殑璐村浘榪囨護鎴栬卪ip map, 闄ら潪蹇呰鍚﹀垯灝介噺涓嶈浣跨敤涓夌嚎榪囨護鍜屽悇欏瑰紓鎬ц繃婊? light map 鍜?鐜璐村浘鍩烘湰涓婇兘涓嶉渶瑕佷嬌鐢ㄥ畠浠?
  • 23.鍙湁鐪熸闇瑕佷慨鏀圭殑璐村浘鎵嶄嬌鐢―ynamic, 騫朵笖浣跨敤DISCRAD鍜學RITEONLY鏉ock銆?
  • 24.澶鐨勫撫緙撳啿璇誨啓鍙互鑰冭檻鍏抽棴Z-Writes濡傛湁浜涘pass鐨勬覆鏌撲腑鐨勫悗緇璸ass鎴栬呯矑瀛愮郴緇熺瓑鍗婇忔槑鍑犱綍鐗╀綋錛堝鏋滃彲浠ワ級銆?
  • 25.鍙兘鐨勮瘽灝介噺浣跨敤alpha test浠f浛alpha blending銆?
  • 26.濡傛灉涓嶉渶瑕乻tencil buffer灝卞敖閲忎嬌鐢?6浣嶇殑Z buffer銆?
  • 27.鍑忓皬RenderTarget 璐村浘鐨勫ぇ灝? 濡俿hadow map 鐜璐村浘. 鍙兘鏍規湰涓嶉渶瑕侀偅涔堝ぇ鏁堟灉灝卞緢濂姐?
  • 28.Stencil 鍜?Z buffer 灝介噺涓璧穋lear. 浠栦滑鏈潵灝辨槸涓鍧楃紦鍐層?
  • 29.灝介噺鍑忓皯娓叉煋鐘舵佺殑鍒囨崲, 灝介噺涓嬈$敾灝藉彲鑳藉鐨勫杈瑰艦銆傦紙鏍規嵁鏄懼崱鎬ц兘鍐沖畾鏈澶氱敾澶氬皯錛?涓嶈繃涓鑸啀澶氫篃涓嶄細澶氬埌鍝噷鍘匯?闄ら潪浣犳牴鏈笉闇瑕佽創鍥懼拰娓叉煋鐘舵佺殑鍒囨崲錛夈?
  • 30.灝介噺浣跨敤shader鏉ヤ唬鏇縁ixed Pipeline銆?
  • 31.灝介噺浣跨敤shader鏉ュ疄鐜版潵鍙栦唬Multipass娓叉煋鏁堟灉銆?
  • 32.灝介噺浼樺厛鍏堝緩绔嬮噸瑕佺殑璧勬簮, 濡俁ender target, shaders, 璐村浘, VB, IB絳夌瓑.浠ュ厤鏄懼瓨榪囪澆鐨勬椂鍊欏畠浠鍒涘緩鍒扮郴緇熷唴瀛樹腑銆?
  • 33.鍧氬喅涓嶈鍦ㄦ覆鏌撳驚鐜腑璋冪敤鍒涘緩璧勬簮銆?
  • 34.鎸夌収shader鍜岃創鍥懼垎緇勫悗鍐嶆覆鏌?鍏堟寜鐓haders鍒嗙粍鍐嶆寜璐村浘銆?
  • 35.Color Stencil Z buffer灝介噺鍦ㄤ竴嬈lear璋冪敤涓竻闄ゃ?
  • 36.涓涓猇ertex buffer 鐨勫ぇ灝忓湪2M-4M涔嬮棿鏈濂姐?


RedLight 2009-09-01 09:32 鍙戣〃璇勮
]]>
OpenGL Performance Optimization(杞?http://www.shnenglu.com/flashboy/archive/2009/08/25/94364.htmlRedLightRedLightTue, 25 Aug 2009 06:05:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/08/25/94364.htmlhttp://www.shnenglu.com/flashboy/comments/94364.htmlhttp://www.shnenglu.com/flashboy/archive/2009/08/25/94364.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/94364.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/94364.htmlSIGGRAPH '97

Course 24: OpenGL and Window System Integration

OpenGL Performance Optimization



Contents



1. Hardware vs. Software

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.



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.

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.

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.

Complexity may refer to the geometric or rendering attributes of a database. Here are a few examples.

  • During interactive rotation (i.e. mouse button held down) render a reduced-polygon model. When drawing a static image draw the full polygon model.
  • During animation, disable dithering, smooth shading, and/or texturing. Enable them for the static image.
  • If texturing is required, use GL_NEAREST sampling and glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST ).
  • During animation, disable antialiasing. Enable antialiasing for the static image.
  • Use coarser NURBS/evaluator tesselation during animation. Use 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.

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.

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.

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.

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.

Our first attempt at rendering this information may be:

	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:
  • glPointSize is called for every loop iteration.
  • only one point is drawn between glBegin and glEnd
  • the vertices aren't being specified in the most efficient manner
Here's a better implementation:
	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.

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:

	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.

In the following sections the techniques for maximizing performance, as seen above, are explained.



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.

After each of the following techniques look for a bracketed list of symbols which relates the significance of the optimization to your OpenGL system:

  • H - beneficial for high-end hardware
  • L - beneficial for low-end hardware
  • S - beneficial for software implementations
  • all - probably beneficial for all implementations

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.
Use connected primitives
Connected primitives such as 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]
Use the vertex array extension
On some architectures function calls are somewhat expensive so replacing many glVertex/glColor/glNormal calls with the vertex array mechanism may be very beneficial. [all]
Store vertex data in consecutive memory locations
When maximum performance is needed on high-end systems it's good to store vertex data in contiguous memory to maximize through put of data from host memory to graphics subsystem. [H,L]
Use the vector versions of glVertex, glColor, glNormal and glTexCoord
The 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]
Reduce quantity of primitives
Be careful not to render primitives which are over-tesselated. Experiment with the GLU primitives, for example, to determine the best compromise of image quality vs. tesselation level. Textured objects in particular may still be rendered effectively with low geometric complexity. [all]
Display lists
Use display lists to encapsulate frequently drawn objects. Display list data may be stored in the graphics subsystem rather than host memory thereby eliminating host-to-graphics data movement. Display lists are also very beneficial when rendering remotely. [all]
Don't specify unneeded per-vertex information
If lighting is disabled don't call glNormal. If texturing is disabled don't call glTexCoord, etc.
Minimize code between glBegin/glEnd
For maximum performance on high-end systems it's extremely important to send vertex data to the graphics system as fast as possible. Avoid extraneous code between glBegin/glEnd.

Example:

	glBegin( GL_TRIANGLE_STRIP );
for (i=0; i < n; i++) {
if (lighting) {
glNormal3fv( norm[i] );
}
glVertex3fv( vert[i] );
}
glEnd();

This is a very bad construct. The following is much better:

	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.

Lighting
  • Avoid using positional lights, i.e. light positions should be of the form (x,y,z,0) [L,S]
  • Avoid using spotlights. [all]
  • Avoid using two-sided lighting. [all]
  • Avoid using negative material and light color coefficients [S]
  • Avoid using the local viewer lighting model. [L,S]
  • Avoid frequent changes to the GL_SHININESS material parameter. [L,S]
  • Some OpenGL implementations are optimized for the case of a single light source.
  • Consider pre-lighting complex objects before rendering, ala radiosity. You can get the effect of lighting by specifying vertex colors instead of vertex normals. [S]
Two sided lighting
If you want both the front and back of polygons shaded the same try using two light sources instead of two-sided lighting. Position the two light sources on opposite sides of your object. That way, a polygon will always be lit correctly whether it's back or front facing. [L,S]
Disable normal vector normalization when not needed
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]
Use connected primitives
Connected primitives such as GL_LINES, GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, and GL_QUAD_STRIP decrease traversal and transformation load.
glRect usage
If you have to draw many rectangles consider using 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.
Disable smooth shading when not needed
Smooth shading is enabled by default. Flat shading doesn't require interpolation of the four color components and is usually faster than smooth shading in software implementations. Hardware may perform flat and smooth-shaded rendering at the same rate though there's at least one case in which smooth shading is faster than flat shading (E&S Freedom). [S]
Disable depth testing when not needed
Background objects, for example, can be drawn without depth testing if they're drawn first. Foreground objects can be drawn without depth testing if they're drawn last. [L,S]
Disable dithering when not needed
This is easy to forget when developing on a high-end machine. Disabling dithering can make a big difference in software implementations of OpenGL on lower-end machines with 8 or 12-bit color buffers. Dithering is enabled by default. [S]
Use back-face culling whenever possible.
If you're drawing closed polyhedra or other objects for which back facing polygons aren't visible there's probably no point in drawing those polygons. [all]
The GL_SGI_cull_vertex extension
SGI's Cosmo GL supports a new culling extension which looks at vertex normals to try to improve the speed of culling.
Avoid extra fragment operations
Stenciling, blending, stippling, alpha testing and logic ops can all take extra time during rasterization. Be sure to disable the operations which aren't needed. [all]
Reduce the window size or screen resolution
A simple way to reduce rasterization time is to reduce the number of pixels drawn. If a smaller window or reduced display resolution are acceptable it's an easy way to improve rasterization speed. [L,S]

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.
Use efficient image formats
The 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]
Encapsulate texture maps in texture objects or display lists
This is especially important if you use several texture maps. By putting textures into display lists or texture objects the graphics system can manage their storage and minimize data movement between the client and graphics subsystem. [all]
Use smaller texture maps
Smaller images can be moved from host to texture memory faster than large images. More small texture can be stored simultaneously in texture memory, reducing texture memory swapping. [all]
Use simpler sampling functions
Experiment with the minification and magnification texture filters to determine which performs best while giving acceptable results. Generally, GL_NEAREST is fastest and GL_LINEAR is second fastest. [all]
Use the same sampling function for minification and magnification
If both the minification and magnification filters are 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.
Use a simpler texture environment function
Some texture environment modes may be faster than others. For example, the 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]
Combine small textures
If you are using several small textures consider tiling them together as a larger texture and modify your texture coordinates to address the subtexture you want. This technique can eliminate texture bindings.
Use glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST)
This hint can improve the speed of texturing when perspective- correct texture coordinate interpolation isn't needed, such as when using a glOrtho() projection.
Animated textures
If you want to use an animated texture, perhaps live video textures, don't use 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.
Use glClear carefully [all]
Clear all relevant color buffers with one glClear.

Wrong:

  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 );
}
Disable dithering
Disable dithering before clearing the color buffer. Visually, the difference between dithered and undithered clears is usually negligable.
Use scissoring to clear a smaller area
If you don't need to clear the whole buffer use glScissor() to restrict clearing to a smaller area. [L].
Don't clear the color buffer at all
If the scene you're drawing opaquely covers the entire window there is no reason to clear the color buffer.
Eliminate depth buffer clearing
If the scene you're drawing covers the entire window there is a trick which let's you omit the depth buffer clear. The idea is to only use half the depth buffer range for each frame and alternate between using GL_LESS and GL_GREATER as the depth test function.

Example:

   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 */
}
Avoid glClearDepth( d ) where d!=1.0
Some software implementations may have optimized paths for clearing the depth buffer to 1.0. [S]

3.6 Miscellaneous

Avoid "round-trip" calls
Calls such as glGetFloatv, glGetIntegerv, glIsEnabled, glGetError, glGetString require a slow, round trip transaction between the application and renderer. Especially avoid them in your main rendering code.

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]

Avoid glPushAttrib
If only a few pieces of state need to be saved and restored it's often faster to maintain the information in the client program. 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]
Check for GL errors during development
During development call 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]
Use glColorMaterial instead of glMaterial
If you need to change a material property on a per vertex basis, glColorMaterial may be faster than glMaterial. [all]
glDrawPixels
  • glDrawPixels often performs best with GL_UNSIGNED_BYTE color components [all]
  • Disable all unnecessary raster operations before calling glDrawPixels. [all]
  • Use the GL_EXT_abgr extension to specify color components in alpha, blue, green, red order on systems which were designed for IRIS GL. [H,L].
Avoid using viewports which are larger than the window
Software implementations may have to do additional clipping in this situation. [S]
Alpha planes
Don't allocate alpha planes in the color buffer if you don't need them. Specifically, they are not needed for transparency effects. Systems without hardware alpha planes may have to resort to a slow software implementation. [L,S]
Accumulation, stencil, overlay planes
Do not allocate accumulation, stencil or overlay planes if they are not needed. [all]
Be aware of the depth buffer's depth
Your OpenGL may support several different sizes of depth buffers- 16 and 24-bit for example. Shallower depth buffers may be faster than deep buffers both for software and hardware implementations. However, the precision of of a 16-bit depth buffer may not be sufficient for some applications. [L,S]
Transparency may be implemented with stippling instead of blending
If you need simple transparent objects consider using polygon stippling instead of alpha blending. The later is typically faster and may actually look better in some situations. [L,S]
Group state changes together
Try to mimimize the number of GL state changes in your code. When GL state is changed, internal state may have to be recomputed, introducing delays. [all]
Avoid using glPolygonMode
If you need to draw many polygon outlines or vertex points use 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

Minimize calls to the make current call
The 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.
Visual / pixel format performance
Some X visuals or pixel formats may be faster than others. On PCs for example, 24-bit color buffers may be slower to read/write than 12 or 8-bit buffers. There is often a tradeoff between performance and quality of frame buffer configurations. 12-bit color may not look as nice as 24-bit color. A 16-bit depth buffer won't have the precision of a 24-bit depth buffer.

The 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.

It may be worthwhile to experiment with different visuals to determine if there's any advantage of one over another.

Avoid mixing OpenGL rendering with native rendering
OpenGL allows both itself and the native window system to render into the same window. For this to be done correctly synchronization is needed. The GLX glXWaitX and glXWaitGL functions serve this purpose.

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 glXWaitGL to synchronize, then call all the X drawing functions.

Don't redraw more than necessary
Be sure that you're not redrawing your scene unnecissarily. For example, expose/repaint events may come in batches describing separate regions of the window which must be redrawn. Since one usually redraws the whole window image with OpenGL you only need to respond to one expose/repaint event. In the case of X, look at the count field of the XExposeEvent structure. Only redraw when it is zero.

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.

SwapBuffer calls and graphics pipe blocking
On systems with 3-D graphics hardware the SwapBuffers call is synchronized to the monitor's vertical retrace. Input to the OpenGL command queue may be blocked until the buffer swap has completed. Therefore, don't put more OpenGL calls immediately after SwapBuffers. Instead, put application computation instructions which can overlap with the buffer swap delay.

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.

Double buffering
The X driver supports two back color buffer implementations: Pixmaps and XImages. The MESA_BACK_BUFFER environment variable controls which is used. Which of the two that's faster depends on the nature of your rendering. Experiment.
X Visuals
As described above, some X visuals can be rendered into more quickly than others. The MESA_RGB_VISUAL environment variable can be used to determine the quickest visual by experimentation.
Depth buffers
Mesa may use a 16 or 32-bit depth buffer as specified in the src/config.h configuration file. 16-bit depth buffers are faster but may not offer the precision needed for all applications.
Flat-shaded primitives
If one is drawing a number of flat-shaded primitives all of the same color the glColor command should be put before the glBegin call.

Don't do this:

	glBegin(...);
glColor(...);
glVertex(...);
...
glEnd();

Do this:

	glColor(...);
glBegin(...);
glVertex(...);
...
glEnd();
glColor*() commands
The glColor[34]ub[v] are the fastest versions of the glColor command.
Avoid double precision valued functions
Mesa does all internal floating point computations in single precision floating point. API functions which take double precision floating point values must convert them to single precision. This can be expensive in the case of glVertex, glNormal, etc.


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.

Performance evaluation is a large subject and only the basics are covered here. For more information see "OpenGL on Silicon Graphics Systems".

4.1 Pipeline tuning

The graphics system can be divided into three subsystems for the purpose of performance evaluation:
  • CPU subsystem - application code which drives the graphics subsystem
  • Geometry subsystem - transformation of vertices, lighting, and clipping
  • Rasterization subsystem - drawing filled polygons, line segments and per-pixel processing
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.

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.

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.

Measure the performance of rendering in single buffer mode to determine how far you really are from your target frame rate.

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.




RedLight 2009-08-25 14:05 鍙戣〃璇勮
]]>
Loading and displaying .X files without DirectX ----OpenGL娓叉煋(杞?http://www.shnenglu.com/flashboy/archive/2009/05/20/83507.htmlRedLightRedLightWed, 20 May 2009 12:15:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/05/20/83507.htmlhttp://www.shnenglu.com/flashboy/comments/83507.htmlhttp://www.shnenglu.com/flashboy/archive/2009/05/20/83507.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/83507.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/83507.html闃呰鍏ㄦ枃

RedLight 2009-05-20 20:15 鍙戣〃璇勮
]]>
鍦ㄩ潰璇曚竴涓父鎴忕紪紼嬭亴浣嶅墠,浣犻渶瑕佺煡閬撶殑涓滆タ(杞?http://www.shnenglu.com/flashboy/archive/2009/01/04/71169.htmlRedLightRedLightSun, 04 Jan 2009 14:02:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/01/04/71169.htmlhttp://www.shnenglu.com/flashboy/comments/71169.htmlhttp://www.shnenglu.com/flashboy/archive/2009/01/04/71169.html#Feedback2http://www.shnenglu.com/flashboy/comments/commentRss/71169.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/71169.html闃呰鍏ㄦ枃

RedLight 2009-01-04 22:02 鍙戣〃璇勮
]]>
浣跨敤鍏夌収鏉ヨ〃鐜扮珛浣撴劅(杞?http://www.shnenglu.com/flashboy/archive/2009/01/03/71060.htmlRedLightRedLightSat, 03 Jan 2009 05:59:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/01/03/71060.htmlhttp://www.shnenglu.com/flashboy/comments/71060.htmlhttp://www.shnenglu.com/flashboy/archive/2009/01/03/71060.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/71060.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/71060.html闃呰鍏ㄦ枃

RedLight 2009-01-03 13:59 鍙戣〃璇勮
]]>
浣跨敤娣峰悎鏉ュ疄鐜板崐閫忔槑鏁堟灉 http://www.shnenglu.com/flashboy/archive/2009/01/03/71057.htmlRedLightRedLightSat, 03 Jan 2009 05:45:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/01/03/71057.htmlhttp://www.shnenglu.com/flashboy/comments/71057.htmlhttp://www.shnenglu.com/flashboy/archive/2009/01/03/71057.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/71057.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/71057.html闃呰鍏ㄦ枃

RedLight 2009-01-03 13:45 鍙戣〃璇勮
]]>
綰圭悊鐨勪嬌鐢ㄥ叆闂?/title><link>http://www.shnenglu.com/flashboy/archive/2009/01/03/71056.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Sat, 03 Jan 2009 05:43:00 GMT</pubDate><guid>http://www.shnenglu.com/flashboy/archive/2009/01/03/71056.html</guid><wfw:comment>http://www.shnenglu.com/flashboy/comments/71056.html</wfw:comment><comments>http://www.shnenglu.com/flashboy/archive/2009/01/03/71056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flashboy/comments/commentRss/71056.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flashboy/services/trackbacks/71056.html</trackback:ping><description><![CDATA[     鎽樿:   <a href='http://www.shnenglu.com/flashboy/archive/2009/01/03/71056.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/flashboy/aggbug/71056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flashboy/" target="_blank">RedLight</a> 2009-01-03 13:43 <a href="http://www.shnenglu.com/flashboy/archive/2009/01/03/71056.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>OpenGL鐗囨柇嫻嬭瘯http://www.shnenglu.com/flashboy/archive/2009/01/03/71055.htmlRedLightRedLightSat, 03 Jan 2009 05:42:00 GMThttp://www.shnenglu.com/flashboy/archive/2009/01/03/71055.htmlhttp://www.shnenglu.com/flashboy/comments/71055.htmlhttp://www.shnenglu.com/flashboy/archive/2009/01/03/71055.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/71055.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/71055.html闃呰鍏ㄦ枃

RedLight 2009-01-03 13:42 鍙戣〃璇勮
]]>
Opengl緙栫▼浣庣駭閿欒 (杞澆)http://www.shnenglu.com/flashboy/archive/2008/09/27/62913.htmlRedLightRedLightSat, 27 Sep 2008 09:13:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/09/27/62913.htmlhttp://www.shnenglu.com/flashboy/comments/62913.htmlhttp://www.shnenglu.com/flashboy/archive/2008/09/27/62913.html#Feedback1http://www.shnenglu.com/flashboy/comments/commentRss/62913.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/62913.html闃呰鍏ㄦ枃

RedLight 2008-09-27 17:13 鍙戣〃璇勮
]]>
鍦板艦鍏變韓闈㈢殑欏剁偣娉曠嚎鐨勮綆?/title><link>http://www.shnenglu.com/flashboy/archive/2008/09/19/62263.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Fri, 19 Sep 2008 03:45:00 GMT</pubDate><guid>http://www.shnenglu.com/flashboy/archive/2008/09/19/62263.html</guid><wfw:comment>http://www.shnenglu.com/flashboy/comments/62263.html</wfw:comment><comments>http://www.shnenglu.com/flashboy/archive/2008/09/19/62263.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flashboy/comments/commentRss/62263.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flashboy/services/trackbacks/62263.html</trackback:ping><description><![CDATA[     鎽樿:   <a href='http://www.shnenglu.com/flashboy/archive/2008/09/19/62263.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/flashboy/aggbug/62263.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flashboy/" target="_blank">RedLight</a> 2008-09-19 11:45 <a href="http://www.shnenglu.com/flashboy/archive/2008/09/19/62263.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>楠ㄩ鍔ㄧ敾瑙i噴(杞?http://www.shnenglu.com/flashboy/archive/2008/09/19/62260.htmlRedLightRedLightFri, 19 Sep 2008 03:18:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/09/19/62260.htmlhttp://www.shnenglu.com/flashboy/comments/62260.htmlhttp://www.shnenglu.com/flashboy/archive/2008/09/19/62260.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/62260.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/62260.html闃呰鍏ㄦ枃

RedLight 2008-09-19 11:18 鍙戣〃璇勮
]]>
鏁欎綘濡備綍浣跨敤maxscript璋冭瘯鍣?杞澆)http://www.shnenglu.com/flashboy/archive/2008/09/19/62239.htmlRedLightRedLightFri, 19 Sep 2008 00:33:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/09/19/62239.htmlhttp://www.shnenglu.com/flashboy/comments/62239.htmlhttp://www.shnenglu.com/flashboy/archive/2008/09/19/62239.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/62239.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/62239.html 鏁欎綘濡備綍浣跨敤maxscript璋冭瘯鍣?/strong>
浣滆?鏉庤嫳姹?#160;(杞澆)

 

銆銆灝辨垜涓漢鏉ヨ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>

RedLight 2008-09-19 08:33 鍙戣〃璇勮
]]>
鍩轟簬鍥涘弶鏍戠┖闂村垝鍒嗙殑鍦板艦瀹炴椂娓叉煋鏂規硶http://www.shnenglu.com/flashboy/archive/2008/05/11/49572.htmlRedLightRedLightSun, 11 May 2008 13:54:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/05/11/49572.htmlhttp://www.shnenglu.com/flashboy/comments/49572.htmlhttp://www.shnenglu.com/flashboy/archive/2008/05/11/49572.html#Feedback1http://www.shnenglu.com/flashboy/comments/commentRss/49572.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/49572.html    鍦板艦娓叉煋涓鐩翠互鏉ラ兘鏄綆楁満鍥懼艦瀛︿腑涓涓噸瑕佺殑鐮旂┒棰嗗煙銆傚茍涓斿湪榪欎竴鏂歸潰宸茬粡璇炵敓浜嗚澶氫紭縐鐨勭畻娉曘傚叾涓寘鎷熀浜庝綋绱犵殑娓叉煋鏂規硶錛屼篃鏈夊熀浜庡杈瑰艦鐨勬覆鏌撴柟娉曘傛棭鏈熺殑娓告垙錛屽涓夎媧茬壒縐嶉儴闃熷氨鏄噰鐢ㄤ綋绱犳覆鏌撴硶鐨勬垚鍔熶緥瀛愩備綋绱犳硶綾諱技鍏夌嚎榪借釜娓叉煋錛屽畠浠庡睆騫曠┖闂村嚭鍙戯紝鎵懼埌鍦板艦涓庡睆騫曞儚绱犲彂鍑虹殑灝勭嚎浜ょ偣錛岀劧鍚庣‘瀹氳鍍忕礌鐨勯鑹層傝繖縐嶆柟娉曚笉渚濊禆鍏蜂綋鐨勫浘褰㈢‖浠訛紝鏁翠釜娓叉煋榪囩▼瀹屽叏浣跨敤CPU澶勭悊錛屽洜姝ゅ畠涓嶈兘浣跨敤鐜頒唬紜歡鏉ュ姞閫燂紝騫朵笖瀵逛簬涓涓満鏅潵璇達紝寰寰涓嶅彧鏄湴褰紝榪樻湁鍏朵粬浣跨敤澶氳竟褰㈡弿榪扮殑鐗╀綋錛屼綋绱犳硶娓叉煋鐨勫浘鍍忓緢闅句笌紜歡娓叉煋鐨勫杈瑰艦榪涜娣峰悎錛屽洜姝よ繖縐嶆柟娉曠幇鍦ㄧ敤寰楁瀬灝戙傝屽杈瑰艦娓叉煋鏂規硶鍒欐垚涓轟竴縐嶄富嫻併傞夋嫨澶氳竟褰㈡潵鎻忚堪鍜屾覆鏌撳湴褰㈡湁寰堝鐨勭悊鐢卞拰浼樼偣銆傛渶閲嶈鐨勬槸瀹冭兘澶熷緢濂藉湴浣跨敤紜歡鍔犻燂紝騫朵笖鑳藉鍜屽叾浠栧杈瑰艦瀵硅薄涓璧風粺涓綆$悊銆?/span>

    宸叉湁澶ч噺浼樼鐨勫熀浜庡杈瑰艦鐨勫湴褰㈡覆鏌撶畻娉曘傛瘮杈冪粡鍏哥殑綆楁硶鏈?/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;
   current.push_back(root);
   while (current.size()!=0)

   {

      for each thisNode in current

      {
         if (!IsNodeInFrustum(thisNode))
            continue;
         if (level == MaxResolution)
            draw.push_back(thisNode);
         else

         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);
      next.clear();

      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;   //綰圭悊緙╂斁鍊?鐢ㄤ簬鏌ユ壘绱㈠紩綰圭悊
void main()
{
  gl_TexCoord[6] = gl_Vertex;
  gl_TexCoord[0] = gl_MultiTexCoord0;
  gl_TexCoord[2] = TexInc*vec4(gl_Vertex.xz,0.0,0.0);
  gl_Position = ftransform();
}

Fragment Shader:

uniform sampler2D IndexMap;
uniform sampler2D LightMap;
uniform sampler2D texR,texG,texB,texA;
void main()
{
  vec4 idx,lm,r,g,b,color;
  idx = texture2D(IndexMap,gl_TexCoord[0].xy); //绱㈠紩鍊?br>  lm = texture2D(LightMap,gl_TexCoord[0].xy);  //鍏夌収搴?br>  r = texture2D(texR,gl_TexCoord[2].xy);   //R閫氶亾綰圭悊
  g = texture2D(texG,gl_TexCoord[2].xy);   //G閫氶亾綰圭悊
  b = texture2D(texB,gl_TexCoord[2].xy);   //B閫氶亾綰圭悊
  color = lm*(idx.x*r + idx.y*g+idx.z*b);  //娣峰悎棰滆壊
  gl_FragColor = color;
}

    鏈鍚庯紝濡傛灉浣犲鏈枃鏈変笉瑙d箣澶勶紝嬈㈣繋鍜屾垜鍏卞悓璁ㄨ銆?/span>



RedLight 2008-05-11 21:54 鍙戣〃璇勮
]]>
X鏂囦歡鐨勪嬌鐢紙瀹屾暣錛?/title><link>http://www.shnenglu.com/flashboy/archive/2008/05/11/49571.html</link><dc:creator>RedLight</dc:creator><author>RedLight</author><pubDate>Sun, 11 May 2008 13:32:00 GMT</pubDate><guid>http://www.shnenglu.com/flashboy/archive/2008/05/11/49571.html</guid><wfw:comment>http://www.shnenglu.com/flashboy/comments/49571.html</wfw:comment><comments>http://www.shnenglu.com/flashboy/archive/2008/05/11/49571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/flashboy/comments/commentRss/49571.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/flashboy/services/trackbacks/49571.html</trackback:ping><description><![CDATA[     鎽樿:   <a href='http://www.shnenglu.com/flashboy/archive/2008/05/11/49571.html'>闃呰鍏ㄦ枃</a><img src ="http://www.shnenglu.com/flashboy/aggbug/49571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/flashboy/" target="_blank">RedLight</a> 2008-05-11 21:32 <a href="http://www.shnenglu.com/flashboy/archive/2008/05/11/49571.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鎶曞獎鐭╅樀鐨勫疄鐜頒互鍙婂浣曚粠鎶曞獎鐭╅樀涓幏鍙栧悇瑙嗚浣撳鉤闈?鏁欑▼)http://www.shnenglu.com/flashboy/archive/2008/04/16/47292.htmlRedLightRedLightWed, 16 Apr 2008 09:49:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/04/16/47292.htmlhttp://www.shnenglu.com/flashboy/comments/47292.htmlhttp://www.shnenglu.com/flashboy/archive/2008/04/16/47292.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/47292.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/47292.html闃呰鍏ㄦ枃

RedLight 2008-04-16 17:49 鍙戣〃璇勮
]]>
DirectX 9鐨勫潗鏍囩郴緇熷彉鎹?http://www.shnenglu.com/flashboy/archive/2008/04/16/47289.htmlRedLightRedLightWed, 16 Apr 2008 09:45:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/04/16/47289.htmlhttp://www.shnenglu.com/flashboy/comments/47289.htmlhttp://www.shnenglu.com/flashboy/archive/2008/04/16/47289.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/47289.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/47289.html闃呰鍏ㄦ枃

RedLight 2008-04-16 17:45 鍙戣〃璇勮
]]>
Direct3D涓疄鐜板浘鍏冪殑榧犳爣鎷懼彇http://www.shnenglu.com/flashboy/archive/2008/04/16/47288.htmlRedLightRedLightWed, 16 Apr 2008 09:44:00 GMThttp://www.shnenglu.com/flashboy/archive/2008/04/16/47288.htmlhttp://www.shnenglu.com/flashboy/comments/47288.htmlhttp://www.shnenglu.com/flashboy/archive/2008/04/16/47288.html#Feedback0http://www.shnenglu.com/flashboy/comments/commentRss/47288.htmlhttp://www.shnenglu.com/flashboy/services/trackbacks/47288.html闃呰鍏ㄦ枃

RedLight 2008-04-16 17:44 鍙戣〃璇勮
]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              久久国产日韩| 中文国产一区| 欧美视频在线看| 欧美天天综合网| 国产免费一区二区三区香蕉精| 久久夜色精品国产欧美乱极品 | 久久久久五月天| 亚洲国产欧美另类丝袜| 欧美福利视频网站| 亚洲国产一区二区在线| 日韩视频专区| 性做久久久久久久免费看| 久久精品夜色噜噜亚洲a∨| 最新日韩av| 亚洲一区二区视频在线| 含羞草久久爱69一区| 在线免费观看日本一区| 99精品视频一区| 久久精品国产69国产精品亚洲| 亚洲精品婷婷| 亚洲一区二区日本| 久久综合伊人77777蜜臀| 亚洲第一区中文99精品| 亚洲一区二区成人在线观看| 久久九九精品| 欧美性片在线观看| 尤物精品国产第一福利三区| 亚洲最新合集| 麻豆精品视频在线观看| 一区二区三区**美女毛片 | 一本色道婷婷久久欧美| 性欧美video另类hd性玩具| av成人福利| 久久久久久久综合| 亚洲图片欧美日产| 美女精品自拍一二三四| 国产精品美女黄网| 一本色道久久| 亚洲第一色在线| 久久国产夜色精品鲁鲁99| 国产精品久久二区| 亚洲毛片在线观看.| 乱中年女人伦av一区二区| 亚洲综合电影| 国产精品草草| 亚洲在线视频观看| 午夜久久99| 亚洲精品欧美精品| 欧美成在线视频| 亚洲人成网站在线观看播放| 一区二区三区国产| 亚洲电影av| 老司机久久99久久精品播放免费 | 狠狠色丁香久久婷婷综合_中| 99精品欧美一区| 免费看成人av| 亚洲国产精品久久久久婷婷884| 亚洲国产va精品久久久不卡综合| 狠狠色香婷婷久久亚洲精品| 亚洲欧美日韩精品| 在线视频免费在线观看一区二区| 亚洲综合第一页| 国产精品成人在线观看| 亚洲一二三级电影| 在线视频一区二区| 欧美精品一区二区三区蜜臀| 国产精品入口尤物| 国内精品国语自产拍在线观看| 伊人伊人伊人久久| 男女精品视频| 欧美精品激情| 国产精品视频免费| 欧美伊人久久久久久久久影院 | 国产精品日韩精品欧美在线| 亚洲欧美日韩中文播放| 亚洲自拍偷拍网址| 国产一区二区三区观看| 欧美r片在线| 欧美大成色www永久网站婷| 亚洲视频在线观看| 亚洲欧美日韩国产一区二区| 国产亚洲欧美另类中文| 精品成人国产| 一区二区三区四区五区精品视频| 久久高清免费观看| 久久精品人人做人人综合| 亚洲国产99精品国自产| 91久久久一线二线三线品牌| 欧美午夜性色大片在线观看| 欧美一级专区免费大片| 久久久不卡网国产精品一区| 亚洲精品黄网在线观看| 亚洲欧美另类综合偷拍| 亚洲激情第一页| 亚洲一级特黄| 亚洲国产三级网| 亚洲一级一区| 亚洲美女黄色片| 欧美中文字幕不卡| 亚洲香蕉伊综合在人在线视看| 欧美sm视频| 国产精品久久久久久久久久尿 | 欧美—级a级欧美特级ar全黄| 国产亚洲免费的视频看| 亚洲第一视频网站| 国产日产高清欧美一区二区三区| 亚洲一级在线| 久久人人爽人人爽| 欧美亚洲色图校园春色| 久久尤物电影视频在线观看| 一本色道**综合亚洲精品蜜桃冫 | 久久综合狠狠综合久久综青草| 亚洲视频免费| 亚洲国产欧美久久| 亚洲欧美春色| 中文日韩在线| 欧美激情1区| 欧美国产乱视频| 激情久久五月| 欧美在线free| 欧美一区二区日韩| 欧美日韩中文字幕精品| 亚洲啪啪91| 亚洲裸体视频| 美女图片一区二区| 欧美成人免费在线视频| 在线观看91精品国产入口| 先锋a资源在线看亚洲| 亚洲一区二区成人在线观看| 欧美高清视频在线播放| 亚洲高清在线观看一区| 亚洲第一精品久久忘忧草社区| 欧美韩日一区二区| 韩国三级在线一区| 久久精品久久综合| 久久久久综合网| 国内自拍亚洲| 久久综合中文字幕| 欧美黄色视屏| 日韩视频在线免费| 欧美日韩在线观看视频| 欧美在线免费| 久久婷婷综合激情| 久久久国产一区二区三区| 国产中文一区| 久久一区二区三区国产精品 | 久久视频在线视频| 欧美成人精品三级在线观看| 欧美成人在线免费观看| 国产精品wwwwww| 亚洲一区中文字幕在线观看| 性欧美video另类hd性玩具| 国产精品影片在线观看| 亚洲第一综合天堂另类专| 一区二区亚洲精品国产| 国产精品99久久久久久久久久久久| 国产精品亚洲综合一区在线观看| 猛男gaygay欧美视频| 亚洲高清不卡| 欧美日韩国产不卡| 女仆av观看一区| 国产精品美女久久福利网站| 欧美成人高清| 夜夜夜久久久| 国产精品专区第二| 久久女同精品一区二区| 亚洲精品美女在线观看| 亚洲欧美日韩爽爽影院| 伊人久久婷婷色综合98网| 欧美精品色综合| 欧美一级专区免费大片| 亚洲第一伊人| 欧美伊人久久| 1024日韩| 欧美日韩午夜在线| 亚洲一区久久久| 欧美成人精品在线观看| 亚洲一区二区三区视频| 影音先锋中文字幕一区| 欧美日韩中字| 欧美jizz19性欧美| 性欧美暴力猛交69hd| 亚洲精品三级| 欧美ed2k| 在线观看视频一区二区| 欧美日韩一区二区三| 乱码第一页成人| 麻豆精品一区二区av白丝在线| 国产精品日日摸夜夜摸av| 久久久99国产精品免费| 一区二区三区四区蜜桃| 欧美国产一区二区在线观看 | 国产啪精品视频| 亚洲一级高清| 亚洲国产影院| 中国成人亚色综合网站| 狠狠久久亚洲欧美| 国产女主播一区| 国产精品高潮久久| 欧美日韩另类字幕中文|