Search Results for 'D3DTexture'


1 POSTS

  1. 2009/02/25 D3D Texture 설명 by Junios

D3D Texture 설명

*텍스처


텍스처를 로딩하는 방법부터 알아봅시다.. 가장 쉬운것으로는 아래와같은 함수를 씁니다.
파일을 기본으로 해 텍스처를 생성 합니다.


구문

HRESULT D3DXCreateTextureFromFile(          LPDIRECT3DDEVICE9 pDevice,
    LPCTSTR pSrcFile,
    LPDIRECT3DTEXTURE9 *ppTexture
);


파라미터

pDevice
[in] IDirect3DDevice9 인터페이스의 포인터. 텍스처에 관련지을 수 있는 장치를 나타낸다.
pSrcFile
[in] 파일명을 지정하는 캐릭터 라인의 포인터. 컴파일러의 설정이 Unicode 를 요구하고 있는 경우, 데이터 타입 LPCTSTR 는 LPCWSTR 가 된다.
그 이외의 경우는, 이 캐릭터 라인의 데이터 타입은 LPCSTR 가 된다. 「주의」를 참조할것.
ppTexture
[out] 생성 된 큐브 텍스처 개체를 나타내는,IDirect3DTexture9 인터페이스의 포인터 주소.
반환값


성공했을 경우는,D3D_OK 를 돌려준다.

다음은 좀더 많은 설정이 필요한 텍스처를 로딩하는 함수입니다.. 이것은 컬러키를 지정할수가있네요..

구문

HRESULT D3DXCreateTextureFromFileEx(          LPDIRECT3DDEVICE9 pDevice,
    LPCTSTR pSrcFile,
    UINT Width,
    UINT Height,
    UINT MipLevels,
    DWORD Usage,
    D3DFORMAT Format,
    D3DPOOL Pool,
    DWORD Filter,
    DWORD MipFilter,
    D3DCOLOR ColorKey,
    D3DXIMAGE_INFO *pSrcInfo,
    PALETTEENTRY *pPalette,
    LPDIRECT3DTEXTURE9 *ppTexture
);

파라미터

pDevice
[in] IDirect3DDevice9 인터페이스의 포인터. 텍스처에 관련지을 수 있는 장치를 나타낸다.

pSrcFile
[in] 파일명을 지정하는 캐릭터 라인의 포인터. 컴파일러의 설정이 Unicode 를 요구하고 있는 경우,
데이터 타입 LPCTSTR 는 LPCWSTR 가 된다. 그 이외의 경우는, 이 캐릭터 라인의 데이터 타입은 LPCSTR 가 된다.

Width
[in] 폭 (픽셀 단위). 이 값이 0 또는 D3DX_DEFAULT 의 경우, 넓이는 파일로부터 취득된다.

Height
[in] 높이 (픽셀 단위). 이 값이 0 또는 D3DX_DEFAULT 의 경우, 넓이는 파일로부터 취득된다.

MipLevels
[in] 요구되는 밉레벨의 수. 이 값이 0 또는 D3DX_DEFAULT 의 경우는, 완전한 밉맵 체인이 생성 된다.

Usage
[in] 0, D3DUSAGE_RENDERTARGET, 또는 D3DUSAGE_DYNAMIC. 이 플래그를 D3DUSAGE_RENDERTARGET 로 설정 하면,
그 표면는 렌더링 타겟으로서 사용되는 것을 나타낸다. 리소스는,IDirect3DDevice9::SetRenderTarget 메서드의 pNewRenderTarget
파라미터에 건네줄 수가 있다. D3DUSAGE_RENDERTARGET 또는 D3DUSAGE_DYNAMIC 를 지정하는 경우,Pool 를 D3DPOOL_DEFAULT 로 설정해,
애플리케이션은 IDirect3D9::CheckDeviceFormat 를 호출해, 장치가 이 처리를 지원 하고 있는 것을 확인할 필요가 있다. D3DUSAGE_DYNAMIC 는,
표면를 동적으로 처리할 필요가 있는 것을 나타낸다. 동적 텍스처의 사용법의 더 자세한 정보는, 「동적 텍스처의 사용법」을 참조할것.

Format
D3DFORMAT 열거형의 멤버. 텍스처에 대해서 요구된 픽셀 포맷을 기술한다. 돌려받는 텍스처의 포맷은,Format 로 지정한 포맷과 다른 경우가 있다.
애플리케이션은, 돌려주어진 텍스처의 포맷을 확인할 필요가 있다. Format 의 값이 D3DFMT_UNKNOWN 의 경우, 포맷은 파일로부터 취득된다.

Pool
[in] D3DPOOL 열거형의 멤버. 텍스처의 배치처가 되는 메모리 클래스를 기술한다.

Filter
[in] 이미지를 필터링 하는 방법을 제어하는 1 개 혹은 복수의 D3DX_FILTER 의 편성. 이 파라미터에 D3DX_DEFAULT 를 지정하는 것은,
D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER 를 지정하는 것으로 동일하다.

