@ 2004-05-24 @
정리하면서 느낀점; 소프트웨어로 렌더링 파이프를 만들어 봐서 그런지
진짜 일주일(5일) 동안에 기본적이라고 하지만, 다이렉트X를 다 배운걸 보면 역시 기초가 중요해요!! 1 노티(1/5): 다이렉트 3D-20030901/ 기본창 띠우기/ 삼각형 그리기 #0901-0.DirectX란 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
// Our custom FVF, which describes our custom vertex structure{
FLOAT x, y, z, rhw; // The transformed position for the vertex
};DWORD color; // The vertex color
#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);
-1.변환매트릭스 셋팅 ; 매트릭스를 적용하게 되면 주변값들이 0.0 - 1.0 사이의 값을 가지므로 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 );
정점의 좌표(모델의 크기)를 신경써야하며, 기준이 되는 크기를 설정하는 것이 좋다.
#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 모드 끔
-3.적용 ; 버퍼를 clear 시킨후에 적용g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, FALSE ); // Light 끔
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
// Begin the scene// 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이므로 방향이 필요
// Finally, turn on some ambient light.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,
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );sinf(timeGetTime()/350.0f) ); light.Range = 1000.0f; g_pd3dDevice->SetLight( 0, &light ); g_pd3dDevice->LightEnable( 0, TRUE ); g_pd3dDevice->SetRenderState( D3DRS_LIGHTING, TRUE );
g_pd3dDevice->SetRenderState( D3DRS_AMBIENT, (DWORD)0x00202020 );
}0902-3.zbuffer(깊이)/버텍스(정점) 버퍼
<선언>
-0.프레젠테이션 파라미터에서 깊이 버퍼에 대한 정보를 추가
D3DPRESENT_PARAMETERS d3dpp;
-1.시스템 초기화부분에서 ,zbuffer 사용을 설정ZeroMemory( &d3dpp, sizeof(d3dpp) );
...
d3dpp.EnableAutoDepthStencil = true; // 깊이값과 스텐실 활성화d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
// Turn on the zbuffer
-2.버텍스(정점)버퍼; 시스템 메모리에 들어가지만 비디오메모리에 위치 g_pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
D3DZB_FALSE - 깊이 버퍼를 사용 불능으로 한다.
D3DZB_TRUE - z 버퍼를 사용 가능하게 한다.( 비디오 메모리 부분을 사용) D3DZB_USEW - w 버퍼를 사용 가능하게 한다. D3DZB_FORCE_DWORD - 이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다.
D3D는 장비체크가 기본적으로 지원하며, 버퍼를 이용하고자 할 경우 시스템 지원여부를 체크해야한다.!
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; // Buffer to hold vertices g_pd3dDevice->CreateVertexBuffer(
4*sizeof(CUSTOMVERTEX), 총크기 = 갯수 * 크기
0, 시작 D3DFVF_CUSTOMVERTEX, 포맷 D3DPOOL_DEFAULT, 풀설정 &g_pVB, 구조체 포인터 NULL );
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->EndScene(); 0902-4.인덱스 버퍼
정점은 버텍스 버퍼에 저장해 두고, 렌더링 할 때는 인덱스 참조하는 방식으로
정점순서를 저장하기 위한 배열(인덱스) 필요 <선언>
LPDIRECT3DINDEXBUFFER9 g_pIndex = NULL; // Our interface for manipulating index buffers
-1.인덱스 버퍼 생성
...
WORD ver_index[] ={ 0, 1, 2};
g_pd3dDevice->CreateIndexBuffer( sizeof(ver_index), - 인덱스 총크기 = 갯수(1) * 크기
-2.인덱스 버퍼에 정보 셋팅![]()
void * indices;
g_pIndex->Lock(0,0, (void**)&indices,0);
memcpy( indices, ver_index, sizeof(ver_index) );
g_pIndex->Unlock();
g_pd3dDevice->BeginScene(); // 렌더링을 할 때, 인덱스 버퍼를 이용한 것으로 변경
// Render the index buffer contentsg_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) ); g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
g_pd3dDevice->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,0,0,3,0,1);
//g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 ); - 버텍스 버퍼 이용-. 정점 배열을 참고하는 인덱스의 순서에 따라, 지정된 지오메트리 기본도형을 렌더링 한다.
D3DPRIMITIVETYPE Type,
인덱스가 3점을 참고하는 일반적인 경우에는 Tyte을 D3DPT_TRIANGLELIST로 지정.INT BaseVertexIndex, UINT MinIndex, UINT NumVertices, - 정점의 총갯수 UINT StartIndex, UINT PrimitiveCount ); - 읽어올 인덱스 갯수 ※ 참고 - 여러개의 버텍스버퍼와 인덱스 버퍼가 있을 때, 3 노티(3/5): 다이렉트 3D-20030903/ Texture적용/ 알파브렌딩/ 필터링(자동밉맵생성)/ 와이어... #0903-1.Texture적용
<선언>
-1. D3DFVF ; FVF 정수에 텍스처 관련의 플래그 추가
FVF 정수 ; 유연한 정점 포맷 (FVF)은, 단일의 데이터 스트림에 인터리브 되어 저장 되고 있는
-2.생성
정점의 내용을 기술하기 위해서 사용된다. FVF 코드는, 보통, 고정 기능의 정점 처리에 의해
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_DIFFUSE|D3DFVF_TEX1 )처리되는 데이터를 지정하기 위해서 사용된다. LPDIRECT3DTEXTURE9 g_pTexture1 = NULL; // Our texture LPDIRECT3DTEXTURE9 g_pTexture2 = NULL; -3.닫기 전에 삭제
g_pTexture1->Release();
<렌더링>0903-2.Texture Addressing ; 맵을 붙치는 방식에 대한 설정 -. 렌더링 전체에 영향을 미치기 때문에 디바이스에서 정의.
<설정>
in 스테이트값을 설정하는 텍스처의 스테이지 식별자. 스테이지 식별자는 0 으로부터 시작된다.
장치는 최대 8 세트까지 텍스처를 가질 수가 있으므로,Stage 로 지정할 수 있는 최대치는 7 이다.
D3DSAMP_ADDRESSU = 1, u 좌표로 사용하는 텍스처어드레싱모드. 디폴트는 D3DTADDRESS_WRAP
D3DSAMP_ADDRESSV = 2, v 좌표로 사용하는 텍스처어드레싱모드. 디폴트는 D3DTADDRESS_WRAP ...
typedef enum _D3DTEXTUREADDRESS {
<적용예>
D3DTADDRESS_WRAP = 1,
} D3DTEXTUREADDRESS;D3DTADDRESS_MIRROR = 2, D3DTADDRESS_CLAMP = 3, D3DTADDRESS_BORDER = 4, D3DTADDRESS_MIRRORONCE = 5, D3DTADDRESS_FORCE_DWORD = 0x7fffffff Device->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_MIRROR ); Device->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP ); 0903-3.알파브렌딩
◎ Z-buffer가 먹지 않기 때문에 원하는 결과가 나오도록 적용 순서에 조심해야 하며,
부하가 많이 걸리기 때문에 적용할 오브젝트 앞에서 켜주고 껴준다.
<설정>Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true );
typedef enum _D3DBLEND {
<적용예>
D3DBLEND_ZERO = 1, - 혼합 계수는, (0, 0, 0, 0)
} D3DBLENDD3DBLEND_ONE = 2, - 혼합 계수는, (1, 1, 1, 1) D3DBLEND_SRCCOLOR = 3, - 혼합 계수는, (Rs, Gs, Bs, As) D3DBLEND_INVSRCCOLOR = 4, - 혼합 계수는, (1 - Rs, 1 - Gs, 1 - Bs, 1 - As) ...
Device->SetRenderState( D3DRS_ALPHABLENDENABLE, true ); 알파브랜딩
0903-4.필터링; 근접점, 선형, 이방성(높이와 넓이의 비를 고려), 밉맵 등을 이용
<설정>
Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT );
typedef enum _D3DTEXTUREFILTERTYPE {
} D3DTEXTUREFILTERTYPE;
D3DTEXF_NONE = 0, - 밉맵 처리를 무효로 한다. 래스터라이저는 대신에 확대 필터를 사용
D3DTEXF_POINT = 1, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 점필터링.
목적의 픽셀값에 가장 가까운 좌표를 가지는 텍셀을 사용한다. 밉맵 레벨간에 사용되는 텍스처 필터는,
D3DTEXF_LINEAR = 2, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 바이리니아 보간 필터링. 최근점밉맵 필터이다. 래스터라이저는 가장 가까운 밉맵 텍스처의 텍셀로부터의 색을 사용한다
목적의 픽셀을 둘러싸는 2 × 2 영역의 텍셀의 중량감 첨부 평균을 사용한다. 밉맵 레벨간에 사용되는
D3DTEXF_ANISOTROPIC = 3, - 텍스처의 확대 필터 또는 축소 필터로서 사용되는 비등방성 텍스처 필터링. 텍스처 필터는, 트라이 리니어 밉맵 보간이다. 래스터라이저는, 가장 가까운 밉맵 텍스처 2 점으로부터의 텍셀을 사용해, 픽셀색을 선형 보간 한다. (게임에서 기본적으로 사용)
텍스처 다각형과 스크린 평면간의 각도의 상위에 의해 일어나는 일그러짐을 보정한다.
D3DTEXF_PYRAMIDALQUAD = 6, - 텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 텐트 필터D3DTEXF_GAUSSIANQUAD = 7, - 텍스처의 확대 필터 또는 축소 필터로서 사용하는 4 샘플의 Gauss 필터. D3DTEXF_FORCE_DWORD = 0x7fffffff
이 열거형을 강제적으로 32 비트 사이즈에 컴파일 한다. 이 값은 사용되지 않았다.
-1.자동밉맵생성
UINT Height, - in 최상정도의 텍스처의 높이 (픽셀 단위)
관리되는 리소스는, 시스템 메모리에 백업 되므로, 장치가 손실했을 때에 생성 다시 할 필요가 없다UINT Levels, - in 텍스처에 있는 레벨의 수. 0 을 지정 하면, 밉맵화 텍스처를
지원하는 하드웨어에 대해, 1 × 1 픽셀까지의 모든 텍스처 서브 레벨을 생성한다.
DWORD Usage,D3DFORMAT Format, - in D3DFORMAT 열거형의 멤버. 텍스처의 전레벨의 포맷을 기술 D3DPOOL Pool, - D3DPOOL_MANAGED; S/W로 사용할 건지, H/W로 사용할 건지 자동 설정으로
D3DFMT_R8G8B8 / 값20/ 24 비트의 RGB 픽셀 포맷으로, 채널 근처 8 비트를 사용
<적용예>D3DFMT_A8R8G8B8 / 값21/ 32 비트의 알파 첨부 ARGB 픽셀 포맷으로, 채널 근처 8 비트를 사용 D3DFMT_R5G6B5 / 값23/ 16 비트의 RGB 픽셀 포맷으로, 빨강 5 비트, 초록 6 비트, 파랑 5 비트를 사용 ... 0903-5.와이어프레임렌더링
<설정>
Device->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME); 4 노티(4/5): 다이렉트 3D-20030904/ 멀티텍스쳐.../ 매트릭스 변환과 환경맵 #0904-1.멀티텍스쳐
<설정> 적용하는 위치는 texture를 불러온 다음에서 위치하며,
원하는 오브젝트의 texture를 뿌리기 전에 위치한다.
0.HRESULT SetTexture( DWORD Stage, - in 텍스처를 설정하는 스테이지 식별자0.HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );
- 현재 할당할 수 있는 텍스처에 스테이트값을 설정
D3DTSS_COLOROP = 1,
D3DTA (텍스처 인수 정수) - 장치에 대응하는 각각의 텍스처 스테이지는 2 개의 텍스처 인수를 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_CURRENT - 텍스처 인수는 전의 혼합 스테이지의 결과이다.
최초의 텍스처 스테이지 (스테이지 0)에서는, 이 인수는 D3DTA_DIFFUSE 와 같다.
D3DTA_DIFFUSE - gouraud shading 처리중에 정점의 성분으로부터 보간 해 얻을 수
있던 디퓨즈색
D3DTA_TEXTURE - 텍스처 스테이지의 텍스처 컬러이다. 허가는 읽기 전용이다.
D3DTA_SPECULAR - gouraud shading 처리중에 정점의 성분으로부터 보간 된 스펙큐러색이다.
typedef enum _D3DTEXTUREOP {
} 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, ... <적용> 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.디테일맵; 벽이나 바닥에 가깝게 접근했을 때, 보다 선명하게 렌더링 0904-5.알파연산; 투명도에만 영향을 미친다. 흑백이 명확할수록 선명하게 빠짐
<설정>
// Alphablendging 활성화가 필요 0904-6.매트릭스 변환과 환경맵
<설정>
0.HRESULT SetTransform( D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX *pMatrix );
- 단일 장치의 변환 관련 스테이트를 설정
D3DTS_VIEW = 2, - 뷰 변환 행렬로서 설정되는 변환 행렬을 식별, 디폴트값은 NULL(단위행렬)
0.HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value );D3DTS_PROJECTION = 3, - 투영 변환 행렬로서 설정되는 변환 행렬을 식별, 디폴트값은 NULL(단위행렬) D3DTS_TEXTURE0 = 16, - 지정된 텍스처 스테이지로 설정되는 변환 행렬을 식별 D3DTS_TEXTURE1 = 17, - 지정된 텍스처 스테이지로 설정되는 변환 행렬을 식별 ...
D3DTSS_TEXTURETRANSFORMFLAGS = 24,
이 텍스처 스테이지의 텍스처 좌표의 변환을 제어한다. 디폴트값은, D3DTTFF_DISABLE
typedef enum _D3DTEXTURETRANSFORMFLAGS {
D3DTTFF_DISABLE = 0, - 텍스처 좌표는 래스터라이저에 직접 건네받는다.
} D3DTEXTURETRANSFORMFLAGS;D3DTTFF_COUNT1 = 1, - 래스터라이저는, 1D 의 텍스처 좌표를 상정한다. D3DTTFF_COUNT2 = 2, - 2D 의 텍스처 좌표를 상정한다. D3DTTFF_COUNT3 = 3, - 3D 의 텍스처 좌표를 상정한다. D3DTTFF_COUNT4 = 4, - 4D 의 텍스처 좌표를 상정한다. D3DTTFF_PROJECTED = 256, - 텍스처 좌표는, 래스터라이저에게 건네지기 전에 마지막 요소로 모두 분할 D3DTTFF_FORCE_DWORD = 0x7fffffff - 이 열거형을 강제적으로 32 비트 사이즈에 컴파일 0.D3DTEXTURESTAGESTATETYPE 열거형
D3DTSS_TEXCOORDINDEX = 11, - 이 텍스처 스테이지에서 사용하기 위해 설정된 텍스처 좌표의 인덱스.
0.D3DTSS_TCI - 드라이버 텍스처 좌표의 능력 플래그(텍스처 변환용의 입력 텍스처 좌표를 자동적으로 생성)
정점 1 개에 대해서 최대 8 세트까지의 텍스처 좌표를 설정할 수 있다.
정점이, 지정된 인덱스의 텍스처 좌표 세트를 포함하지 않은 경우는, u 및 v 좌표 디폴트(0,0)
#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.스탠실버퍼; 필요영역에만 렌더링 지정(클리핑)
0905-2.Data구성
-1.모든 Data는 로딩시 초기화 되며,
Data를 바탕으로 구성된 Index와 flag에 의해 조작된다.
-2.캐릭터==> 결과적으로 모든 결과는 Index의 조합의 산물(자료 이용의 효율성 높임)
메쉬멤버(초기Data를 매쉬로 재구성)
-3.Vertex List 등을 포인터로 받을 경우는 동적할당이 필요
-.Vertex List ; 정점의 구성 -> 구조체 형식으로 좌표와 노말, 컬러등 정점만의 요소로 구성
애니메이션멤버-.Index List -.VerNum -.IndexNum -.메쉬이름 -.메쉬ID Texture Material 행동정보(위치, 인공지능 패턴) 각종flag ... |
차가운 차와 차가운 밥은 참을 수 있지만 차가운 이야기는 견디지 못한다(중국속담) 책갈피_Pipeline WikiWikiWeb 신용_산업기상도 HGL_11Hardware |