-- = = = 마이크로소프트 그리드 컨트롤 을 이용 한 편집 입력 = --


알파 반 짝 임 효과 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 는 카운트다운 시스템 을 제시 했다.전환 발생 방식 은 세 가지 가 있다.
  • 특정한 무늬 의 기한 이 만 료 되 었 을 때 목록 에서 무 작위 로 무늬 를 선택 합 니 다.
  • color_mode 는 기본 색 을 만 드 는 데 사용 합 니 다.
  • color_modifier_mode 는 기본 색 을 재 미 있 는 방식 으로 수정 하 는 데 사용 된다.

  • 이 무 작위 무늬 와 색 채 는 입자 의 외관 을 완전 하 게 정의 할 것 이다.어떤 정교 한 랜 덤 수학 방법 으로 생 성 된 내용 은 확실히 상당히 기묘 하 다.
    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 = &amp;pd3dDeviceDesc-&gt;dpcTriCaps;   if( 0 == ( pdpc-&gt;dwSrcBlendCaps &amp; pdpc-&gt;dwDestBlendCaps &amp; 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-&gt;SetRenderState(D3DRENDERSTATE_SRCBLEND,  srcBlend);   pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_DESTBLEND, dstBlend);   //         pd3dDevice-&gt;SetTextureStageState(0,D3DTSS_MINFILTER, D3DFILTER_LINEAR);   pd3dDevice-&gt;SetTextureStageState(0,D3DTSS_MAGFILTER, D3DFILTER_LINEAR);   pd3dDevice-&gt;SetTextureStageState(0,D3DTSS_MIPFILTER, D3DFILTER_LINEAR);   //             pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_DITHERENABLE, FALSE);   pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_SPECULARENABLE, FALSE);   pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_ZWRITEENABLE, FALSE);   pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_ZENABLE, FALSE);   pd3dDevice-&gt;SetRenderState(D3DRENDERSTATE_CULLMODE, D3DCULL_NONE);   //  :  DX7  ,       ,    D3DRENDERSTATE_LIGHTING     FALSE   // (    D3DLVERTEX     )   pd3dDevice-&gt;SetRenderState( D3DRENDERSTATE_LIGHTING, FALSE );}void SetViewState(LPDIRECT3DDEVICE7 pd3dDevice ){   //         pd3dDevice-&gt;GetViewport(&amp;vp);   FLOAT fAspect = ((FLOAT)vp.dwHeight) / vp.dwWidth;   //          D3DUtil_SetProjectionMatrix( proj,                          g_PI/4,//1.0f;                         fAspect,                          1.0f, MAX_DIST );   pd3dDevice-&gt;SetTransform( D3DTRANSFORMSTATE_PROJECTION, &amp;proj);   D3DUtil_SetViewMatrix( view, from, at, up );   pd3dDevice-&gt;SetTransform( D3DTRANSFORMSTATE_VIEW, &amp;view);   D3DUtil_SetIdentityMatrix( world );   pd3dDevice-&gt;SetTransform( D3DTRANSFORMSTATE_WORLD, &amp;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, &amp;view);}HRESULT App_Render( LPDIRECT3DDEVICE7 pd3dDevice ){   static float      tic = -rnd() * 10000.0f;   //         pd3dDevice-&gt;Clear( 0UL, NULL, D3DCLEAR_TARGET, bckColor, 1.0f, 0L );   //        if( FAILED( pd3dDevice-&gt;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-&gt;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>

    좋은 웹페이지 즐겨찾기