MipFilter
[in] 이미지를 필터링 하는 방법을 제어하는 1 개 혹은 복수의 D3DX_FILTER 의 편성. 이 파라미터에 D3DX_DEFAULT 를 지정하는 것은,
D3DX_FILTER_BOX 를 지정하는 것으로 동일하다.

ColorKey
[in] 투명이 되는 D3DCOLOR 의 값. 컬러 키를 무효로 하는 경우는 0 을 지정한다. 소스 이미지의 포맷과는 관계없이,
이것은 항상 32 비트의 ARGB 컬러이다. 알파가 의미가 있고,
보통은 컬러 키를 불투명하게 하는 경우는 FF 를 지정한다. 따라서, 불투명한 흑의 경우, 값은 0xFF000000 가 된다.

pSrcInfo
[in, out] 소스 이미지 파일내의 데이터의 기술을 저장 하는 D3DXIMAGE_INFO 구조체의 포인터, 또는 NULL.

pPalette
[out] 저장 하는 256 색팔레트를 나타내는 PALETTEENTRY 구조체의 포인터, 또는 NULL.

ppTexture
[out] 생성 된 큐브 텍스처 개체를 나타내는,IDirect3DTexture9 인터페이스의 포인터 주소.
반환값


성공했을 경우는,D3D_OK 를 돌려준다

아래는 사용예입니다.

hr = D3DXCreateTextureFromFileEx( g_pd3dDevice, strFile,
                                      m_pLandStyle->dwTextureSize, m_pLandStyle->dwTextureSize, 1, 0, D3DFMT_UNKNOWN,
                                      D3DPOOL_MANAGED, D3DX_FILTER_LINEAR,
                                      D3DX_FILTER_LINEAR, 0, NULL, NULL, &m_pTexture );

