-- = = = 마이크로소프트 그리드 컨트롤 을 이용 한 편집 입력 = --
알파 반 짝 임 효과 Philip Taylor
2000 년 9 월
본문 원본 코드 다운로드 (521 KB)
Driving DirectX 에 오신 것 을 환영 합 니 다.이번 달 에 나 는 알파 의 Direct3D 화면 보호 기 를 개발 하여 알파 혼 색 을 계속 탐색 할 것 이다.
그림 1. MSDN스파크 화면 스냅 샷
그림 1 은 이 예제 의 화면 스냅 샷 을 보 여 줍 니 다.이 그림 들 을 진정 으로 감상 하려 면 화면 보호 기의 형태 변 화 를 관찰 하 는 데 시간 이 걸 려 야 합 니 다.
Direct3D "ScreenSaver" 예제 에 따 르 면 MSDNsparkles 화면 보호 기 는 입자 시스템 과 무 작위 마술 을 결합 시 킵 니 다.이런 방식 이 알파 혼 색 과 결합 하면 환상 적 인 이미지 가 생 긴 다.이것 은 ONE: ONE 연산 자 를 사용 하여 색 을 더 하 는 예 로 확실히 재 미 있 는 발광 효 과 를 낼 수 있다.
이 칼럼 에서 저 는 Direct3D 화면 보호 예제 의 구 조 를 간략하게 요약 한 다음 에 MSDNsparkles 가 마술 을 실현 하 는 세부 사항 을 깊이 소개 하 겠 습 니 다.Win 32 화면 보호 기 를 만 드 는 자세 한 내용 은 언급 하지 않 지만, MSDN 에서 이 테 마 를 토론 하 는 글 을 검색 할 수 있 습 니 다.
머리말
Direct3D 화면 보호 기의 프레임 워 크 는 두 부분 으로 구성 되 어 있 습 니 다. 골조 와 응용 프로그램 이 제공 하 는 함수 입 니 다. 이 함수 들 은 모든 화면 보호 기 에서 덮어 씁 니 다.그림 2 는 SDK 의 화면 보호 기 샘플 프로젝트 보 기 를 보 여 준다.Screensaver. cpp 는 d3dapp. cpp 와 같은 D3DFrame 화면 보호 기 를 실행 할 수 있 는 골격 을 제공 하고, d3dapp. cpp 는 반대로 D3DFrame 프로그램의 골격 을 제공 합 니 다.덮어 쓰 는 함수 만 제공 하면 화면 보호 기 를 얻 을 수 있 습 니 다.화면 보호 기 를 테스트 하려 면 명령 행 인자 – s 를 사용 하여 Visual C + + 에서 시작 해 야 한 다 는 것 을 기억 하 십시오.
그림 2. Direct3D 화면 보호 기 샘플 항목 보기
이 골격 은 초기 화, 닫 기, 착색 을 수행 하 는 데 사용 되 는 D3D Frame 프로그램 과 유사 한 함 수 를 사용 했다.이 함수 들 의 원형 - Initialized 3D Environment, Cleanup3D Environment, Render3D Environment - 다음 과 같 습 니 다.
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------HRESULT Initialize3DEnvironment( HWND );HRESULT Render3DEnvironment( HWND );VOID Cleanup3DEnvironment( HWND );
이 세 가지 함 수 는 Direct3D 를 설정 하고 Direct3D 를 닫 으 며 장면 에 착색 하 는 모든 작업 을 완성 합 니 다.화면 보호 기 가 해 야 할 모든 작업 은 덮어 쓸 수 있 는 함 수 를 실현 하 는 것 입 니 다.이 함수 들 은 우리 가 이미 알 고 좋아 하 는 D3Dframe 대응 함수 와 유사 합 니 다.아래 함수 원형 을 참조 하 십시오.
//--------------------------------------------------------------------------// //--------------------------------------------------------------------------HRESULT App_ConfirmDevice( DDCAPS*, D3DDEVICEDESC* );HRESULT App_OneTimeSceneInit();VOID App_DeleteDeviceObjects( HWND, LPDIRECT3DDEVICE7 );HRESULT App_InitDeviceObjects( HWND, LPDIRECT3DDEVICE7 );HRESULT App_FrameMove( LPDIRECT3DDEVICE7, FLOAT );HRESULT App_Render( LPDIRECT3DDEVICE7 );HRESULT App_RestoreSurfaces();HRESULT App_FinalCleanup();
나 는 예시 중의 screensaver. cpp 를 사 용 했 고 최소한 의 변경 을 했다.레 지 스 트 에서 설정 데 이 터 를 읽 는 호출 은 인 자 를 다음 과 같이 해 야 한 다 는 것 을 알 게 되 었 습 니 다.
if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, strRegPath, KEY_READ, NULL, &hKey ) )
다음으로 바 꾸 기:
if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_CURRENT_USER, strRegPath, NULL, KEY_READ, &hKey ) )
이 예제 도 색 창 이 가능 한 이동 을 처리 하지 못 했 기 때문에 TestCooperative Level () 을 호출 한 후에 다음 프로그램 블록 을 Render3Denvironment () 함수 에 추가 하 였 습 니 다.
// , RECT rTmp; GetWindowRect( hWnd, &rTmp ); g_pFramework->Move(rTmp.left, rTmp.top );
Direct3D 화면 보호 기 프레임 워 크 는 Configure Dialog 함수 의 시작 부분 과 설정 데 이 터 를 저장 하 는 방법 을 확실히 보 여 주 었 으 나, 나 는 아직 MSDNsparkles 에 대해 확장 하지 않 았 다. 왜냐하면 이것 은 관건 적 인 세부 사항 이 아니 기 때문이다.
샘플 화면 보호 기의 또 다른 '특징' 은 WM 을 사용 합 니 다.TIMER 색상 조절.윈도 2000 기반 운영 체제 에 서 는 적당 한 프레임 속도 가 발생 하지만 윈도 9x 기반 운영 체 제 는 좋 은 프레임 속 도 를 사용 할 수 있 는 WM 가 없습니다.TIMER 간격 사이즈.이러한 상황 을 고려 하여 나 는 이 화면 보호 기 를 다시 작성 하여 스 레 드 를 사용 하여 색 을 제어 하도록 했다.나 는 이 부분의 코드 를 포함 시 키 지 않 았 다. 왜냐하면 그것 은 간단명료 한 라인 이기 때문이다.관심 있 는 프로 그 래머 는 다 중 모니터 기능, 전원 관리, 암 호 를 추가 하 는 것 을 고려 할 수 있다. 왜냐하면 Direct3D 화면 보호 기 프레임 워 크 가 이러한 기능 을 제공 하지 않 았 기 때문이다.
고급 보기
이 세부 사항 들 이 이미 문제 가 되 지 않 았 으 니 우 리 는 시작 할 수 있다.그림 3 은 Visual Studio Workspace 창 이 MSDNsparkles 에 대한 예제 내용 을 보 여 준다.이 프로젝트 는 screensaver. cpp 파일 (Direct3D 예제 에서 얻 은 것 입 니 다. 위의 토론 과 같이) 및 sparkles. cpp 로 구성 되 어 있 습 니 다.
그림 3. MSDN스파크 프로젝트 보기
Sparkles. cpp 는 두 개의 함 수 를 포함 합 니 다.첫 번 째 조 는 덮어 쓸 수 있 는 함수 입 니 다. 뒤에서 검사 하 겠 습 니 다.두 번 째 조 는 반 짝 임 효과 함 수 를 포함 하고 있 습 니 다.플래시 효과 함 수 를 처리 하기 위해 MSDNsparkles 는 RandomTexture, RandomSparkle, InitSparkles, UpdateSparkle, Draw Sparkle 등 자신의 소형 API 를 정의 했다.
// Int RandomTexture(int overflow);Sparkle RandomSparkle(void);Void InitSparkles(void);Void UpdateSparkles(void);BOOL DrawSparkles(LPDIRECT3DDEVICE7 lpDev, D3DVECTOR from, D3DVECTOR at);
RandomTexture 를 제외 한 모든 함수 가 Sparkle 구 조 를 조작 합 니 다.Sparkle 구 조 는 모든 입자 의 외관 과 행동 에 대한 정 보 를 포함 하고 모든 입 자 는 입자 시스템 의 일부분 입 니 다.
// typedef struct t_sparkle { int texture; int age, cur_age; // start at age and tick down to 0 float scale, delta_scale; D3DVECTOR position; D3DVECTOR velocity; D3DVECTOR color;} Sparkle;
원소 position 와 velocity, scale 과 deltascale 는 입자 시스템 에서 함께 사용 되 며 입자 의 각 위 치 를 생 성 하 는 데 사용 된다.요소 texture 와 color 는 외관 에 세이 화 알고리즘 의 일부분 으로 입자 모양 을 정의 합 니 다.
외관 랜 덤 화 는 노화 시스템 을 사용 하여 전환 을 제어 하 는데 그 중에서 요소 age 와
cur_age
는 카운트다운 시스템 을 제시 했다.전환 발생 방식 은 세 가지 가 있다.이 무 작위 무늬 와 색 채 는 입자 의 외관 을 완전 하 게 정의 할 것 이다.어떤 정교 한 랜 덤 수학 방법 으로 생 성 된 내용 은 확실히 상당히 기묘 하 다.
RandomTexture 는 텍 스 처 목록 에서 텍 스 처 를 선택 하 는 데 도움 을 줍 니 다.
int RandomTexture(int texture, int overflow){ int retVal; if (texture == NumTextures) { retVal = overflow;// init to random from the n case, overflow } else { retVal = texture; // init to current in the 0..n-1 case } return retVal;}
RandomSparkle 은 색상 증분 값 을 생 성하 여 시작 합 니 다.이 구 조 는 시한, 눈금, 위치 값 으로 입 자 를 표시 하기 시작 했다.반 짝 임 효과 의 텍 스 처 는 RandomTexture 호출 을 통 해 선택 되 었 습 니 다.뒤이어, colormode 와 colormodifier_mode 는 이 입자 의 색 을 만 드 는 데 사 용 됩 니 다.
Color_mode 는 기본 색상 을 만 드 는 데 사용 되 는 방법 을 확인 합 니 다. 랜 덤 모드 입 니까? rgb 바 이브 레이 션 모드 입 니까?무 작위 모드 는 무 작위 로 한 가지 색 을 선택 할 뿐이다.RGB 바 이브 레이 션 모드 는 정교 한 색상 증 가 를 계산 하여 특정한 색상 범위 내 에서 부 드 럽 게 이동 합 니 다.Color_modifier_mode 는 기본 색상 의 수정 을 제어 하고 있 습 니 다.포화 색, 보석 색, 부 드 러 운 색, 밝 은 색 등 네 가지 변 수 를 선택 할 수 있 습 니 다.이 모델 들 중 하 나 는 모두 약간 다른 계산 을 실행 하여 기본 색 을 수정 하도록 한다.
Sparkle RandomSparkle(void){ Sparkle ret; static float red = 1.0f, grn = 1.0f, blu = 1.0f; static float d_red = -(min_color_delta + rnd()*max_color_delta); static float d_grn = -(min_color_delta + rnd()*max_color_delta); static float d_blu = -(min_color_delta + rnd()*max_color_delta); ret.age = min_age + (int)(rnd() * (max_age-min_age)); ret.cur_age = ret.age; ret.scale = start_scale; ret.delta_scale = min_delta + rnd() * (max_delta - min_delta); ret.position = D3DVECTOR(world_size * (rnd()-rnd()), world_size * (rnd()-rnd()), world_size * (rnd()-rnd())); ret.velocity = D3DVECTOR(0.0f); ret.texture = RandomTexture(rand() % (NumTextures-1)); switch (color_mode) { case 0 : // ret.color = D3DVECTOR(rnd(), rnd(), rnd()); break; case 1 : //rgb red += d_red; if (red > 1.0f) { red = 1.0f; d_red = -(min_color_delta + rnd()*max_color_delta); } else if (red 1.0f) { grn = 1.0f; d_grn = -(min_color_delta + rnd()*max_color_delta); } else if (grn 1.0f) { blu = 1.0f; d_blu = -(min_color_delta + rnd()*max_color_delta); } else if (blu InitSparkles , 。 。 , 4。
4.
, RandomSparkle 。 , 。
void InitSparkles(void){ texture = 1;// dx7 sparkle = (Sparkle *)malloc(nMaxNumSparkles * sizeof(Sparkle)); for (UINT i=0; i<ncurnumsparkles i sparkle randomsparkle for s_indices initsparkles><p><b><font face="arial">UpdateSparkles</font></b> <b>texture_age</b>、<b>color_age</b> <b>color_modifier_age</b> 。 , 0, <b><font face="arial">texture</font></b> ( <b><font face="arial">RandomTexture</font></b>)、<b><font face="arial">color_mode</font></b> <b><font face="arial">color_modifier_mode</font></b> 。 ,<b><font face="arial">RandomSparkle</font></b> 、 。 。</p>
<pre class="clsCode">void UpdateSparkles(void){ UINT i;//0..n 0..n-1== ,n== texture_age--; if (texture_age == 0) { texture_age = min_texture_age + (unsigned int)(rnd() * (max_texture_age - min_texture_age)); texture = rand() % (NumTextures); texture = RandomTexture(rand() % (NumTextures-1)); }//0..1 0== ,1==rgb color_age--; if (color_age == 0) { color_age = min_color_age + (int)(rnd()*(max_color_age – min_color_age)); color_mode = rand() % NumColorModes; }//0..5 0== ,1== ,2== ,3== , // 4== ,5== ,<br> , color_modifier_age--; if (color_modifier_age == 0) { color_modifier_age = min_color_modifier_age + (int)(rnd()* (max_color_modifier_age - min_color_modifier_age)); color_modifier_mode = rand() % NumColorModifierModes; } // for (i=0; i<ncurnumsparkles i sparkle if randomsparkle updatesparkles><p><b><font face="arial">DrawSparkles</font></b> 。 。 5 。</p>
<img alt=" " border="0" height="300" src="http://www.microsoft.com/china/msdn/images/directx0900-5.gif" width="300"><p><b> 5. </b></p>
<p> , 。 <b><font face="arial">DrawIndexedPrimitive</font></b> 。</p>
<pre class="clsCode">BOOL DrawSparkles(LPDIRECT3DDEVICE7 lpDev, D3DVECTOR from, D3DVECTOR at){ D3DVECTOR view_dir, position, dx, dy; UINT i; view_dir = Normalize(at - from); dx = CrossProduct(view_dir, D3DVECTOR(0.0f, 1.0f, 0.0f)); dy = CrossProduct(view_dir, dx); dx = CrossProduct(view_dir, dy); // // , // DrawPrim int flags[NumTextures]; for (int tex=0; tex<numtextures tex flags for i if continue lpdev->SetTexture(0,g_ptexSparkleTextures[tex]); // int num = 0; for (i=0; i<ncurnumsparkles i if tex continue d3dvector sx="dx" sparkle sy="dy" float color_scale="(float)sparkle[i].cur_age" cur_color="sparkle[i].color" d3dcolor color="D3DRGB(cur_color[0]," position="sparkle[i].position;" s_mesh d3dlvertex num>DrawIndexedPrimitive(D3DPT_TRIANGLELIST, D3DFVF_LVERTEX, (LPVOID)s_mesh, 4*flags[tex], s_indices, 6*flags[tex], 0) != D3D_OK) return FALSE; } return TRUE;} // DrawSparkles() </ncurnumsparkles></numtextures></pre>
<p> 6 7 alpha 。</p>
<img alt=" " border="0" height="338" src="http://www.microsoft.com/china/msdn/images/directx0900-6.jpg" width="450"><p><b> 6. <font face="arial">MSDNSparkles</font> 2</b></p>
<img alt=" " border="0" height="338" src="http://www.microsoft.com/china/msdn/images/directx0900-7.jpg" width="450"><p><b> 7. <font face="arial">MSDNSparkles</font> 3</b></p>
<p><b><font class="105v"><font face="arial">MSDNSparkles </font></font></b> </p>
<p> 。 , 。 Direct3D 。</p>
<pre class="clsCode">//--------------------------------------------------------------------------// //--------------------------------------------------------------------------HRESULT App_ConfirmDevice( DDCAPS*, D3DDEVICEDESC* );HRESULT App_OneTimeSceneInit();VOID App_DeleteDeviceObjects( HWND, LPDIRECT3DDEVICE7 );HRESULT App_InitDeviceObjects( HWND, LPDIRECT3DDEVICE7 );HRESULT App_FrameMove( LPDIRECT3DDEVICE7, FLOAT );HRESULT App_Render( LPDIRECT3DDEVICE7 );HRESULT App_RestoreSurfaces();HRESULT App_FinalCleanup();</pre>
<p><b><font face="arial">ConfirmDevice</font> </b></p>
<p>MSDNSparkles <b><font face="arial">App_ConfirmDevice</font></b> ONE:ONE alpha 。 alpha — , , alpha 。 MSDNSparkles <b><font face="arial">App_ConfirmDevice</font></b> 。</p>
<pre class="clsCode">HRESULT App_ConfirmDevice( DDCAPS* pddDriverCaps, D3DDEVICEDESC7* pd3dDeviceDesc ){ // triangle caps( ), alpha LPD3DPRIMCAPS pdpc = &pd3dDeviceDesc->dpcTriCaps; if( 0 == ( pdpc->dwSrcBlendCaps & pdpc->dwDestBlendCaps & D3DBLEND_ONE ) ) return E_FAIL; return S_OK;} </pre>
<p><b><font face="arial">OneTimeSceneInit</font> </b></p>
<p><b><font face="arial">App_OneTimeSceneInit</font></b> , 。 , MSDNSparkles 。 , <b><font face="arial">InitSparkles</font></b> 。</p>
<pre class="clsCode">HRESULT App_OneTimeSceneInit(){ // srand(time(0)); // bckColor = D3DRGB(0,0,0); // memcpy(g_szSparkleTextures[0],"dx5.bmp",sizeof("dx5.bmp")); memcpy(g_szSparkleTextures[1],"dx7.bmp",sizeof("dx7.bmp")); memcpy(g_szSparkleTextures[2],"flare1.bmp",sizeof("flare1.bmp")); memcpy(g_szSparkleTextures[3],"flare2.bmp",sizeof("flare2.bmp")); memcpy(g_szSparkleTextures[4],"flare3.bmp",sizeof("flare3.bmp")); memcpy(g_szSparkleTextures[5],"flare4.bmp",sizeof("flare5.bmp")); memcpy(g_szSparkleTextures[6],"flare5.bmp",sizeof("flare5.bmp")); memcpy(g_szSparkleTextures[7],"flare6.bmp",sizeof("flare6.bmp")); memcpy(g_szSparkleTextures[8],"flare7.bmp",sizeof("flare7.bmp")); memcpy(g_szSparkleTextures[9],"flare8.bmp",sizeof("flare8.bmp")); memcpy(g_szSparkleTextures[10],"shine1.bmp",sizeof("flare1.bmp")); memcpy(g_szSparkleTextures[11],"shine2.bmp",sizeof("flare2.bmp")); memcpy(g_szSparkleTextures[12],"shine3.bmp",sizeof("flare3.bmp")); memcpy(g_szSparkleTextures[13],"shine4.bmp",sizeof("flare5.bmp")); memcpy(g_szSparkleTextures[14],"shine5.bmp",sizeof("flare5.bmp")); memcpy(g_szSparkleTextures[15],"shine6.bmp",sizeof("flare6.bmp")); for ( int i = 0; i <p><b><font face="arial">InitDeviceObjects</font> </b></p><p><b><font face="arial">App_InitDeviceObjects</font></b> helper <b><font face="arial">SetTextureState</font></b>、<b>SetRenderState</b> <b>SetViewState</b>。 、 。 , alpha , ONE:ONE。</p><pre class="clsCode">void SetTextureState(LPDIRECT3DDEVICE7 pd3dDevice ){ // D3DTextr_RestoreAllTextures( pd3dDevice ); // for( int i=0; i<numtextures i g_ptexsparkletextures d3dtextr_getsurface g_szsparkletextures setrenderstate pd3ddevice alpha pd3ddevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE); pd3dDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND, srcBlend); pd3dDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND, dstBlend); // pd3dDevice->SetTextureStageState(0,D3DTSS_MINFILTER, D3DFILTER_LINEAR); pd3dDevice->SetTextureStageState(0,D3DTSS_MAGFILTER, D3DFILTER_LINEAR); pd3dDevice->SetTextureStageState(0,D3DTSS_MIPFILTER, D3DFILTER_LINEAR); // pd3dDevice->SetRenderState(D3DRENDERSTATE_DITHERENABLE, FALSE); pd3dDevice->SetRenderState(D3DRENDERSTATE_SPECULARENABLE, FALSE); pd3dDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, FALSE); pd3dDevice->SetRenderState(D3DRENDERSTATE_ZENABLE, FALSE); pd3dDevice->SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE); // : DX7 , , D3DRENDERSTATE_LIGHTING FALSE // ( D3DLVERTEX ) pd3dDevice->SetRenderState( D3DRENDERSTATE_LIGHTING, FALSE );}void SetViewState(LPDIRECT3DDEVICE7 pd3dDevice ){ // pd3dDevice->GetViewport(&vp); FLOAT fAspect = ((FLOAT)vp.dwHeight) / vp.dwWidth; // D3DUtil_SetProjectionMatrix( proj, g_PI/4,//1.0f; fAspect, 1.0f, MAX_DIST ); pd3dDevice->SetTransform( D3DTRANSFORMSTATE_PROJECTION, &proj); D3DUtil_SetViewMatrix( view, from, at, up ); pd3dDevice->SetTransform( D3DTRANSFORMSTATE_VIEW, &view); D3DUtil_SetIdentityMatrix( world ); pd3dDevice->SetTransform( D3DTRANSFORMSTATE_WORLD, &world);}HRESULT App_InitDeviceObjects( HWND hWnd, LPDIRECT3DDEVICE7 pd3dDevice ){ // if( NULL==pd3dDevice ) return E_INVALIDARG; // SetTextureState( pd3dDevice ); // SetRenderState( pd3dDevice ); // SetViewState( pd3dDevice ); return S_OK;}</numtextures></pre><p><b><font face="arial">FrameMove</font> </b></p><p><b><font face="arial">App_FrameMove</font></b> <b><font face="arial">UpdateSparkles</font></b> 。</p><pre class="clsCode">HRESULT App_FrameMove( LPDIRECT3DDEVICE7 pd3dDevice, FLOAT fTimeKey ){ // , UpdateSparkles(); return S_OK;}</pre><p><b> </b></p><p><b><font face="arial">App_Render</font></b> 。 , <b><font face="arial">RandomViewpoint</font></b> 。 <b><font face="arial">DrawSparkles</font></b> 。 !</p><pre class="clsCode">void RandomViewpoint(LPDIRECT3DDEVICE7 pd3dDevice,float tic){ float fromX, fromY, fromZ; fromX = (float)sin(tic*0.59); fromZ = (float)cos(tic*0.59); if ( texture SetTransform( D3DTRANSFORMSTATE_VIEW, &view);}HRESULT App_Render( LPDIRECT3DDEVICE7 pd3dDevice ){ static float tic = -rnd() * 10000.0f; // pd3dDevice->Clear( 0UL, NULL, D3DCLEAR_TARGET, bckColor, 1.0f, 0L ); // if( FAILED( pd3dDevice->BeginScene() ) ) return S_OK; // Don't return a "fatal" error // tic tic += 0.005f; // start_scale = 0.05f + (float)(sin(tic * 0.100) + 1.0f)*0.4f; world_size = 0.10f + (float)(cos(tic * 0.072) + 1.0f)*10.0f; // RandomViewpoint(pd3dDevice,tic); // if (!DrawSparkles(pd3dDevice, from, at)) return E_FAIL; // pd3dDevice->EndScene(); return S_OK;}</pre><p><b><font face="arial">DeleteDeviceObjects </font></b></p><p><b><font face="arial">App_DeleteDeviceObjects</font></b><i> </i> 。</p><pre class="clsCode">VOID App_DeleteDeviceObjects( HWND hWnd, LPDIRECT3DDEVICE7 pd3dDevice){ D3DTextr_InvalidateAllTextures();}</pre><p><b><font face="arial">RestoreSurfaces </font></b></p><p> MSDNSparkles ,<b><font face="arial">App_RestoreSurfaces</font></b> 。</p><pre class="clsCode">HRESULT App_RestoreSurfaces(){ return S_OK;}</pre><p><b><font face="arial">FinalCleanup</font> </b></p><p><b><font face="arial">App_FinalCleanup</font></b> 。</p><pre class="clsCode">HRESULT App_FinalCleanup(){ free(sparkle); return S_OK;}</pre><p>MSDNSparkles 。 , MSDNSparkles.scr , 、 。 6 。 , 。</p><p><a href="http://www.microsoft.com/china/msdn/images/directx0900-8.gif" target="_blank"> (14.8 KB)</a></p><img alt=" “ ” " border="0" height="280" src="http://www.microsoft.com/china/msdn/images/directx0900-8a.gif" width="400"><p><b> 8. 、 </b></p><p><b><font class="105v"> </font></b> </p><p> 。 , 、 、 , 。 , 。 ,Microsoft <b><font face="arial">DirectXDev</font></b>, 。 <a href="http://discuss.microsoft.com/archives/DIRECTXDEV.html">http://DISCUSS.MICROSOFT.COM/archives/DIRECTXDEV.html</a>( ) Web 。 <a href="http://msdn.microsoft.com/library/default.asp%20URL=/library/techart/dxfaq2.htm">http://msdn.microsoft.com/library/techart/dxfaq2.htm</a>( ) 。</p><br><br><p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=5676</p> <br></pre></ncurnumsparkles></pre></ncurnumsparkles>
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.