Major Changes: - Converted all d3d8.h includes to d3d9.h - Converted all d3dx8.h includes to d3dx9.h - Updated all DX8 interfaces to DX9: * LPDIRECT3D8 -> LPDIRECT3D9 * LPDIRECT3DDEVICE8 -> LPDIRECT3DDEVICE9 * IDirect3DTexture8 -> IDirect3DTexture9 * IDirect3DSurface8 -> IDirect3DSurface9 * IDirect3DVertexBuffer8 -> IDirect3DVertexBuffer9 * IDirect3DIndexBuffer8 -> IDirect3DIndexBuffer9 - Updated structs: * D3DCAPS8 -> D3DCAPS9 * D3DADAPTER_IDENTIFIER8 -> D3DADAPTER_IDENTIFIER9 - Updated API calls: * Direct3DCreate8 -> Direct3DCreate9 - Updated project files (.vcxproj, .vcproj): * d3d8.lib -> d3d9.lib * d3dx8.lib -> d3dx9.lib * dxerr8.lib -> dxerr.lib - Fixed d3dfont.h/cpp: * Updated StateBlock from DWORD handles to IDirect3DStateBlock9* * Changed BeginStateBlock/EndStateBlock/CaptureStateBlock/ApplyStateBlock * Updated render states (D3DRS_EDGEANTIALIAS -> D3DRS_ANTIALIASEDLINEENABLE) * Moved texture sampling states from SetTextureStageState to SetSamplerState Files affected: 250+ files across Engine and Client directories Conversion method: Automated sed scripts with manual fixes for stateblocks Next phase: Build testing and runtime verification
349 lines
10 KiB
Markdown
349 lines
10 KiB
Markdown
# DirectX 8 to DirectX 9 Migration Plan
|
|
## RiskYourLife Client
|
|
|
|
---
|
|
|
|
## 1. 현재 DX8 사용 현황 분석
|
|
|
|
### 1.1 DX8 의존성 통계
|
|
- **DX8 헤더 include 수**: 74개 파일
|
|
- **DX8 인터페이스 사용**: 1002회 참조
|
|
- **주요 링크 라이브러리**:
|
|
- `d3d8.lib` (2.4 KB)
|
|
- `d3dx8.lib` (2.1 MB)
|
|
- `d3dx8dt.lib` (2.7 MB - 디버그)
|
|
- `dxerr8.lib` (1.1 MB)
|
|
|
|
### 1.2 핵심 DX8 인터페이스 사용 위치
|
|
|
|
#### A. 엔진 코어 (Zalla3D Base Class)
|
|
**파일**: `BaseGraphicsLayer.h` / `BaseGraphicsLayer.cpp`
|
|
```cpp
|
|
static LPDIRECT3DDEVICE8 m_pd3dDevice;
|
|
static LPDIRECT3D8 m_pD3D;
|
|
```
|
|
- **역할**: 전체 그래픽 시스템의 루트 클래스
|
|
- **영향도**: ⭐⭐⭐⭐⭐ (최상위 - 모든 렌더링 의존)
|
|
|
|
**파일**: `RenderDevice.h` / `RenderDevice.cpp`
|
|
```cpp
|
|
LPDIRECT3DDEVICE8 m_pd3dDevice;
|
|
```
|
|
- **역할**: 렌더링 디바이스 래퍼
|
|
- **영향도**: ⭐⭐⭐⭐⭐
|
|
|
|
**파일**: `EnumD3D.h` / `EnumD3D.cpp`
|
|
```cpp
|
|
static LPDIRECT3D8 m_pD3D;
|
|
static D3DADAPTER_IDENTIFIER8 d3dAdapterIdentifier;
|
|
static D3DCAPS8 d3dCaps;
|
|
```
|
|
- **역할**: 디바이스 열거 및 기능 확인
|
|
- **영향도**: ⭐⭐⭐⭐
|
|
|
|
**파일**: `Texture.h` / `Texture.cpp`, `NTexture.h` / `NTexture.cpp`
|
|
- **역할**: 텍스처 관리 시스템
|
|
- **DX8 함수**: `D3DXCreateTextureFromFile`, `CreateTexture`
|
|
- **영향도**: ⭐⭐⭐⭐
|
|
|
|
**파일**: `d3dfont.h` / `d3dfont.cpp`
|
|
- **역할**: 폰트 렌더링
|
|
- **영향도**: ⭐⭐⭐
|
|
|
|
#### B. 엔진 렌더링 (Zalla3D Scene Class)
|
|
**주요 파일**:
|
|
- `Z3DRenderable.h/cpp` - 렌더링 가능 오브젝트 베이스
|
|
- `Z3DTexture.h/cpp` - 텍스처 관리
|
|
- `Z3DGeneralChrModel.h/cpp` - 캐릭터 모델
|
|
- `Z3DMultipartSkin.h/cpp` - 멀티파트 스킨 시스템
|
|
- `NMesh.h/cpp` - 메시 관리
|
|
- `OctreeScene.h/cpp` - 옥트리 씬
|
|
- `WaterW.h/cpp` - 워터 렌더링
|
|
- `SectorScene.cpp` - 섹터 기반 씬
|
|
- `SceneManager.cpp` - 씬 매니저
|
|
|
|
**영향도**: ⭐⭐⭐⭐
|
|
|
|
#### C. 이펙트 시스템
|
|
**주요 파일**:
|
|
- `Effect/CGemRender.h/cpp` - 보석 렌더링
|
|
- `Effect/EffMeshloader.h/cpp` - 이펙트 메시 로더
|
|
- `Effect/SMRHeader.h/cpp` - SMR 포맷
|
|
- `Effect/CEffscript.h/cpp` - 이펙트 스크립트
|
|
|
|
**영향도**: ⭐⭐⭐
|
|
|
|
#### D. 클라이언트 UI (RYLClient)
|
|
**주요 파일**:
|
|
- `RYLClient/Sprite.h` - 스프라이트 시스템
|
|
- `RYLClient/RYLUI/RYLSpriteEX.h` - 확장 스프라이트
|
|
- `RYLClient/GUITextEdit.h` - UI 텍스트
|
|
- `RYLClient/GUITooltip.h` - 툴팁
|
|
|
|
**영향도**: ⭐⭐⭐
|
|
|
|
#### E. 카메라 및 액션 제어
|
|
**주요 파일**:
|
|
- `CharacterActionControl/CameraControl.h`
|
|
- `CharacterActionControl/CCameraScript.h`
|
|
|
|
**영향도**: ⭐⭐
|
|
|
|
### 1.3 D3DX8 헬퍼 함수 사용 현황
|
|
**많이 사용되는 함수들**:
|
|
- `D3DXCreateTextureFromFile` / `D3DXCreateTextureFromFileEx` - 텍스처 로드
|
|
- `D3DXLoadMeshFromX` - X파일 메시 로드
|
|
- `D3DXMatrixMultiply` / `D3DXMatrixInverse` - 매트릭스 연산
|
|
- `D3DXVec3TransformCoord` - 벡터 변환
|
|
- `D3DXCreateFont` - 폰트 생성
|
|
|
|
**사용 파일**: 29개 파일
|
|
|
|
---
|
|
|
|
## 2. DX8 → DX9 주요 변경사항
|
|
|
|
### 2.1 인터페이스 버전 변경
|
|
| DX8 | DX9 |
|
|
|-----|-----|
|
|
| `LPDIRECT3D8` | `LPDIRECT3D9` |
|
|
| `LPDIRECT3DDEVICE8` | `LPDIRECT3DDEVICE9` |
|
|
| `IDirect3DTexture8` | `IDirect3DTexture9` |
|
|
| `IDirect3DSurface8` | `IDirect3DSurface9` |
|
|
| `IDirect3DVertexBuffer8` | `IDirect3DVertexBuffer9` |
|
|
| `IDirect3DIndexBuffer8` | `IDirect3DIndexBuffer9` |
|
|
| `D3DCAPS8` | `D3DCAPS9` |
|
|
| `D3DADAPTER_IDENTIFIER8` | `D3DADAPTER_IDENTIFIER9` |
|
|
|
|
### 2.2 헤더 파일 변경
|
|
```cpp
|
|
// 변경 전
|
|
#include <d3d8.h>
|
|
#include <d3dx8.h>
|
|
|
|
// 변경 후
|
|
#include <d3d9.h>
|
|
#include <d3dx9.h>
|
|
```
|
|
|
|
### 2.3 라이브러리 변경
|
|
```
|
|
d3d8.lib → d3d9.lib
|
|
d3dx8.lib → d3dx9.lib
|
|
d3dx8dt.lib → d3dx9d.lib (디버그)
|
|
dxerr8.lib → dxerr9.lib
|
|
```
|
|
|
|
### 2.4 디바이스 생성 변경
|
|
```cpp
|
|
// DX8
|
|
Direct3DCreate8(D3D_SDK_VERSION);
|
|
CreateDevice(..., &d3dpp, &m_pd3dDevice);
|
|
|
|
// DX9
|
|
Direct3DCreate9(D3D_SDK_VERSION);
|
|
CreateDevice(..., &d3dpp, &m_pd3dDevice);
|
|
```
|
|
|
|
### 2.5 Present 파라미터 변경
|
|
```cpp
|
|
// DX8
|
|
D3DPRESENT_PARAMETERS d3dpp;
|
|
|
|
// DX9 - 동일하지만 일부 플래그 추가됨
|
|
D3DPRESENT_PARAMETERS d3dpp;
|
|
// PresentationInterval 옵션 확장
|
|
```
|
|
|
|
### 2.6 셰이더 관련 변경
|
|
- **Vertex Shader**: 버전 1.x → 2.0/3.0 지원
|
|
- **Pixel Shader**: 버전 1.x → 2.0/3.0 지원
|
|
- 셰이더 상수 테이블 관리 개선
|
|
|
|
### 2.7 리소스 관리 변경
|
|
- **Lock 플래그**: `D3DLOCK_NOSYSLOCK` 제거됨
|
|
- **쿼리 시스템**: 새로운 쿼리 인터페이스 추가
|
|
|
|
---
|
|
|
|
## 3. 마이그레이션 전략
|
|
|
|
### 3.1 단계별 접근 (Phase-by-Phase)
|
|
|
|
#### **Phase 1: 준비 단계** ✅
|
|
- [x] 현재 코드 분석 완료
|
|
- [x] DX9 SDK 설치 확인
|
|
- [x] dx9 브랜치 생성
|
|
- [ ] DX9 라이브러리 준비
|
|
|
|
#### **Phase 2: 코어 인터페이스 변환** (우선순위: 최상)
|
|
1. **EnumD3D.h/cpp** - 디바이스 열거 시스템
|
|
- `LPDIRECT3D8` → `LPDIRECT3D9`
|
|
- `D3DCAPS8` → `D3DCAPS9`
|
|
- `D3DADAPTER_IDENTIFIER8` → `D3DADAPTER_IDENTIFIER9`
|
|
- `Direct3DCreate8()` → `Direct3DCreate9()`
|
|
|
|
2. **BaseGraphicsLayer.h/cpp** - 그래픽 시스템 루트
|
|
- `LPDIRECT3DDEVICE8` → `LPDIRECT3DDEVICE9`
|
|
- `LPDIRECT3D8` → `LPDIRECT3D9`
|
|
- 디바이스 생성 코드 수정
|
|
|
|
3. **RenderDevice.h/cpp** - 렌더 디바이스
|
|
- `LPDIRECT3DDEVICE8` → `LPDIRECT3DDEVICE9`
|
|
|
|
#### **Phase 3: 텍스처 및 리소스 시스템** (우선순위: 상)
|
|
4. **Texture.h/cpp, NTexture.h/cpp** - 텍스처 관리
|
|
- `IDirect3DTexture8` → `IDirect3DTexture9`
|
|
- `IDirect3DSurface8` → `IDirect3DSurface9`
|
|
- `D3DXCreateTextureFromFile` 호환성 확인
|
|
|
|
5. **VertexBuffer.h/cpp** - 버텍스 버퍼
|
|
- `IDirect3DVertexBuffer8` → `IDirect3DVertexBuffer9`
|
|
- `IDirect3DIndexBuffer8` → `IDirect3DIndexBuffer9`
|
|
|
|
6. **RenderTexture.h/cpp, RenderTargetTexture.h/cpp**
|
|
- 렌더 타겟 관련 코드 업데이트
|
|
|
|
#### **Phase 4: 렌더링 시스템** (우선순위: 상)
|
|
7. **Zalla3D Scene Class** - 씬 렌더링
|
|
- `Z3DRenderable.h/cpp`
|
|
- `Z3DTexture.h/cpp`
|
|
- `Z3DGeneralChrModel.h/cpp`
|
|
- `Z3DMultipartSkin.h/cpp`
|
|
- `NMesh.h/cpp`
|
|
- `OctreeScene.h/cpp`
|
|
|
|
8. **Effect 시스템**
|
|
- `EffMeshloader.h/cpp`
|
|
- `SMRHeader.h/cpp`
|
|
- `CGemRender.h/cpp`
|
|
|
|
#### **Phase 5: UI 및 폰트** (우선순위: 중)
|
|
9. **d3dfont.h/cpp** - 폰트 시스템
|
|
- `ID3DXFont` 인터페이스 업데이트
|
|
|
|
10. **Sprite 시스템**
|
|
- `Sprite.h`
|
|
- `RYLSpriteEX.h`
|
|
|
|
#### **Phase 6: 고급 기능** (우선순위: 중)
|
|
11. **셰이더 시스템**
|
|
- 버텍스/픽셀 셰이더 코드 검토
|
|
- 셰이더 버전 확인 및 업데이트
|
|
|
|
12. **워터 및 특수 효과**
|
|
- `WaterW.h/cpp`
|
|
- `WaterScene.h/cpp`
|
|
|
|
#### **Phase 7: 프로젝트 설정** (우선순위: 최상)
|
|
13. **vcxproj 파일 수정**
|
|
- 링크 라이브러리 변경
|
|
- 인클루드 경로 업데이트
|
|
- 프리프로세서 정의 수정
|
|
|
|
#### **Phase 8: 테스트 및 검증** (우선순위: 최상)
|
|
14. **빌드 및 테스트**
|
|
- 컴파일 오류 수정
|
|
- 런타임 테스트
|
|
- 성능 비교
|
|
- 렌더링 결과 검증
|
|
|
|
### 3.2 자동화 스크립트
|
|
```bash
|
|
# 헤더 파일 일괄 변경
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/<d3d8\.h>/<d3d9.h>/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/<d3dx8\.h>/<d3dx9.h>/g' {} +
|
|
|
|
# 인터페이스 변경
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/LPDIRECT3D8/LPDIRECT3D9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/LPDIRECT3DDEVICE8/LPDIRECT3DDEVICE9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DTexture8/IDirect3DTexture9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DSurface8/IDirect3DSurface9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DVertexBuffer8/IDirect3DVertexBuffer9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/IDirect3DIndexBuffer8/IDirect3DIndexBuffer9/g' {} +
|
|
|
|
# 구조체 변경
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/D3DCAPS8/D3DCAPS9/g' {} +
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/D3DADAPTER_IDENTIFIER8/D3DADAPTER_IDENTIFIER9/g' {} +
|
|
|
|
# API 함수 변경
|
|
find . -type f \( -name "*.h" -o -name "*.cpp" \) -exec sed -i 's/Direct3DCreate8/Direct3DCreate9/g' {} +
|
|
```
|
|
|
|
---
|
|
|
|
## 4. 리스크 및 주의사항
|
|
|
|
### 4.1 높은 리스크 영역
|
|
1. **셰이더 코드**: 버전 차이로 인한 호환성 문제 가능
|
|
2. **렌더 스테이트**: 일부 스테이트 동작 변경
|
|
3. **텍스처 포맷**: 일부 포맷 지원 차이
|
|
4. **성능**: DX9가 더 최적화되어 있을 수 있음
|
|
|
|
### 4.2 테스트 체크리스트
|
|
- [ ] 디바이스 생성 및 초기화
|
|
- [ ] 텍스처 로드 및 렌더링
|
|
- [ ] 캐릭터 모델 렌더링
|
|
- [ ] UI 렌더링
|
|
- [ ] 이펙트 시스템
|
|
- [ ] 폰트 렌더링
|
|
- [ ] 워터 렌더링
|
|
- [ ] 전체 게임 실행
|
|
|
|
---
|
|
|
|
## 5. DX9 SDK 요구사항
|
|
|
|
### 5.1 필요 파일
|
|
- **Include**: `d3d9.h`, `d3dx9.h`, `d3dx9core.h`, `d3dx9math.h`, `d3dx9mesh.h`, `d3dx9tex.h`
|
|
- **Lib**: `d3d9.lib`, `d3dx9.lib`, `d3dx9d.lib`, `dxerr9.lib`, `dxguid.lib`
|
|
- **DLL**: `d3d9.dll`, `d3dx9_43.dll` (재배포 필요)
|
|
|
|
### 5.2 SDK 버전
|
|
- **권장**: DirectX 9.0c (August 2009) - 가장 안정적
|
|
- **최소**: DirectX 9.0b
|
|
|
|
---
|
|
|
|
## 6. 예상 작업 시간
|
|
|
|
| Phase | 작업 | 예상 시간 |
|
|
|-------|------|----------|
|
|
| 1 | 준비 | 0.5일 |
|
|
| 2 | 코어 인터페이스 | 1일 |
|
|
| 3 | 텍스처/리소스 | 1일 |
|
|
| 4 | 렌더링 시스템 | 2일 |
|
|
| 5 | UI/폰트 | 1일 |
|
|
| 6 | 고급 기능 | 1일 |
|
|
| 7 | 프로젝트 설정 | 0.5일 |
|
|
| 8 | 테스트/검증 | 2일 |
|
|
| **합계** | | **9일** |
|
|
|
|
---
|
|
|
|
## 7. 롤백 계획
|
|
|
|
### 7.1 브랜치 전략
|
|
- `master`: DX8 원본 유지
|
|
- `dx9`: DX9 마이그레이션 작업
|
|
- 문제 발생 시 언제든 master로 복귀 가능
|
|
|
|
### 7.2 백업
|
|
- 현재 작업 중인 Client 디렉토리 전체 백업 권장
|
|
- Git 커밋을 단계별로 세밀하게 진행
|
|
|
|
---
|
|
|
|
## 8. 다음 단계
|
|
|
|
1. ✅ 이 문서 검토
|
|
2. ⏳ DX9 SDK 라이브러리 준비
|
|
3. ⏳ Phase 2 시작: EnumD3D 변환
|
|
4. ⏳ 단계별 커밋 및 테스트
|
|
|
|
---
|
|
|
|
**작성일**: 2025-11-30
|
|
**작성자**: Claude (AI Assistant)
|
|
**현재 브랜치**: dx9
|