텍스처를 로딩했으니까 이젠 한번 로딩된 텍스처데이터에 접근을 해보도록 하죠
예제소스는 아래와같습니다..
D3DSURFACE_DESC surfDesc; hr = m_pTexture->GetLevelDesc( 0, &surfDesc ); D3DLOCKED_RECT LockedRect; hr = m_pTexture->LockRect( 0, &LockedRect, NULL, 0 ); if( FAILED(hr) ) return DXTRACE_ERR( TEXT("LockRect"), hr ); DWORD* pBits; for( DWORD iTexelZ=0; iTexelZUnlockRect( 0 );

보시다시피 락을 걸구 접근을합니다.. 락을 사용하기위해D3DLOCKED_RECT를 사용하는데요..
설명은 아래와같습니다.


구문
typedef struct _D3DSURFACE_DESC {
    D3DFORMAT Format;
    D3DRESOURCETYPE Type;
    DWORD Usage;
    D3DPOOL Pool;
    D3DMULTISAMPLE_TYPE MultiSampleType;
    DWORD MultiSampleQuality;
    UINT Width;
    UINT Height;
} D3DSURFACE_DESC;
멤버

Format
D3DFORMAT 열거형의 멤버. 표면 포맷을 기술한다.

Type
D3DRESOURCETYPE 열거형의 멤버. 표면로서의 이 리소스를 식별한다.
typedef enum _D3DRESOURCETYPE {
    D3DRTYPE_SURFACE = 1,
    D3DRTYPE_VOLUME = 2,
    D3DRTYPE_TEXTURE = 3,
    D3DRTYPE_VOLUMETEXTURE = 4,
    D3DRTYPE_CUBETEXTURE = 5,
    D3DRTYPE_VERTEXBUFFER = 6,
    D3DRTYPE_INDEXBUFFER = 7,
    D3DRTYPE_FORCE_DWORD = 0x7fffffff
} D3DRESOURCETYPE;

Usage
D3DUSAGE_DEPTHSTENCIL 값 또는 D3DUSAGE_RENDERTARGET 값의 언젠가. 더 자세한 정보는, 「D3DUSAGE 」를 참조할것.

Pool
D3DPOOL 열거형의 멤버. 이 표면에 할당할 수 있는 메모리의 클래스를 지정한다.
typedef enum _D3DPOOL {
    D3DPOOL_DEFAULT = 0,
    D3DPOOL_MANAGED = 1,
    D3DPOOL_SYSTEMMEM = 2,
    D3DPOOL_SCRATCH = 3,
    D3DPOOL_FORCE_DWORD = 0x7fffffff
} D3DPOOL;



MultiSampleType
D3DMULTISAMPLE_TYPE 열거형의 멤버. 표면가 지원 하는 풀 신 멀티 샘플링의 레벨을 지정한다.

MultiSampleQuality
품질 레벨. 유효 범위는, 0 으로부터,IDirect3D9::CheckDeviceMultiSampleType 로 사용하는 pQualityLevels 에 돌려받는 레벨로부터
1 을 뺀 값까지이다. 그것보다 큰 값을 건네주면 에러 D3DERR_INVALIDCALL 가 돌려주어진다. 렌더링 타겟과 스텐실 표면의 편성의
MultisampleQuality 의 값, 및 그 멀티 샘플링 타입은, 모두 일치해야 한다.

Width
표면의 폭 (픽셀 단위).

Height
표면의 높이 (픽셀 단위).


잠긴표면기술..
typedef struct _D3DLOCKED_RECT {
    INT Pitch;
    void *pBits;
} D3DLOCKED_RECT;
멤버

Pitch
표면 피치 (바이트 단위).
pBits
락이 끝난 비트의 포인터. RECT 가 IDirect3DSurface9::LockRect 의 호출에 제공되고 있는 경우,pBits 는 표면의 선두로부터
적절히 오프셋(offset) 된다.

다음은 그냥 메모리상에 텍스처를 생성하는 방법입니다..
이것 역시 메소드 하나로 처리되긴한데 다른 텍스처로 대입할때 다른 표면을 생성해야된다는것이
조금 생소합니다..

    LPDIRECT3DTEXTURE9 pScratchTexture = NULL;
    //일단 텍스처를 생성한다.. 하늘의 텍스처를 생성한다는데..꼭 2배크기의 텍스처를만든다..
    hr = D3DXCreateTexture( g_pd3dDevice, nWidth*2, nHeight*2, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_SCRATCH, &pScratchTexture );
    if( FAILED(hr) )
        return DXTRACE_ERR( TEXT("D3DXCreateTexture"), hr );
    .
    . (표면에 대한 처리를 한다..)
    .
    hr = D3DXCreateTexture( g_pd3dDevice, nWidth*2, nHeight*2, 1, 0, m_fmtTexture, D3DPOOL_MANAGED, &m_pTexture );
    if( FAILED(hr) )
        return DXTRACE_ERR( TEXT("D3DXCreateTexture"), hr );

    // Use d3dx to convert from the scratch texture to a card supported texture format
    IDirect3DSurface9* pSurfaceSrc = NULL;
    IDirect3DSurface9* pSurfaceDest = NULL;
    m_pTexture->GetSurfaceLevel( 0, &pSurfaceDest );
    pScratchTexture->GetSurfaceLevel( 0, &pSurfaceSrc );

    hr = D3DXLoadSurfaceFromSurface( pSurfaceDest, NULL, NULL, pSurfaceSrc, NULL, NULL, D3DX_FILTER_POINT, 0 );
    if( FAILED(hr) )
        return DXTRACE_ERR( TEXT("D3DXLoadSurfaceFromSurface"), hr );

    SAFE_RELEASE( pSurfaceDest );
    SAFE_RELEASE( pSurfaceSrc );

    SAFE_RELEASE( pScratchTexture );

서페이스를 얻어오구 또다른 메소드를 이용해서 원하던 서페이스에 넣습니다...
물론 서페이스는 등록과정을 거쳐야 합니다..
GetSurfaceLevel이 그과정을 맡았습니다..
각함수의 설명은 아래와같습니다..

HRESULT D3DXCreateTexture(          LPDIRECT3DDEVICE9 pDevice,
    UINT Width,
    UINT Height,
    UINT MipLevels,
    DWORD Usage,
    D3DFORMAT Format,
    D3DPOOL Pool,
    LPDIRECT3DTEXTURE9 *ppTexture
);

파라미터

pDevice
[in] IDirect3DDevice9 인터페이스의 포인터. 텍스처에 관련지을 수 있는 장치를 나타낸다.

Width
[in] 폭 (픽셀 단위). 이 값이 0 의 경우, 값 1 이 사용된다. 「주의」를 참조할것.

Height
[in] 높이 (픽셀 단위). 이 값이 0 의 경우, 값 1 이 사용된다. 「주의」를 참조할것.

MipLevels
[in] 요구되는 밉레벨의 수. 이 값이 0 또는 D3DX_DEFAULT 의 경우는, 완전한 밉맵 체인이 생성 된다.

Usage
[in] 0, D3DUSAGE_RENDERTARGET, 또는 D3DUSAGE_DYNAMIC. 이 플래그를 D3DUSAGE_RENDERTARGET 로 설정 하면,
그 표면는 렌더링 타겟으로서 사용하는 것을 나타낸다. 그 후로 리소스를,IDirect3DDevice9::SetRenderTarget 메서드의
pNewRenderTarget 파라미터에 건네줄 수가 있다. D3DUSAGE_RENDERTARGET 또는 D3DUSAGE_DYNAMIC 을 지정하는 경우, 애플리케이션은
IDirect3D9::CheckDeviceFormat 를 호출해, 장치가 이 처리를 지원 하고 있는 것을 확인할 필요가 있다. 동적 텍스처의 사용법의
더 자세한 정보는, 「동적 텍스처의 사용법」을 참조할것.

Format
[in] D3DFORMAT 열거형의 멤버. 텍스처에 대해서 요구된 픽셀 포맷을 기술한다. 요구한 포맷을 장치가 지원 하고 있지 않는 경우는,
지정한 것과 다른 텍스처가 돌려받는 경우가 있다. 애플리케이션에서는, 돌려주어진 텍스처의 포맷을 체크해, 요구한 포맷과 일치할지
어떨지를 확인할 필요가 있다.

Pool
[in] D3DPOOL 열거형의 멤버. 텍스처의 배치처가 되는 메모리 클래스를 기술한다.

ppTexture
[out] 생성 된 큐브 텍스처 개체를 나타내는,IDirect3DTexture9 인터페이스의 포인터 주소.





색변환을 실시하면서, 다른 표면로부터 표면를 로드한다.
HRESULT D3DXLoadSurfaceFromSurface(          LPDIRECT3DSURFACE9 pDestSurface,
    CONST PALETTEENTRY *pDestPalette,
    CONST RECT *pDestRect,
    LPDIRECT3DSURFACE9 pSrcSurface,
    CONST PALETTEENTRY *pSrcPalette,
    CONST RECT *pSrcRect,
    DWORD Filter,
    D3DCOLOR ColorKey
);

파라미터

pDestSurface
[in] IDirect3DSurface9 인터페이스의 포인터. 목적지의 표면를 지정한다. 이 표면가 이미지를 받는다.

pDestPalette
[in] 256 색의 목적지 팔레트인 PALETTEENTRY 구조체의 포인터, 또는 NULL.

pDestRect
[in] RECT 구조체의 포인터. 목적지 직사각형을 지정한다. 이 파라미터에 NULL 를 설정해, 표면 전체를 지정한다.

pSrcSurface
[in] IDirect3DSurface9 인터페이스의 포인터. 전송원표면를 나타낸다.

pSrcPalette
[in] 256 색의 전송원팔레트인 PALETTEENTRY 구조체의 포인터, 또는 NULL.

pSrcRect
[in] RECT 구조체의 포인터. 전송원직사각형을 지정한다. 이 파라미터에 NULL 를 설정해, 표면 전체를 지정한다.

Filter
[in] 이미지를 필터링 하는 방법을 제어하는 1 개 혹은 복수의 D3DX_FILTER 의 편성. 이 파라미터에 D3DX_DEFAULT 를 지정하는 것은,
D3DX_FILTER_TRIANGLE | D3DX_FILTER_DITHER 를 지정하는 것으로 동일하다.

ColorKey
[in] 투명이 되는 D3DCOLOR 의 값. 컬러 키를 무효로 하는 경우는 0 을 지정한다. 소스 이미지의 포맷과는 관계없이,
이것은 항상 32 비트의 ARGB 컬러이다. 알파가 의미가 있고, 보통은 컬러 키를 불투명하게 하는 경우는 FF 를 지정한다.
따라서, 불투명한 흑의 경우, 값은 0xFF000000 가 된다.

다음은 2개의 텍스처표면을 조합하여 1개의 텍스처표면에 대치시키는 아주 멋진일을 해보겠습니다..
우선 두개의 텍스처표면을 생성합니다.. 물론 데이타도있어야겠죠.. 파일에서 읽어오든지 락을걸어서
데이타를 채우든지 마음대로 하세여.. 마지막으로 대상 텍스처표면도 생성해야겠죠?? 대상텍스처표면 생성시
주의점이있습니다.. 이것의 Usage파라미터의 값은 D3DUSAGE_RENDERTARGET 이어야 된다는것입니다..주의하시길..
그런다음 백버퍼의 정보를 얻어오구요.. 랜더링표면을 만듭니다.. 글구나서 랜더링표면을 이용해서 출력을 하면되죠..
이때 텍스처랜더링상태를 정해서 두개를 조합한상태로 출력을 하게됩니다..
. . (3개의 텍스처를 생성하고 2개는 데이터를 채운다..) . //랜더링표면을 생성한다.. hr = m_pTexture->GetLevelDesc( 0, &surfDesc ); //대상의 텍스처정보를 얻어온다.. ID3DXRenderToSurface* pRenderToSurface = NULL; hr = D3DXCreateRenderToSurface( g_pd3dDevice, surfDesc.Width, surfDesc.Height, surfDesc.Format, FALSE, D3DFMT_UNKNOWN, &pRenderToSurface ); //뷰포트를 얻어온다.. hr = m_pTexture->GetLevelDesc( 0, &surfDesc ); D3DVIEWPORT9 vp; vp.Width = surfDesc.Width; vp.Height = surfDesc.Height; vp.MinZ = 0; vp.MaxZ = 1.0f; vp.X = 0; vp.Y = 0; //대상텍스처의 표면을 얻어온후 그린다.. IDirect3DSurface9* pRenderSurface = NULL; m_pTexture->GetSurfaceLevel( 0, &pRenderSurface ); pRenderToSurface->BeginScene( pRenderSurface, &vp ); g_pd3dDevice->Clear( 0L, NULL, D3DCLEAR_TARGET, 0xFF000000, 1.0f, 0L ); D3DMATERIAL9 mtrl; D3DUtil_InitMaterial( mtrl, 1.0f, 1.0f, 1.0f ); hr = g_pd3dDevice->SetMaterial( &mtrl ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR ); g_pd3dDevice->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR ); hr = g_pd3dDevice->SetFVF( RHW_FVF ); hr = g_pd3dDevice->SetStreamSource( 0, pVB, 0, sizeof(RHW_VERTEX) ); hr = g_pd3dDevice->SetIndices( pIB ); g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_ONE ); g_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, 0 ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); g_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_BLENDCURRENTALPHA ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_TEXTURE ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TFACTOR ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_ALPHAARG1, D3DTA_CURRENT ); g_pd3dDevice->SetTextureStageState( 2, D3DTSS_COLOROP, D3DTOP_DISABLE ); . . . g_pd3dDevice->SetTexture( 0, pAlphaTex[i] ); g_pd3dDevice->SetTexture( 1, pSrcTex[i] ); g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 0, dwNumVerties, 0, dwNumFaces ); hr = pRenderToSurface->EndScene( D3DX_FILTER_LINEAR ); //모두다 정리한다.. SAFE_RELEASE( pRenderSurface ); g_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE ); SAFE_RELEASE( pIB ); SAFE_RELEASE( pVB ); SAFE_RELEASE( pRenderToSurface );
단 버택스의 형식은  아래와같습니다..
struct RHW_VERTEX           //특수지형 버택스 형식..
{
    D3DXVECTOR4 p;
    FLOAT       tu1, tv1;
    FLOAT       tu2, tv2;
};
#define RHW_FVF             (D3DFVF_XYZRHW|D3DFVF_TEX2)





투명색을 지정할경우 컬러키를 적용시킬수있습니다..
컬러키를 적용하기 위해서 알파블렌딩 상태를 가능하게 만들어야 합니다.

dev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
dev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
dev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);

