=================================
=================================
=================================
/*
1. Get surface from texture. D3DXLoadSurfaceFromSurface() 2. POOL_SYSTEMMEM -> POOL_DEFAULT IDirect3DDevice9::UpdateSurface( ); IDirect3DDevice9::UpdateTexture( ); 3. POOL_DEFAULT -> POOL_SYSTEMMEM IDirect3DDevice9::GetRenderTargetData( ); 4. ANYTHING -> POOL_DEFAULT IDirect3DDevice9::StretchRect( ); ----------------------------------------------------------------- 1. D3DPOOL_DEFAULT - 리소스가 메모리 풀에 생성 - 대개 비디오 메모리에 생성 - 다이나믹 텍스처 또는 Private가 아니면 Lock할 수 없다. - Lock할 수 없는 텍스처에 접근하기 위해서는 반드시 UpdateSurface, UpdateTexture, GetFrontBufferData, GetRenderTargetData와 같은 함수들을 사용해야 한다. - D3DPOOL_MANAGED를 사용하는 것이 대부분의 어플리케이션에 더 낫다. - 디바이스를 해제할 때 즉, Reset함수를 사용하기 전에 반드시 Release를 해야 한다. - Direct3D Runtime 동안에 알려지지 않는 권한이 있는 픽셀 포맷들 안에 생성된 텍스처들은 Lock될 수 있다. 2. D3DPOOL_MANAGED - 디바이스가 접근 가능하고 필요한 만큼 메모리에 자동적으로 복사된다. - 관리 메모리는 디바이스를 잃어도 재생성할 필요가 없고 System memory로 돌아간다.(중요) - Locked될 수 있다. - 오직 System Memory 복사만 직접적으로 수정된다. - 대부분의 Static한 리소스로 사용되는데 디바이스를 잃더라도 저장되어 있기 때문이다. - 리소스들이 실행 중에 저장된다. - 통합메모리 구축에 유용한다. - 동적인 리소스들은 맞지 않다. - 사실 VertexBuffer, IndexBuffer들은 D3DUSAAGE_DYNAMIC과 함께 생성 될 수 있다. 3. D3DPOOL_SYSTEMMEM - Direct3D 디바이스가 접근할 수 없는 메모리이다. - 메모리할당은 램을 소비하지만 Pageable(기억가능한) 램을 소비 하지않는다. - Locked이 가능하고 UpdateSurface, UpdateTexture 함수를 통해서 D3DPOOL_DEFAULT 로 사용된 메모리가 Source로 사용될 수 있다. ** 공종할 수 있는 조합들 ** - POOL_DEFAULT <=> USAGE_RENDERTARGET, USAGE_DEPTHSTENCIL - POOL_DEFAULT <=> USAGE_DYNAMIC, AUTOGENMIPMAP - POOL_MANAGED <=> USAGE_AUTOGENMIPMAP - POOL_SYSTEMMEM <=> USAGE_DYNAMIC - 동적인 텍스처들을 위해서 때때로 비디오 메모리와 시스템 메모리 텍스처들 모두 POOL_DEFAULT와 POOL_SYSTEMMEM을 사용하는 비디오 메모리에 할당하는 것이 합당하다. - UpdateTexture함수로 비디오 메모리를 업데이트할 수 있다. */
// 서브페이스 예제로 든 코드
bool
CTexture::CreateFromSurface( LPDIRECT3DSURFACE9 pSurface, RECT* pSrcRect )
{
HRESULT hr;
if
(! m_pD3DDevice)
return false
;
if
(! pSurface)
return false
;
D3DSURFACE_DESC surfDesc;
pSurface->GetDesc(&surfDesc);
if
(surfDesc.Pool != D3DPOOL_SYSTEMMEM)
{
DXTRACE_MSG(
L"CreateFromSurface() - Source surface is NOT D3DPOOL_SYSTEMMEM"
);
return false
;
}
UINT w = RectWidth(*pSrcRect);
UINT h = RectHeight(*pSrcRect);
hr = D3DXCreateTexture(
m_pD3DDevice,
w,
h,
1
,
0
,
surfDesc.Format,
D3DPOOL_MANAGED,
//D3DPOOL_DEFAULT,
&m_pD3DTexture);
if
( FAILED(hr) )
{
DXUTTRACE(
L"CreateFromSurface() - D3DXCreateTexture\n"
);
return false
;
}
SetRect( &m_rcTextureImage,
0
,
0
, w, h );
D3DSURFACE_DESC desc;
m_pD3DTexture->GetLevelDesc(
0
, &desc);
SetRect( &m_rcTexture,
0
,
0
, desc.Width, desc.Height );
LPDIRECT3DSURFACE9 pTexSurface;
m_pD3DTexture->GetSurfaceLevel(
0
, &pTexSurface);
hr = D3DXLoadSurfaceFromSurface(
pTexSurface,
NULL
,
&m_rcTexture,
pSurface,
NULL
,
pSrcRect,
D3DX_FILTER_NONE,
0xFF000000
);
if
( hr != S_OK)
{
SAFE_RELEASE(pTexSurface);
return false
;
}
#if 0 hr = m_pD3DDevice->UpdateSurface(pSurface, pSrcRect, pTexSurface, NULL); if( hr != S_OK ) { DXTRACE_ERR( L"> UpdateSurface", hr ); SAFE_RELEASE(pTexSurface); return false; } #endif
SAFE_RELEASE(pTexSurface);
return true
;
}
//--class Csurface ---------------------------------------- h 섭페이스 처리
#pragma once
#include "CGraphics.h" class
CSurface
{
public
:
CSurface( CGraphics* pGraphics );
~CSurface();
protected
:
CGraphics* m_pGraphics;
LPDIRECT3DDEVICE9 m_pD3DDevice;
LPDIRECT3DSURFACE9 m_pSurface;
D3DXIMAGE_INFO m_tImageInfo;
public
:
bool
CreateFromFile(WCHAR *pszFile, RECT* pSrcRect, RECT* pDestRect,
int
nFilter, D3DCOLOR colourKey);
bool
CreateFromFileInMemory(LPCVOID pBuffer, UINT nSize, RECT* pSrcRect, RECT* pDestRect,
int
nFilter, D3DCOLOR colourKey);
bool
CopyFromSurface(RECT* pDstRect, CSurface* pSrcSurface, RECT* pSrcRect,
int
nFilter = D3DX_FILTER_NONE , D3DCOLOR color =
0xFF000000
);
void
Release();
LPDIRECT3DSURFACE9 GetSurface() {
return
m_pSurface; }
};
//---------------------------------------------------------cpp
//--------------------------------------------------------------------------------------
// File: CSurface.cpp // //-------------------------------------------------------------------------------------- #include "CSurface.h" #include "CGameApp.h" //-------------------------------------------------------------------------------------- // Constructor //--------------------------------------------------------------------------------------
CSurface::CSurface( CGraphics* pGraphics)
{
m_pGraphics = pGraphics;
m_pD3DDevice = pGraphics->GetD3DDevice();
m_pSurface =
NULL
;
}
CSurface::~CSurface()
{
Release();
}
void
CSurface::Release()
{
SAFE_RELEASE(m_pSurface);
}
bool
CSurface::CreateFromFile(
WCHAR *pszFile,
RECT* pSrcRect,
RECT* pDestRect,
int
nFilter,
D3DCOLOR colourKey)
{
if
(m_pD3DDevice ==
NULL
)
return false
;
HRESULT hr;
hr = m_pD3DDevice->CreateOffscreenPlainSurface(
1
,
1
,
D3DFMT_A8R8G8B8,
//D3DFMT_A1R5G5B5,
D3DPOOL_SYSTEMMEM,
&m_pSurface,
NULL
);
if
( FAILED(hr) )
{
DXTRACE_ERR(
L""
, hr);
return false
;
}
WCHAR file[MAX_PATH];
swprintf_s(file,
L"%s\\image\\%s"
, _GetApplicationInfo()->szAppPath, pszFile);
PALETTEENTRY palette[
256
];
// Optional
hr = D3DXLoadSurfaceFromFile( m_pSurface,
NULL
,
NULL
, file,
NULL
, D3DX_FILTER_NONE,
0
, &m_tImageInfo);
if
( FAILED(hr) )
{
SAFE_RELEASE( m_pSurface );
DXTRACE_ERR(
L""
, hr);
return false
;
}
SAFE_RELEASE( m_pSurface );
hr = m_pD3DDevice->CreateOffscreenPlainSurface(
m_tImageInfo.Width,
m_tImageInfo.Height,
m_tImageInfo.Format,
D3DPOOL_SYSTEMMEM,
&m_pSurface,
NULL
);
if
( FAILED(hr) )
{
DXTRACE_ERR(
L""
, hr);
return false
;
}
hr = D3DXLoadSurfaceFromFile(m_pSurface, palette, pDestRect, file, pSrcRect, nFilter, colourKey, &m_tImageInfo);
if
( FAILED(hr) )
{
SAFE_RELEASE( m_pSurface );
DXTRACE_ERR(
L""
, hr);
return false
;
}
return true
;
}
bool
CSurface::CreateFromFileInMemory(
LPCVOID pBuffer,
UINT nBufSize,
RECT* pSrcRect,
RECT* pDestRect,
int
nFilter,
D3DCOLOR colourKey)
{
if
(m_pD3DDevice ==
NULL
)
return false
;
HRESULT hr;
PALETTEENTRY palette[
256
];
// Optional
hr = m_pD3DDevice->CreateOffscreenPlainSurface(
1
,
1
,
D3DFMT_A8R8G8B8,
//D3DFMT_A1R5G5B5,
D3DPOOL_SYSTEMMEM,
&m_pSurface,
NULL
);
if
( FAILED(hr) )
{
DXTRACE_ERR(
L""
, hr);
return false
;
}
hr = D3DXLoadSurfaceFromFileInMemory(
m_pSurface,
NULL
,
NULL
,
pBuffer,
nBufSize,
NULL
,
D3DX_FILTER_NONE,
0
,
&m_tImageInfo);
if
( FAILED(hr) )
{
SAFE_RELEASE( m_pSurface );
DXTRACE_ERR(
L""
, hr);
return false
;
}
SAFE_RELEASE( m_pSurface );
hr = m_pD3DDevice->CreateOffscreenPlainSurface(
m_tImageInfo.Width,
m_tImageInfo.Height,
m_tImageInfo.Format,
D3DPOOL_SYSTEMMEM,
&m_pSurface,
NULL
);
if
( FAILED(hr) )
{
DXTRACE_ERR(
L""
, hr);
return false
;
}
hr = D3DXLoadSurfaceFromFileInMemory(
m_pSurface,
palette,
pDestRect ,
pBuffer,
nBufSize,
pSrcRect,
nFilter,
colourKey,
&m_tImageInfo);
if
( FAILED(hr) )
{
SAFE_RELEASE( m_pSurface );
DXTRACE_ERR(
L""
, hr);
return false
;
}
return true
;
}
bool
CSurface::CopyFromSurface(
RECT* pDstRect,
CSurface* pSrcSurface,
RECT* pSrcRect,
int
nFilter,
D3DCOLOR color )
{
HRESULT hr;
if
(! pSrcSurface)
return false
;
if
(! m_pD3DDevice)
return false
;
hr = D3DXLoadSurfaceFromSurface(
m_pSurface,
NULL
,
pDstRect,
pSrcSurface->GetSurface(),
NULL
,
pSrcRect,
nFilter,
color);
if
( hr != S_OK)
{
return false
;
}
return true
;
}
=================================
=================================
=================================
'프로그래밍 관련 > 3D,2D DRAW 관련' 카테고리의 다른 글
SDL 개발환경 셋팅 관련 (0) | 2017.05.10 |
---|---|
OpenGL 오픈지엘 glew 관련 외부 기호를 확인할 수 없습니다. 에러 관련 (0) | 2017.04.25 |
[FAQ] Directx 3D (0) | 2011.03.30 |
옥트리 관하여 (0) | 2011.03.30 |
brew - 오픈지엘 OpenGL ES 제우스 예제들 (0) | 2011.03.29 |
댓글 영역