MoniWiki메모장_수업D3D
Login:
Password:
대문|찾기|바뀐글|목록|메모장|책갈피|연꽃|링크
Edit Diff Reload Search Print Info Mail Help RSS

@ 2004-05-24 @

  다이렉트 3D 수업내용 (이상문 샘 감사^^)

정리하면서 느낀점; 소프트웨어로 렌더링 파이프를 만들어 봐서 그런지
진짜 일주일(5일) 동안에 기본적이라고 하지만, 다이렉트X를 다 배운걸 보면 역시 기초가 중요해요!!
1 노티(1/5): 다이렉트 3D-20030901/ 기본창 띠우기/ 삼각형 그리기
2 노티(2/5): 다이렉트 3D-20030902/ 변환매트릭스/ (재질) 광원/ 버텍스, 인덱스 버퍼
3 노티(3/5): 다이렉트 3D-20030903/ Texture적용/ 알파브렌딩/ 필터링(자동밉맵생성)/ 와이어...
4 노티(4/5): 다이렉트 3D-20030904/ 멀티텍스쳐.../ 매트릭스 변환과 환경맵
5 노티(5/5): 다이렉트 3D-20030905/ 스텐실버퍼/ Data구성
{_r} 메모장으로 돌아가기

1 노티(1/5): 다이렉트 3D-20030901/ 기본창 띠우기/ 삼각형 그리기 #


0901-0.DirectX란
D3D는 구조체를 기본적으로 이용, 왼손 시계방향
setting...
D3D9.lib
D3D9dt.lib

#include <d3d9.h>

Direct3D 9.0
D3D extension 3DDEX
app Wizard에 등록
픽셀 등 각종 쉐이더지원
프로그램 가능한 쉐이더(쉐이딩 언어)

기본적으로 <선언> --> <렌더링>
<환경설정> --> <DATA 입력/ 처리>


0901-1.기본창 띠우기
1.윈도우를 만든다.
2.게임루프를 만든다.
3.DirectCreat9 함수를 이용, Com 객체를 가지고 온다.
4.3D->CreateDevice 를 이용, Com 객체에서 화면에 대한 인터페이스를 가지고 온다.

   <선언>
   LPDIRECT3D9             g_pD3D       = NULL; // Used to create the D3DDevice
   LPDIRECT3DDEVICE9       g_pd3dDevice = NULL; // Our rendering device

   g_pD3D = Direct3DCreate9( D3D_SDK_VERSION );
   g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                         D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                        &d3dpp, &g_pd3dDevice );
5.Device에서 Clear를 실행한다.

   <렌더링>
// Clear the backbuffer to a blue color
   g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );

     렌더링 scene

// Present the backbuffer contents to the display
   g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
6.프로그램 종료 전에 반드시 사용중인 자원 해제

   <삭제> Device를 메모리에서 삭제
    g_pd3dDevice->Release();
    g_pD3D->Release();

0901-2.삼각형 그리기
<선언>
// A structure for our custom vertex type
struct D3DLVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex
DWORD color; // The vertex color
};

// Our custom FVF, which describes our custom vertex structure
#define D3DFVF_D3DLVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

D3DLVERTEX vertices[] =
{
{ 150.0f, 50.0f, 0.5f, 1.0f, 0xffff0000, }, // x, y, z, rhw, color
{ 250.0f, 250.0f, 0.5f, 1.0f, 0xff00ff00, },
{ 50.0f, 250.0f, 0.5f, 1.0f, 0xff00ffff, },
};

<렌더링>
g_pd3dDevice->BeginScene();
{
g_pd3dDevice->SetFVF( D3DFVF_D3DLVERTEX );
g_pd3dDevice->DrawPrimitiveUP( D3DPT_TRIANGLELIST, 1, vertices, sizeof(D3DLVERTEX) );
}
g_pd3dDevice->EndScene();

2 노티(2/5): 다이렉트 3D-20030902/ 변환매트릭스/ (재질) 광원/ 버텍스, 인덱스 버퍼 #