dev->SetTexture(0, &tex);

dev->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
dev->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
dev->SetTextureStageState( 0, D3DTSS_COLOROP,  D3DTOP_MODULATE  );

dev->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
dev->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE););
dev->SetTextureStageState( 0, D3DTSS_ALPHAOP,  D3DTOP_MODULATE  );

Render();

dev->SetTexture(0, NULL);

dev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);                  //알파블렌딩을 꺼야한다..

정점의 포맷에 분산색상(D3DFVF_DIFFUSE)을 추가하여 이 분산색상의 알파값을 조정하여
흰색에서 검정색으로 점차 변하도록 값을 증가나 감소를 시킵니다..
그런다음 이 분산색상을
텍스쳐를 사용할때 스테이지를 사용하여 연산을 하게 했습니다..
형식에 대한 설명은 아래와같습니다..

typedef enum _D3DTEXTURESTAGESTATETYPE {
    D3DTSS_COLOROP = 1,
    D3DTSS_COLORARG1 = 2,
    D3DTSS_COLORARG2 = 3,
    D3DTSS_ALPHAOP = 4,
    D3DTSS_ALPHAARG1 = 5,
    D3DTSS_ALPHAARG2 = 6,
    D3DTSS_BUMPENVMAT00 = 7,
    D3DTSS_BUMPENVMAT01 = 8,
    D3DTSS_BUMPENVMAT10 = 9,
    D3DTSS_BUMPENVMAT11 = 10,
    D3DTSS_TEXCOORDINDEX = 11,
    D3DTSS_BUMPENVLSCALE = 22,
    D3DTSS_BUMPENVLOFFSET = 23,
    D3DTSS_TEXTURETRANSFORMFLAGS = 24,
    D3DTSS_COLORARG0 = 26,
    D3DTSS_ALPHAARG0 = 27,
    D3DTSS_RESULTARG = 28,
    D3DTSS_CONSTANT = 32,
    D3DTSS_FORCE_DWORD = 0x7fffffff
} D3DTEXTURESTAGESTATETYPE;

