상세 컨텐츠

본문 제목

용량이 큰 텍스쳐 이미지 처리하기.

프로그래밍 관련/3D,2D DRAW 관련

by AlrepondTech 2009. 11. 10. 15:33

본문

반응형

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

/*
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

;
}


=================================

=================================

=================================

 

 




반응형


관련글 더보기

댓글 영역