0902-1.변환매트릭스 적용
Model --(WorldTM)--> World --(ViewTM)--> View --(ProjectTM)--> Viewport
화면에 렌더링을 하기 위해서는 파이프라인을 따라 각각의 단계 변환을 위한 매트릭스가 적용된다.
소프트웨어 3D에 비교해서 변환 매트릭스는 적지만, 그만큼 API에 더 의존적이다.
1) Device->SetTransform(D3DTS_WORLD, &mat);
2) Device->SetTransform(D3DTS_VIEW, &mat);
3) D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); 매트릭스값만 설정
Device->SetTransform(D3DTS_PROJECTION, &mat);
4) GetviewDevice->SetFVF( D3DFVF_D3DLVERTEX );
GetViewport(D3DVIEWPORT9 *pViewport ); 장치에 현재 설정되어 있는 뷰포트 파라미터를 얻어온다.
SetViewport( // );

-1.변환매트릭스 셋팅 ; 매트릭스를 적용하게 되면 주변값들이 0.0 - 1.0 사이의 값을 가지므로
정점의 좌표(모델의 크기)를 신경써야하며, 기준이 되는 크기를 설정하는 것이 좋다.

     #define D3DFVF_D3DLVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE); 
   //#define D3DFVF_D3DLVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE); - 화면에 바로 출력할 때 사용
     RHW 값이 있을 경우 변환이 끝난 것으로 취급하기 때문에, RHW값을 제거한다. --> 구조체 멤버도 변경

     D3DXMATRIXA16 matWorld;                        // world 좌표 변화 매트릭스
     D3DXMatrixRotationY( &matWorld, fAngle );         // 매트릭스 변환(회전, 이동)
     g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
// ----------> world 좌표로 전화
     D3DXVECTOR3 vEyePt( 0.0f, 3.0f,-5.0f );
     D3DXVECTOR3 vLookatPt( 0.0f, 0.0f, 0.0f );
     D3DXVECTOR3 vUpVec( 0.0f, 1.0f, 0.0f );
     D3DXMATRIXA16 matView; // view 좌표 변화 매트릭스
     D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec );
     g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
// ----------> view 좌표로 변화
     D3DXMATRIXA16 matProj; // 투영 좌표 변환 매트릭스
     D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
     g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
-2.컬링과 라이트의 초기 상태 ; 면이 뒤집어지거나 빛의 영향을 받지않는 모습을 확인하기 위한 설정
// Device state would normally be set here
g_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE ); // Culling 모드 끔
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); // Light 끔

-3.적용 ; 버퍼를 clear 시킨후에 적용
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Begin the scene
g_pd3dDevice->BeginScene();
// Setup the world, view, and projection matrices
SetupMatrices();
...
// End the scene
g_pd3dDevice->EndScene();

0902-2.재질; 재질이 없으면 광원효과가 나타나지 않는다.
void SetupMaterial()
{
D3DMATERIAL9 mtrl;
ZeroMemory( &mtrl, sizeof(D3DMATERIAL9) );
mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f;
mtrl.Diffuse.g = mtrl.Ambient.g = 0.0f;
mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f;
mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f;
g_pd3dDevice->SetMaterial( &mtrl );
}

0902-3.광원; 정확한 광원효과를 보기 위해서는 정점의 노말벡터값이 필수
void SetupLight()
{
D3DXVECTOR3 vecDir; // 광원의 type이 D3DLIGHT_DIRECTIONAL이므로 방향이 필요
D3DLIGHT9 light;
ZeroMemory( &light, sizeof(D3DLIGHT9) );
light.Type = D3DLIGHT_DIRECTIONAL; // D3DLIGHT_POINT = 1
light.Diffuse.r = 1.0f; // D3DLIGHT_SPOT = 2,
light.Diffuse.g = 1.0f; // D3DLIGHT_DIRECTIONAL = 3,
light.Diffuse.b = 1.0f;
vecDir = D3DXVECTOR3(cosf(timeGetTime()/350.0f),
1.0f,
sinf(timeGetTime()/350.0f) );
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
light.Range = 1000.0f;
g_pd3dDevice->SetLight( 0, &light );
g_pd3dDevice->LightEnable( 0, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );

// Finally, turn on some ambient light.
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, (DWORD)0x00202020 );
}

0902-3.zbuffer(깊이)/버텍스(정점) 버퍼
<선언>
-0.프레젠테이션 파라미터에서 깊이 버퍼에 대한 정보를 추가
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof(d3dpp) );
...
d3dpp.EnableAutoDepthStencil = true; // 깊이값과 스텐실 활성화
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;

-1.시스템 초기화부분에서 ,zbuffer 사용을 설정
// Turn on the zbuffer
g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );

D3DZB_FALSE - 깊이 버퍼를 사용 불능으로 한다.
D3DZB_TRUE - z 버퍼를 사용 가능하게 한다.( 비디오 메모리 부분을 사용)
D3DZB_USEW - w 버퍼를 사용 가능하게 한다.
D3DZB_FORCE_DWORD - 이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다.

-2.버텍스(정점)버퍼; 시스템 메모리에 들어가지만 비디오메모리에 위치
D3D는 장비체크가 기본적으로 지원하며, 버퍼를 이용하고자 할 경우 시스템 지원여부를 체크해야한다.!

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold vertices
g_pd3dDevice->CreateVertexBuffer(
4*sizeof(CUSTOMVERTEX), 총크기 = 갯수 * 크기
0, 시작
D3DFVF_CUSTOMVERTEX, 포맷
D3DPOOL_DEFAULT, 풀설정
&g_pVB, 구조체 포인터
NULL );
  • D3DPOOL 열거형; 리소스의 버퍼를 보관 유지하는 메모리 클래스를 정의한다.
    D3DPOOL_DEFAULT - 보통, 로컬 비디오 메모리와 AGP (Accelerated Graphics Port)
    메모리의 양쪽 모두를 포함한, 비디오 메모리이다
    D3DPOOL_MANAGED - 필요에 따라서, 장치로부터 액세스 할 수 있는 메모리에 자동적으로 복사 된다.
    관리되는 리소스는, 시스템 메모리에 백업 되므로, 장치가 손실했을 때에 생성 다시 할 필요가 없다
    D3DPOOL_SYSTEMMEM - 보통, 3D 장치에 의해 액세스 할 수 없는 메모리.
    시스템 RAM 를 사용하지만, 페이징 가능한 RAM 가 줄어들 것은 없다.
    이러한 리소스는, 장치가 손실해도 생성 다시 할 필요가 없다.
    (시스템이 지원하는 장비인지 체크해야 한다.)

  •    -.정점 정보  
         vertices[0].position = D3DXVECTOR3(-1.0f,-1.0f, 0.0f);
         vertices[0].normal   = D3DXVECTOR3( -1.0f, 0.0f, 0.0f);
         vertices[0].color = 0xffff0000;
         vertices[1].position = D3DXVECTOR3( 1.0f, -1.0f, 0.0f);
         vertices[1].normal   = D3DXVECTOR3( -1.0f, 0.0f, 0.0f);
         vertices[1].color = 0xff0000ff;
         vertices[2].position = D3DXVECTOR3( 0.0f, 1.0f, 0.0f);
         vertices[2].normal   = D3DXVECTOR3( -1.0f, 0.0f, 0.0f);
         vertices[2].color = 0xffffffff;
    
         CUSTOMVERTEX* pVertices;
         g_pVB->Lock( 0, 0, (void**)&pVertices, 0 );
             DAta rkqt
             memcpy( pVertices, vertices, sizeof(vertices) ); 정점의 정보를 버텍스 정보에 카피
         g_pVB->Unlock();
    
    <렌더링>
    g_pd3dDevice->BeginScene(); // 렌더링 버텍스 버퍼를 이용한 것으로 변경
    // Render the vertex buffer contents
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
    g_pd3dDevice->EndScene();

    0902-4.인덱스 버퍼
    정점은 버텍스 버퍼에 저장해 두고, 렌더링 할 때는 인덱스 참조하는 방식으로
    정점순서를 저장하기 위한 배열(인덱스) 필요

    <선언>
    LPDIRECT3DINDEXBUFFER9 g_pIndex = NULL; // Our interface for manipulating index buffers
    ...
    WORD ver_index[] ={ 0, 1, 2};
    -1.인덱스 버퍼 생성
    g_pd3dDevice->CreateIndexBuffer( sizeof(ver_index), - 인덱스 총크기 = 갯수(1) * 크기
    0, D3DFMT_INDEX16,
    D3DPOOL_DEFAULT, &g_pIndex, NULL );
    -2.인덱스 버퍼에 정보 셋팅
    <!> g_pd3dDevice->SetIndices(g_pIndex); - 인덱스버퍼 셋팅

    void * indices;
    g_pIndex->Lock(0,0, (void**)&indices,0);
    memcpy( indices, ver_index, sizeof(ver_index) );
    g_pIndex->Unlock();

    <렌더링>
    g_pd3dDevice->BeginScene(); // 렌더링을 할 때, 인덱스 버퍼를 이용한 것으로 변경
    g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
    // Render the index buffer contents
    g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);
    //g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); - 버텍스 버퍼 이용

    -. 정점 배열을 참고하는 인덱스의 순서에 따라, 지정된 지오메트리 기본도형을 렌더링 한다.
  • HRESULT DrawIndexedPrimitive(
    D3DPRIMITIVETYPE Type,
    INT BaseVertexIndex,
    UINT MinIndex,
    UINT NumVertices, - 정점의 총갯수
    UINT StartIndex,
    UINT PrimitiveCount ); - 읽어올 인덱스 갯수
    인덱스가 3점을 참고하는 일반적인 경우에는 Tyte을 D3DPT_TRIANGLELIST로 지정.

    ※ 참고 - 여러개의 버텍스버퍼와 인덱스 버퍼가 있을 때,
    원하는 버퍼를 선택한 후에 Draw한다
    Device->SetStreamSource( 0, g_pVB_Obj01, 0, sizeof(CUSTOMVERTEX) );
    Device->SetIndices(g_pIndex_Obj01);
    Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);

  • 3 노티(3/5): 다이렉트 3D-20030903/ Texture적용/ 알파브렌딩/ 필터링(자동밉맵생성)/ 와이어... #


    0903-1.Texture적용
    <선언>
    -1. D3DFVF ; FVF 정수에 텍스처 관련의 플래그 추가

    FVF 정수 ; 유연한 정점 포맷 (FVF)은, 단일의 데이터 스트림에 인터리브 되어 저장 되고 있는
    정점의 내용을 기술하기 위해서 사용된다. FVF 코드는, 보통, 고정 기능의 정점 처리에 의해
    처리되는 데이터를 지정하기 위해서 사용된다.

    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DFVF_TEX1 )
    LPDIRECT3DTEXTURE9 g_pTexture1 = NULL; // Our texture
    LPDIRECT3DTEXTURE9 g_pTexture2 = NULL;

    -2.생성
    D3DXCreateTextureFromFile( g_pd3dDevice, "..\\banana.bmp", &g_pTexture1 );

    -3.닫기 전에 삭제
    g_pTexture1->Release();

    <렌더링>
    g_pd3dDevice->SetTexture( 0, g_pTexture1 );
    오브젝트 1. ; 오브젝트1에 g_pTexture1 적용

    0903-2.Texture Addressing ; 맵을 붙치는 방식에 대한 설정
            -. 렌더링 전체에 영향을 미치기 때문에 디바이스에서 정의.
    <설정>
    HRESULT SetTextureStageState(
    DWORD Stage,
    D3DTEXTURESTAGESTATETYPE Type,
    DWORD Value
    );
  • Stage
    in 스테이트값을 설정하는 텍스처의 스테이지 식별자. 스테이지 식별자는 0 으로부터 시작된다.
    장치는 최대 8 세트까지 텍스처를 가질 수가 있으므로,Stage 로 지정할 수 있는 최대치는 7 이다.
  • D3DSAMPLERSTATETYPE 열거형
    D3DSAMP_ADDRESSU = 1, u 좌표로 사용하는 텍스처어드레싱모드. 디폴트는 D3DTADDRESS_WRAP
    D3DSAMP_ADDRESSV = 2, v 좌표로 사용하는 텍스처어드레싱모드. 디폴트는 D3DTADDRESS_WRAP
    ...
  • D3DTEXTUREADDRESS 열거형 - 지원되는 텍스처 어드레싱모드를 기술하는 정수를 정의
    typedef enum _D3DTEXTUREADDRESS {
    D3DTADDRESS_WRAP = 1,
    D3DTADDRESS_MIRROR = 2,
    D3DTADDRESS_CLAMP = 3,
    D3DTADDRESS_BORDER = 4,
    D3DTADDRESS_MIRRORONCE = 5,
    D3DTADDRESS_FORCE_DWORD = 0x7fffffff
    } D3DTEXTUREADDRESS;
    <적용예>
    Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR );
    Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );

  • 0903-3.알파브렌딩
    ◎ Z-buffer가 먹지 않기 때문에 원하는 결과가 나오도록 적용 순서에 조심해야 하며,
    부하가 많이 걸리기 때문에 적용할 오브젝트 앞에서 켜주고 껴준다.
    <설정>
    Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
  • D3DSAMPLERSTATETYPE 열거형
    D3DRS_SRCBLEND = 19, D3DBLEND 열거형의 멤버중 하나이다. 디폴트값은 D3DBLEND_ONE
    D3DRS_DESTBLEND = 20, D3DBLEND 열거형의 멤버중 하나이다. 디폴트값은 D3DBLEND_ZERO
    D3DRS_ALPHABLENDENABLE = 27, 알파 블렌드에 의한 투명화(TRUE를 설정), 디폴트값은 FALSE
    알파 혼합의 타입은, D3DRS_SRCBLEND 와 D3DRS_DESTBLEND 의 렌더링 스테이트에 의해 정해진다.
    ...
  • D3DBLEND 열거형 - 지원 되고 있는혼합 모드를 정의
    typedef enum _D3DBLEND {
    D3DBLEND_ZERO = 1, - 혼합 계수는, (0, 0, 0, 0)
    D3DBLEND_ONE = 2, - 혼합 계수는, (1, 1, 1, 1)
    D3DBLEND_SRCCOLOR = 3, - 혼합 계수는, (Rs, Gs, Bs, As)
    D3DBLEND_INVSRCCOLOR = 4, - 혼합 계수는, (1 - Rs, 1 - Gs, 1 - Bs, 1 - As)
    ...
    } D3DBLEND
    <적용예>
    Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); 알파브랜딩

  • 0903-4.필터링; 근접점, 선형, 이방성(높이와 넓이의 비를 고려), 밉맵 등을 이용
    <설정>
    Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
  • D3DSAMPLERSTATETYPE 열거형
    D3DSAMP_MAGFILTER = 5, D3DTEXTUREFILTERTYPE 형의 확대 필터. 디폴트값은 D3DTEXF_POINT
    D3DSAMP_MINFILTER = 6, D3DTEXTUREFILTERTYPE 형의 축소 필터. 디폴트값은 D3DTEXF_POINT
    D3DSAMP_MIPFILTER = 7, 축소시에 사용하는 밉맵 필터. 디폴트값은 D3DTEXF_NONE
    ...
  • D3DTEXTUREFILTERTYPE 열거형
    typedef enum _D3DTEXTUREFILTERTYPE {
    D3DTEXF_NONE = 0, - 밉맵 처리를 무효로 한다. 래스터라이저는 대신에 확대 필터를 사용
    D3DTEXF_POINT = 1, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 점필터링.
    목적의 픽셀값에 가장 가까운 좌표를 가지는 텍셀을 사용한다. 밉맵 레벨간에 사용되는 텍스처 필터는,
    최근점밉맵 필터이다. 래스터라이저는 가장 가까운 밉맵 텍스처의 텍셀로부터의 색을 사용한다
    D3DTEXF_LINEAR = 2, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 바이리니아 보간 필터링.
    목적의 픽셀을 둘러싸는 2 × 2 영역의 텍셀의 중량감 첨부 평균을 사용한다. 밉맵 레벨간에 사용되는
    텍스처 필터는, 트라이 리니어 밉맵 보간이다. 래스터라이저는, 가장 가까운 밉맵 텍스처 2 점으로부터의
    텍셀을 사용해, 픽셀색을 선형 보간 한다. (게임에서 기본적으로 사용)
    D3DTEXF_ANISOTROPIC = 3, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 비등방성 텍스처 필터링.
    텍스처 다각형과 스크린 평면간의 각도의 상위에 의해 일어나는 일그러짐을 보정한다.
    D3DTEXF_PYRAMIDALQUAD = 6, - 텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 텐트 필터
    D3DTEXF_GAUSSIANQUAD = 7, - 텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 Gauss 필터.
    D3DTEXF_FORCE_DWORD = 0x7fffffff
    이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다.
    } D3DTEXTUREFILTERTYPE;

    -1.자동밉맵생성
  • HRESULT CreateTexture( UINT Width, - in 최상정도의 텍스처의 폭 (픽셀 단위).
    UINT Height, - in 최상정도의 텍스처의 높이 (픽셀 단위)
    UINT Levels, - in 텍스처에 있는 레벨의 수. 0 을 지정 하면, 밉맵화 텍스처를
    지원하는 하드웨어에 대해, 1 × 1 픽셀까지의 모든 텍스처 서브 레벨을 생성한다.
    DWORD Usage,
    D3DFORMAT Format, - in D3DFORMAT 열거형의 멤버. 텍스처의 전레벨의 포맷을 기술
    D3DPOOL Pool, - D3DPOOL_MANAGED; S/W로 사용할 건지, H/W로 사용할 건지 자동 설정으로
    관리되는 리소스는, 시스템 메모리에 백업 되므로, 장치가 손실했을 때에 생성 다시 할 필요가 없다
    IDirect3DTexture9** ppTexture,
    - [out, retval] 생성 된 텍스처 소스를 나타내는 IDirect3DTexture9 인터페이스의 포인터
    HANDLE* pHandle ); -in 예약이 끝난 상태. 이 파라미터는 NULL 로 설정
  • D3DFORMAT 열거형 중 부호 없음 포맷 - 픽셀 셰이더에 대한 텍스처 주소 명령의 작동코드를 참조한다.
    D3DFMT_R8G8B8 / 값20/ 24 비트의 RGB 픽셀 포맷으로, 채널 근처 8 비트를 사용
    D3DFMT_A8R8G8B8 / 값21/ 32 비트의 알파 첨부 ARGB 픽셀 포맷으로, 채널 근처 8 비트를 사용
    D3DFMT_R5G6B5 / 값23/ 16 비트의 RGB 픽셀 포맷으로, 빨강 5 비트, 초록 6 비트, 파랑 5 비트를 사용
    ...
    <적용예>
    Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
    Device->CreateTexture(256, 256, 5, 0, D3DFMT_R8G8B8, D3DPOOL_MANAGED, &g_pTexture1, NULL);

  • 0903-5.와이어프레임렌더링
    <설정>
    Device->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME);
  • D3DFILLMODE 열거형 - 전부 칠해 모드를 기술하는 정수를 정의한다.
    typedef enum _D3DFILLMODE {
    D3DFILL_POINT = 1, - 점을 전부 칠한다.
    D3DFILL_WIREFRAME = 2, - 와이어 프레임을 전부 칠한다.
    D3DFILL_SOLID = 3, - 면을 전부 칠한다.
    D3DFILL_FORCE_DWORD = 0x7fffffff
    } D3DFILLMODE;
  • 4 노티(4/5): 다이렉트 3D-20030904/ 멀티텍스쳐.../ 매트릭스 변환과 환경맵 #


    0904-1.멀티텍스쳐
    <설정> 적용하는 위치는 texture를 불러온 다음에서 위치하며,
    원하는 오브젝트의 texture를 뿌리기 전에 위치한다.
    0.HRESULT SetTexture( DWORD Stage, - in 텍스처를 설정하는 스테이지 식별자
    IDirect3DBaseTexture9 *pTexture ); - in IDirect3DBaseTexture9 인터페이스의 텍스쳐 포인터

    0.HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );
    - 현재 할당할 수 있는 텍스처에 스테이트값을 설정

  • 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,
    ...
    D3DTA (텍스처 인수 정수) - 장치에 대응하는 각각의 텍스처 스테이지는 2 개의 텍스처 인수를
    가지며 이러한 인수는 텍스처의 색과 알파 채널에 영향을 준다.
    D3DTA_CURRENT - 텍스처 인수는 전의 혼합 스테이지의 결과이다.
    최초의 텍스처 스테이지 (스테이지 0)에서는, 이 인수는 D3DTA_DIFFUSE 와 같다.
    D3DTA_DIFFUSE - gouraud shading 처리중에 정점의 성분으로부터 보간 해 얻을 수
    있던 디퓨즈색
    D3DTA_TEXTURE - 텍스처 스테이지의 텍스처 컬러이다. 허가는 읽기 전용이다.
    D3DTA_SPECULAR - gouraud shading 처리중에 정점의 성분으로부터 보간 된 스펙큐러색이다.

  • D3DTEXTUREOP 열거형 - 스테이지마다 텍스처 혼합 처리를 정의
    typedef enum _D3DTEXTUREOP {
    D3DTOP_DISABLE = 1,
    D3DTOP_SELECTARG1 = 2, - 스테이지의 최초의 색, 또는 알파 인수를 변경하지 않고 출력으로서 사용
    D3DTOP_SELECTARG2 = 3, - 스테이지의 2번째 색, 또는 알파 인수를 변경하지 않고 출력으로서 사용
    D3DTOP_MODULATE = 4, - 인수의 성분을 곱셈한다.
    D3DTOP_MODULATE2X = 5,
    D3DTOP_MODULATE4X = 6,
    D3DTOP_ADD = 7, - 인수의 성분을 덧셈 한다.
    D3DTOP_ADDSIGNED = 8,
    D3DTOP_ADDSIGNED2X = 9,
    D3DTOP_SUBTRACT = 10,
    D3DTOP_ADDSMOOTH = 11,
    ...
    } D3DTEXTUREOP;

  •    <적용>
          Device->SetRenderState( D3DRS_COLORVERTEX, false );
          Device->SetTexture(0, g_pTexture1);
          Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
          Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
          Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    	
          Device->SetTexture(1, g_pTexture3);
          Device->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
          Device->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
          Device->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);
          Device->SetTextureStageState(1, D3DTSS_COLOROP,   D3DTOP_MODULATE);
    
       참고 -  렌더링시, vertex의 색상영향을 받지 않을려면 false로 셋팅한다.
          (주의, false로 설정시 다른 옵션에도 영향을 미친다.)  
          Device->SetRenderState( D3DRS_COLORVERTEX, TRUE );
    

    0904-2.라이트맵; 기본적으로 멀티텍스쳐를 응용(글로우로 활용)멀티텍스쳐
    Device->SetTextureStageState(1, D3DTSS_COLOROP, MODULATE2X); - ( A*B ) <<1 (밝아짐)
    Device->SetTextureStageState(1, D3DTSS_COLOROP, MODULATE4X); - ( A*B ) <<2 (더욱 밝아짐)

    0904-3.정점의 색과의 혼합
    Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
    Device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); - 스테이지2에 정점색을 이용
    Device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTEXTUREOP 열거형);

    0904-4.디테일맵; 벽이나 바닥에 가깝게 접근했을 때, 보다 선명하게 렌더링
    D3DTEXTUREOP 열거형을 D3DTOP_ADDSIGNED를 사용 ( (A+B)-0.5 )
    D3DTOP_ADDSIGNED2X ( (A+B)-0.5 ) << 1

    0904-5.알파연산; 투명도에만 영향을 미친다. 흑백이 명확할수록 선명하게 빠짐
    <설정>
    // Alphablendging 활성화가 필요
    pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
    pd3dDevice->SetRenderState( D3DRS_SRCBLEND , D3DBLEND_ONE ) ;
    pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_SRCALPHA );

    0904-6.매트릭스 변환과 환경맵
    <설정>
    0.HRESULT SetTransform( D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix );
    - 단일 장치의 변환 관련 스테이트를 설정
  • D3DTRANSFORMSTATETYPE 열거형 - 변환 스테이트의 값을 기술하는 정수를 정의
    D3DTS_VIEW = 2, - 뷰 변환 행렬로서 설정되는 변환 행렬을 식별, 디폴트값은 NULL(단위행렬)
    D3DTS_PROJECTION = 3, - 투영 변환 행렬로서 설정되는 변환 행렬을 식별, 디폴트값은 NULL(단위행렬)
    D3DTS_TEXTURE0 = 16, - 지정된 텍스처 스테이지로 설정되는 변환 행렬을 식별
    D3DTS_TEXTURE1 = 17, - 지정된 텍스처 스테이지로 설정되는 변환 행렬을 식별
    ...

    0.HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );
  • D3DTEXTURETRANSFORMFLAGS 열거형의 멤버.
    D3DTSS_TEXTURETRANSFORMFLAGS = 24,
    이 텍스처 스테이지의 텍스처 좌표의 변환을 제어한다. 디폴트값은, D3DTTFF_DISABLE

  • D3DTEXTURETRANSFORMFLAGS 열거형 - 텍스처 스테이지 스테이트의 값을 정의
    typedef enum _D3DTEXTURETRANSFORMFLAGS {
    D3DTTFF_DISABLE = 0, - 텍스처 좌표는 래스터라이저에 직접 건네받는다.
    D3DTTFF_COUNT1 = 1, - 래스터라이저는, 1D 의 텍스처 좌표를 상정한다.
    D3DTTFF_COUNT2 = 2, - 2D 의 텍스처 좌표를 상정한다.
    D3DTTFF_COUNT3 = 3, - 3D 의 텍스처 좌표를 상정한다.
    D3DTTFF_COUNT4 = 4, - 4D 의 텍스처 좌표를 상정한다.
    D3DTTFF_PROJECTED = 256, - 텍스처 좌표는, 래스터라이저에게 건네지기 전에 마지막 요소로 모두 분할
    예를 들어, 이 플래그가 D3DTTFF_COUNT3 와 함께 지정되고 있는 경우,
    1번째 및 2번째의 텍스처 좌표는, 래스터라이저에게 건네지기 전에, 3번째의 좌표로 분할된다.
    D3DTTFF_FORCE_DWORD = 0x7fffffff - 이 열거형을 강제적으로 32 비트 사이즈에 컴파일
    } D3DTEXTURETRANSFORMFLAGS;

    0.D3DTEXTURESTAGESTATETYPE 열거형
    D3DTSS_TEXCOORDINDEX = 11, - 이 텍스처 스테이지에서 사용하기 위해 설정된 텍스처 좌표의 인덱스.
    정점 1 개에 대해서 최대 8 세트까지의 텍스처 좌표를 설정할 수 있다.
    정점이, 지정된 인덱스의 텍스처 좌표 세트를 포함하지 않은 경우는, u 및 v 좌표 디폴트(0,0)

    0.D3DTSS_TCI - 드라이버 텍스처 좌표의 능력 플래그(텍스처 변환용의 입력 텍스처 좌표를 자동적으로 생성)
    #define/ 값 / 설명
    D3DTSS_TCI_PASSTHRU / 0x00000000L / 정점 포맷내의 지정된 텍스처 좌표를 사용, 값은 제로
    D3DTSS_TCI_CAMERASPACENORMAL / 0x00010000L / 스테이지의 텍스처 변환에 대한
    입력 텍스처 좌표로서 카메라 공간에 변환 된 정점 법선을 사용
    D3DTSS_TCI_CAMERASPACEPOSITION / 0x00020000L / 카메라 공간에 변환 된 정점 위치를 사용
    D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR/ 0x00030000L /
    카메라 공간에 변환 된 반사 벡터를 사용하며,
    반사 벡터는, 입력 정점 위치 좌표와 법선 벡터로부터 계산된다.
    D3DTSS_TCI_SPHEREMAP / 0x00040000L / 지정된 텍스처 좌표를 구면의 맵핑에 사용한다.

  •    <적용>
       -1.맵좌표 변환
          D3DXMATRIXA16 mat;          - 매트릭스 선언
          D3DXMatrixIdentity( &mat);  - 초기화(구조체의 멤버를 직접 셋팅할 수 있다.)
          D3DXMatrixRotationY( &mat, 5.0f);  - 변환(SRT); 각각의 변환 적용후 매트릭스를 곱해준다.
          Device->SetTransform( D3DTS_TEXTURE0, &mat);  - 행렬을 D3DTS_TEXTURE0에 적용
          Device->SetTextureStageState( 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 );  
                - D3DTS_TEXTURE0로 부터 변환된 uv 값을 가지고 온다
       -2.환경맵생성
          Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);  
    

    5 노티(5/5): 다이렉트 3D-20030905/ 스텐실버퍼/ Data구성 #


    0905-1.스탠실버퍼; 필요영역에만 렌더링 지정(클리핑)
    • D3DPRESENT_PARAMETERS d3dpp;
      d3dpp.EnableAutoDepthStencil = true; // 깊이값과 스텐실 활성화
      d3dpp.AutoDepthStencilFormat = D3DFMT_D24S8; // 깊이 24, 스탠실 8bit 사용
      ...

    0905-2.Data구성
    -1.모든 Data는 로딩시 초기화 되며,
    Data를 바탕으로 구성된 Index와 flag에 의해 조작된다.
    ==> 결과적으로 모든 결과는 Index의 조합의 산물(자료 이용의 효율성 높임)
    -2.캐릭터
    메쉬멤버(초기Data를 매쉬로 재구성)
    -.Vertex List ; 정점의 구성 -> 구조체 형식으로 좌표와 노말, 컬러등 정점만의 요소로 구성
    -.Index List
    -.VerNum
    -.IndexNum
    -.메쉬이름
    -.메쉬ID
    애니메이션멤버
    Texture
    Material
    행동정보(위치, 인공지능 패턴)
    각종flag
    ...
    -3.Vertex List 등을 포인터로 받을 경우는 동적할당이 필요

    {_r} 메모장으로 돌아가기

    March, 2025
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031 

    차가운 차와 차가운 밥은 참을 수 있지만 차가운 이야기는 견디지 못한다(중국속담)

    책갈피_Pipeline
    WikiWikiWeb
    신용_산업기상도
    HGL_11Hardware
    last modified 2004-06-16 16:47:26
    고치기|찾기|쪽 지우기|비슷한 쪽 Valid XHTML 1.0! Valid CSS! powerd by MoniWiki
    0.2696 sec