D3DTSS_COLOROP
텍스처 스테이지 스테이트는 텍스처 컬러 혼합 처리이며,D3DTEXTUREOP 열거형의 멤버에 의해 식별된다.
최초의 텍스처 스테이지 (스테이지 0)의 디폴트값은 D3DTOP_MODULATE 이며, 그 이외의 모든 스테이지의 디폴트값은 D3DTOP_DISABLE 이다.
typedef enum _D3DTEXTUREOP {
    D3DTOP_DISABLE = 1,
    D3DTOP_SELECTARG1 = 2,
    D3DTOP_SELECTARG2 = 3,
    D3DTOP_MODULATE = 4,
    D3DTOP_MODULATE2X = 5,
    D3DTOP_MODULATE4X = 6,
    D3DTOP_ADD = 7,
    D3DTOP_ADDSIGNED = 8,
    D3DTOP_ADDSIGNED2X = 9,
    D3DTOP_SUBTRACT = 10,
    D3DTOP_ADDSMOOTH = 11,
    D3DTOP_BLENDDIFFUSEALPHA = 12,
    D3DTOP_BLENDTEXTUREALPHA = 13,
    D3DTOP_BLENDFACTORALPHA = 14,
    D3DTOP_BLENDTEXTUREALPHAPM = 15,
    D3DTOP_BLENDCURRENTALPHA = 16,
    D3DTOP_PREMODULATE = 17,
    D3DTOP_MODULATEALPHA_ADDCOLOR = 18,
    D3DTOP_MODULATECOLOR_ADDALPHA = 19,
    D3DTOP_MODULATEINVALPHA_ADDCOLOR = 20,
    D3DTOP_MODULATEINVCOLOR_ADDALPHA = 21,
    D3DTOP_BUMPENVMAP = 22,
    D3DTOP_BUMPENVMAPLUMINANCE = 23,
    D3DTOP_DOTPRODUCT3 = 24,
    D3DTOP_MULTIPLYADD = 25,
    D3DTOP_LERP = 26,
    D3DTOP_FORCE_DWORD = 0x7fffffff
} D3DTEXTUREOP;


