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
10 KiB
10 KiB
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
static LPDIRECT3DDEVICE8 m_pd3dDevice;
static LPDIRECT3D8 m_pD3D;
- 역할: 전체 그래픽 시스템의 루트 클래스
- 영향도: ⭐⭐⭐⭐⭐ (최상위 - 모든 렌더링 의존)
파일: RenderDevice.h / RenderDevice.cpp
LPDIRECT3DDEVICE8 m_pd3dDevice;
- 역할: 렌더링 디바이스 래퍼
- 영향도: ⭐⭐⭐⭐⭐
파일: EnumD3D.h / EnumD3D.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.hCharacterActionControl/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 헤더 파일 변경
// 변경 전
#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 디바이스 생성 변경
// DX8
Direct3DCreate8(D3D_SDK_VERSION);
CreateDevice(..., &d3dpp, &m_pd3dDevice);
// DX9
Direct3DCreate9(D3D_SDK_VERSION);
CreateDevice(..., &d3dpp, &m_pd3dDevice);
2.5 Present 파라미터 변경
// 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: 준비 단계 ✅
- 현재 코드 분석 완료
- DX9 SDK 설치 확인
- dx9 브랜치 생성
- DX9 라이브러리 준비
Phase 2: 코어 인터페이스 변환 (우선순위: 최상)
-
EnumD3D.h/cpp - 디바이스 열거 시스템
LPDIRECT3D8→LPDIRECT3D9D3DCAPS8→D3DCAPS9D3DADAPTER_IDENTIFIER8→D3DADAPTER_IDENTIFIER9Direct3DCreate8()→Direct3DCreate9()
-
BaseGraphicsLayer.h/cpp - 그래픽 시스템 루트
LPDIRECT3DDEVICE8→LPDIRECT3DDEVICE9LPDIRECT3D8→LPDIRECT3D9- 디바이스 생성 코드 수정
-
RenderDevice.h/cpp - 렌더 디바이스
LPDIRECT3DDEVICE8→LPDIRECT3DDEVICE9
Phase 3: 텍스처 및 리소스 시스템 (우선순위: 상)
-
Texture.h/cpp, NTexture.h/cpp - 텍스처 관리
IDirect3DTexture8→IDirect3DTexture9IDirect3DSurface8→IDirect3DSurface9D3DXCreateTextureFromFile호환성 확인
-
VertexBuffer.h/cpp - 버텍스 버퍼
IDirect3DVertexBuffer8→IDirect3DVertexBuffer9IDirect3DIndexBuffer8→IDirect3DIndexBuffer9
-
RenderTexture.h/cpp, RenderTargetTexture.h/cpp
- 렌더 타겟 관련 코드 업데이트
Phase 4: 렌더링 시스템 (우선순위: 상)
-
Zalla3D Scene Class - 씬 렌더링
Z3DRenderable.h/cppZ3DTexture.h/cppZ3DGeneralChrModel.h/cppZ3DMultipartSkin.h/cppNMesh.h/cppOctreeScene.h/cpp
-
Effect 시스템
EffMeshloader.h/cppSMRHeader.h/cppCGemRender.h/cpp
Phase 5: UI 및 폰트 (우선순위: 중)
-
d3dfont.h/cpp - 폰트 시스템
ID3DXFont인터페이스 업데이트
-
Sprite 시스템
Sprite.hRYLSpriteEX.h
Phase 6: 고급 기능 (우선순위: 중)
-
셰이더 시스템
- 버텍스/픽셀 셰이더 코드 검토
- 셰이더 버전 확인 및 업데이트
-
워터 및 특수 효과
WaterW.h/cppWaterScene.h/cpp
Phase 7: 프로젝트 설정 (우선순위: 최상)
- vcxproj 파일 수정
- 링크 라이브러리 변경
- 인클루드 경로 업데이트
- 프리프로세서 정의 수정
Phase 8: 테스트 및 검증 (우선순위: 최상)
- 빌드 및 테스트
- 컴파일 오류 수정
- 런타임 테스트
- 성능 비교
- 렌더링 결과 검증
3.2 자동화 스크립트
# 헤더 파일 일괄 변경
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 높은 리스크 영역
- 셰이더 코드: 버전 차이로 인한 호환성 문제 가능
- 렌더 스테이트: 일부 스테이트 동작 변경
- 텍스처 포맷: 일부 포맷 지원 차이
- 성능: 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. 다음 단계
- ✅ 이 문서 검토
- ⏳ DX9 SDK 라이브러리 준비
- ⏳ Phase 2 시작: EnumD3D 변환
- ⏳ 단계별 커밋 및 테스트
작성일: 2025-11-30 작성자: Claude (AI Assistant) 현재 브랜치: dx9