D3DTSS_COLORARG1
텍스처 스테이지 스테이트는, 그 스테이지에 대한 최초의 색인수이며,D3DTA 의 어느 쪽인가에보다 나타난다. 디폴트의 인수는 D3DTA_TEXTURE 이다.
읽고 쓰기용의 임시 레지스터의 색을 선택하려면 , D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는
경우에 지원 된다. 이 레지스터의 디폴트값은, (0.0, 0.0, 0.0, 0.0)이다.
D3DTA_CURRENT 텍스처 인수는 전의 혼합 스테이지의 결과이다. 최초의 텍스처 스테이지 (스테이지 0)에서는, 이 인수는 D3DTA_DIFFUSE 와 같다.
              전의 혼합 스테이지가 범프 맵 텍스처 (D3DTOP_BUMPENVMAP 처리)를 사용하고 있는 경우는, 범프 맵 텍스처의 전의 스테이지로부터
              텍스처가 선택된다. s 가 현재의 텍스처 스테이지를 나타내,s - 1 에 범프 맵 텍스처가 있는 경우, 이 인수는 텍스처
              스테이지 s - 2 로부터의 결과 출력이 된다. 읽고 쓰기가 허가된다. 
D3DTA_DIFFUSE 텍스처 인수는, gouraud shading 처리중에 정점의 성분으로부터 보간 해 얻을 수 있던 디퓨즈색이다. 정점이 디퓨즈색을
              포함하지 않는 경우의 디폴트색은 0xFFFFFFFF 이다. 허가는 읽기 전용이다. 
D3DTA_SELECTMASK 모든 인수에 대응하는 마스크값. 텍스처 인수의 설정에는 사용하지 않는다. 
D3DTA_SPECULAR 텍스처 인수는, gouraud shading 처리중에 정점의 성분으로부터 보간 된 스펙큐러색이다. 정점이
               스펙큐러색을 포함하지 않은 경우, 디폴트색은 0xFFFFFFFF 이다. 허가는 읽기 전용이다. 
D3DTA_TEMP 이 텍스처 인수는, 읽고 쓰기용의 임시 레지스터의 색이다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는 경우에
           지원 된다. 이 레지스터의 디폴트값은, (0.0, 0.0, 0.0, 0.0)이다. 허가는 읽고 쓰기이다. 
D3DTA_TEXTURE 텍스처 인수는, 이 텍스처 스테이지의 텍스처 컬러이다. 허가는 읽기 전용이다. 
D3DTA_TFACTOR 텍스처 인수는, 전회 D3DRENDERSTATETYPE 렌더링 스테이트값을 사용해 IDirect3DDevice9::SetRenderState 를 호출했을 때의
              텍스처 계수 세트이다. 허가는 읽기 전용이다. 



D3DTSS_COLORARG2
텍스처 스테이지 스테이트는, 그 스테이지에 대한 2 번째의 색인수이며,D3DTA 에 의해 식별된다. 디폴트의 인수는 D3DTA_CURRENT 이다.
읽고 쓰기용의 임시 레지스터의 색을 선택하려면 , D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는
경우에 지원 된다. 이 레지스터의 디폴트값은, (0.0, 0.0, 0.0, 0.0)이다.

D3DTSS_ALPHAOP
텍스처 스테이지 스테이트는, 텍스처 알파 혼합 처리이며,D3DTEXTUREOP 열거형의 멤버에 의해 식별된다. 최초의 텍스처 스테이지
(스테이지 0)의 디폴트값은 D3DTOP_SELECTARG1 이며, 그 이외의 모든 스테이지의 디폴트값은 D3DTOP_DISABLE 이다.

D3DTSS_ALPHAARG1
텍스처 스테이지 스테이트는, 그 스테이지에 대한 최초의 알파 인수이며,D3DTA 에 의해 식별된다. 디폴트의 인수는 D3DTA_TEXTURE 이다.
그 스테이지에 텍스처가 설정되어 있지 않은 경우는, D3DTA_DIFFUSE 가 디폴트의 인수가 된다. 읽고 쓰기용의 임시 레지스터의 색을 선택하려면
, D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는 경우에 지원 된다. 이 레지스터의 디폴트값은, (0.0, 0.0, 0.0, 0.0)이다.

D3DTSS_ALPHAARG2
텍스처 스테이지 스테이트는, 스테이지의 2 번째의 알파 인수이며,D3DTA 에 의해 식별된다. 디폴트의 인수는 D3DTA_CURRENT 이다.
읽고 쓰기용의 임시 레지스터의 색을 선택하려면 , D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는
경우에 지원 된다. 이 레지스터의 디폴트값은, (0.0, 0.0, 0.0, 0.0)이다.

D3DTSS_BUMPENVMAT00
텍스처 스테이지 스테이트는, 범프 맵핑 행렬의 [0][0] 계수에 대한 부동 소수점값이다. 디폴트값은 0.0 이다.

D3DTSS_BUMPENVMAT01
텍스처 스테이지 스테이트는, 범프 맵핑 행렬의 [0][1] 계수에 대한 부동 소수점값이다. 디폴트값은 0.0 이다.

D3DTSS_BUMPENVMAT10
텍스처 스테이지 스테이트는, 범프 맵핑 행렬의 [1][0] 계수에 대한 부동 소수점값이다. 디폴트값은 0.0 이다.

D3DTSS_BUMPENVMAT11
텍스처 스테이지 스테이트는, 범프 맵핑 행렬의 [1][1] 계수에 대한 부동 소수점값이다. 디폴트값은 0.0 이다.

D3DTSS_TEXCOORDINDEX
이 텍스처 스테이지에서 사용하기 위해서(때문에) 설정된 텍스처 좌표의 인덱스. 정점 1 개에 대해서 최대 8 세트까지의 텍스처 좌표를
설정할 수 있다. 정점이, 지정된 인덱스의 텍스처 좌표 세트를 포함하지 않은 경우는, u 및 v 좌표 (0,0)가 디폴트로 사용된다.
이 플래그는, 고정 기능 정점 처리에서만 사용한다. 예를 들어, 정점 셰이더에서는 사용하지 않는다. 정점 셰이더를 사용해 렌더링 할 때는,
각 스테이지의 텍스처 인덱스를 디폴트값으로 설정할 필요가 있다. 각 스테이지의 디폴트의 인덱스는, 스테이지 인덱스와 같다.
이 스테이트에는, 이 텍스처 스테이지에서 사용하는 각 정점에 대한 좌표 세트의 제로로부터 시작되는 인덱스를 설정한다.
또, 애플리케이션에서는, 설정하는 인덱스와의 논리화로서 몇개의 정수를 설정해, 텍스처 변환용의 입력 텍스처 좌표를 자동적으로
생성하도록(듯이) Microsoft® Direct3D® 에 요구할 수 있다. 모든 정수의 일람에 대해서는, 「D3DTSS_TCI 」를 참조할것.
제로에 해결되는 D3DTSS_TCI_PASSTHRU 를 제외해, 설정되는 인덱스와 이하의 플래그의 어느쪽이든을 사용하면 텍스처 랩핑 모드의 결정에
인덱스가 엄밀하게 사용된다. 이 플래그는 환경 맵핑을 실시하는 경우는 특히 유효하다.


D3DTSS_BUMPENVLSCALE
범프 맵 휘도(Luminance)에 사용하는 부동 소수점수(실수)의 스케일값. 디폴트값은 0.0 이다.

D3DTSS_BUMPENVLOFFSET
범프 맵 휘도(Luminance)에 사용하는 부동 소수점수(실수)의 오프셋(offset). 디폴트값은 0.0 이다.

D3DTSS_TEXTURETRANSFORMFLAGS
D3DTEXTURETRANSFORMFLAGS 열거형의 멤버. 이 텍스처 스테이지의 텍스처 좌표의 변환을 제어한다. 디폴트값은, D3DTTFF_DISABLE 이다.

D3DTSS_COLORARG0
3항연산 (적화와 선형 보간)의 3 번째의 색오퍼랜드의 설정. D3DTA 에 의해 식별된다. 이 설정은, D3DTEXOPCAPS_MULTIPLYADD 또는
D3DTEXOPCAPS_LERP 장치 능력이 존재하는 경우에 지원 된다. 디폴트의 인수는 D3DTA_CURRENT 이다. 읽고 쓰기용의 임시 레지스터의 색을
선택하려면 , D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는 경우에 지원 된다. 이 레지스터의
디폴트값은, (0.0, 0.0, 0.0, 0.0)이다.

D3DTSS_ALPHAARG0
3항연산 (적화와 선형 보간)의 알파 채널 실렉터 오퍼랜드의 설정. D3DTA 에 의해 식별된다. 이 설정은, D3DTEXOPCAPS_MULTIPLYADD 또는
D3DTEXOPCAPS_LERP 장치 능력이 존재하는 경우에 지원 된다. 디폴트의 인수는 D3DTA_CURRENT 이다. 읽고 쓰기용의 임시 레지스터의 색을
선택하려면 , D3DTA_TEMP 를 지정한다. D3DTA_TEMP 는, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는 경우에 지원 된다. 디폴트의
인수는, (0.0, 0.0, 0.0, 0.0)이다.

D3DTSS_RESULTARG
이 스테이지의 결과의 출력 레지스터를 선택하기 위한 설정. D3DTA 에 의해 식별된다. 이 값은, D3DTA_CURRENT (디폴트값) 또는 D3DTA_TEMP 로
설정할 수 있다. D3DTA_TEMP 는, 입력 인수로서 이후의 스테이지에 읽어들일 수가 있는 단일의 임시 레지스터이다. 포그(안개:fog)
블렌더 및 frame buffer에게 건네지는 최종적인 색은 D3DTA_CURRENT 로부터 얻어온다의 것으로, 마지막에 액티브한 텍스처 스테이지
스테이트는 현재에의 쓰기로 설정해야 한다. 이 설정은, D3DPMISCCAPS_TSSARGTEMP 장치 능력이 존재하는 경우에 지원 된다.

D3DTSS_CONSTANT
스테이지마다 정수 컬러. 장치가 스테이지마다 정수 컬러를 지원 할지 어떨지를 확인하려면 ,D3DPMISCCAPS 의 D3DPMISCCAPS_PERSTAGECONSTANT
정수를 조사한다. D3DTSS_CONSTANT 는 D3DTA_CONSTANT 로 사용한다. 「D3DTA 」를 참조할것.

D3DTSS_FORCE_DWORD
이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다

다음으로 알아볼것은 텍스처의 어드레싱모드입니다..
랍어드레싱 미라어드레싱 클램프어드레싱모드 경계색어드레싱모드가있습니다..

*랍어드레싱
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_WRAP);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_WRAP);

*미러어드레싱
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_MIRROR);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_MIRROR);

*클램프어드레싱
Device->SetSamplerState(0,D3DSAMP_ADDRESSU,D3DTADDRESS_CLAMP);
Device->SetSamplerState(0,D3DSAMP_ADDRESSV,D3DTADDRESS_CLAMP);

*경계색어드레싱
Device->SetSamplerState(0,D3DSAMP_BOARDERCOLOR,RGB(경계색));

지루하시죠?? 마지막으로 알아볼것은 선형텍스처의필터링입니다..

Device->SetSamplerState(0,D3DSAMP_MINFILTER,D3DTEXF_LINER);
Device->SetSamplerState(0,D3DSAMP_MAGFILTER,D3DTEXF_LINER);
Device->SetSamplerState(0,D3DSAMP_MIPFILTER,D3DTEXF_LINER);

3번째 인자의 설명은 아래와같습니다..

D3DTEXF_NONE
밉맵 처리를 무효로 한다. 래스터라이저는 대신에 확대 필터를 사용한다.

D3DTEXF_POINT
텍스처의 확대 필터 또는 축소 필터로서 사용되는 점필터링. 목적의 픽셀값에 가장 가까운 좌표를 가지는 텍셀을 사용한다.
밉맵 레벨간에 사용되는 텍스처 필터는, 최근점밉맵 필터이다. 래스터라이저는 가장 가까운 밉맵 텍스처의 텍셀로부터의 색을
사용한다.

D3DTEXF_LINEAR
텍스처의 확대 필터 또는 축소 필터로서 사용되는 바이리니아 보간 필터링. 목적의 픽셀을 둘러싸는 2 × 2 영역의 텍셀의 중량감
첨부 평균을 사용한다. 밉맵 레벨간에 사용되는 텍스처 필터는, 트라이 리니어 밉맵 보간이다. 래스터라이저는, 가장 가까운
밉맵 텍스처 2 점으로부터의 텍셀을 사용해, 픽셀색을 선형 보간 한다.

D3DTEXF_ANISOTROPIC
텍스처의 확대 필터 또는 축소 필터로서 사용되는 비등방성 텍스처 필터링. 텍스처 다각형과 스크린 평면간의 각도의 상위에
의해 일어나는 일그러짐을 보정한다.

D3DTEXF_PYRAMIDALQUAD
텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 텐트 필터.

D3DTEXF_GAUSSIANQUAD
텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 Gauss 필터.

D3DTEXF_FORCE_DWORD
이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다.

아.. 지루한텍스처부분이 끝났습니다.
뭐 아직 고급에도 안넘어갔습니다만.. 그건 차차다루기로 하구요..
일단은 여기까지..
한번 시험삼아서 위에있는 플래그들을 적용시켜보세요.. 의외로 멋진결과가 나오는것두 있습니다..



출처 : http://cafe.naver.com/gamelong.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=104

Posted by Junios

2009/02/25 17:58 2009/02/25 17:58
,
Response
No Trackback , No Comment
RSS :
http://junios.net/tc/rss/response/233


블로그 이미지

Junios World

- Junios

Archives

Authors

  1. Junios

Calendar

«   2010/09   »
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Site Stats

Total hits:
32815
Today:
25
Yesterday:
139