wsprintf(szBuf, TEXT("%d"),ddsd.lPitch);
MessageBox(main_window_handle,szBuf,TEXT("TEST"),MB_OK);
Direct3D 에서 라이팅을 사용하려면 1개 또는 여러개의 라이트를 작성해야합니다. 어떤 색이 지오메트리 오브젝트를 조사할 것인가를 결정하려면 지오메트리 오브젝트를 렌더링할 매터리얼을 작성할 필요가 있습니다. 신을 렌더링하기 전에 Lights 샘플 오브젝트는 1개의 매터리얼과 1개의 디렉셔널 라이트를 설정하는 애플리케이션 정의 함수인 SetupLights 를 호출합니다.
매터리얼은 라이트가 조사될 때에 지오메트리 오브젝트의 서피스에 반사할 색을 정의합니다. 다음 코드는
D3DMATERIAL9 mtrl; ZeroMemory( &mtrl, sizeof(mtrl) ); mtrl.Diffuse.r = mtrl.Ambient.r = 1.0f; mtrl.Diffuse.g = mtrl.Ambient.g = 1.0f; mtrl.Diffuse.b = mtrl.Ambient.b = 0.0f; mtrl.Diffuse.a = mtrl.Ambient.a = 1.0f; g_pd3dDevice->SetMaterial( &mtrl );
매터리얼의 디퓨즈 색과 앰비엔트 색이 황색으로 설정됩니다.
이것으로 매터리얼이 신에 적용되었습니다. 다음으로 라이트를 작성합니다.
Direct3D 에서 사용할 수 있는 라이트에는 다음 3종류가 있습니다.
샘플 코드에서는 한쪽 방향으로 라이트를 조사하는 디렉셔널 라이트를 작성합니다. 또, 코드를 사용해 라이트의 방향을 좌우로 움직입니다.
다음 코드는
D3DXVECTOR3 vecDir; D3DLight9 light; ZeroMemory( &light, sizeof(light) ); light.Type = D3DLIGHT_DIRECTIONAL;
다음 코드는 이 라이트의 디퓨즈 색을 흰색으로 설정합니다.
light.Diffuse.r = 1.0f; light.Diffuse.g = 1.0f; light.Diffuse.b = 1.0f;
다음 코드는 라이트의 방향을 원형으로 회전시킵니다.
vecDir = D3DXVECTOR3(cosf(timeGetTime()/360.0f),
0.0f,
sinf(timeGetTime()/360.0f) );
D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
범위로는 Direct3D 에 라이트의 이펙트가 미치는 범위를 지정합니다. 이 멤버는 디렉셔널 라이트에는 영향주지 않습니다. 다음 코드는 이 라이트에 1000단위의 범위를 할당합니다.
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, 0x00202020 );
위의 코드에서는 D3DRS_AMBIENT 디바이스 변수는 라이트 그레이 (0x00202020) 로 설정되어있습니다. 앰비언트 라이팅은 지정된 색으로 모든 오브젝트를 비춥니다.
라이팅과 매터리얼에 대해 자세한 것은「라이팅과 매터리얼
이 튜토리얼에서는 라이팅과 매터리얼을 사용하는 방법을 나타냈습니다.「튜토리얼 5:텍스쳐 맵의 사용」에서 텍스쳐를 서페이스에 추가하는 방법을 다룹니다.
Direct3D 라이트로 3D 오브젝트가 보다 리얼하게 보일 수 있게 되었습니다. 신의 각 지오메트리 오브젝트는 사용된 장소와 라이트의 종류를 베이스로 해서 라이트가 조사됩니다. 이 튜토리얼의 샘플 코드에서는 라이트와 매터리얼에 대해서 설명합니다.
[DX9] 4.라이트의 작성과 사용 1 - 신 지오메트리 초기화
라이트를 사용하는 요건의 하나로 각 서피스에 법선이 포함되도록 할 필요가 있습니다. Lights 샘플 프로젝트에서는 새로운 커스텀 정점 타입을 사용합니다. 새로운 커스텀 정점형식에는 3D 위치와 서피스 법선을 포함합니다. 서피스 법선은 내부에서 Direct3D가 라이트의 계산을 하는데 사용됩니다.
struct CUSTOMVERTEX
{
D3DXVECTOR3 position; // The 3D position for the vertex.
D3DXVECTOR3 normal; // The surface normal for the vertex.
};
// Custom flexible vertex format (FVF).
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL)
이것으로 바른 벡터 형식이 정의 되었습니다. Light 샘플 프로젝트에서는 원기둥을 작성하는 애플리케이션 정의 함수인 InitGeometry 를 호출합니다. 처음에는 원기둥의 포인트를 격남한 정점 버퍼를 작성합니다. 다음 샘플 코드에 그것을 표시했습니다.
// Create the vertex buffer.
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 50*2*sizeof(CUSTOMVERTEX),
0 /*Usage*/, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
return E_FAIL;
다음에는 정점 버퍼를 원기둥의 포인트로 묻습니다. 다음 샘플코드에서는 각 포인트가 위치와 법선으로 정의 되어있습니다.
CUSTOMVERTEX* pVertices;
if( FAILED( g_pVB->Lock( 0, 0, (void**)&pVertices, 0 ) ) ) return E_FAIL;
for( DWORD i=0; i<50; i++ )
{
FLOAT theta = (2*D3DX_PI*i)/(50-1);
pVertices[2*i+0].position = D3DXVECTOR3( sinf(theta),-1.0f, cosf(theta) );
pVertices[2*i+0].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
pVertices[2*i+1].position = D3DXVECTOR3( sinf(theta), 1.0f, cosf(theta) );
pVertices[2*i+1].normal = D3DXVECTOR3( sinf(theta), 0.0f, cosf(theta) );
}
http://ko.wikipedia.org/wiki/%EC%82%BC%EA%B0%81%ED%95%A8%EC%88%98
앞의 샘플코드를 사용해 정점 버퍼를 원기둥의 정점으로 묻으면 정점 버퍼는 렌더링 할 수 있게 됩니다.
다만, 이 신의 매터리얼과 라이트는 원기둥을 렌더링하기 전에 미리 설정해둘 필요가 있습니다.
이것에 대해서는「2 - 매터리얼과 라이트 설정」에서 설명합니다.
사영 트랜스폼 행렬은 지오메트리를 3D 뷰 공간으로부터 2D뷰포트 공간으로 변환하는 방법을 정의하고 있습니다.
다음 코드는 사영 트랜스폼 행렬을 작성해 Direct3D 디바이스에 대해 현재의 사영 트랜스폼을 설정합니다.
D3DXMATRIX matProj; D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f ); g_pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
첫번째로
다음에는
사영 트랜스폼에 대한 자세한 것은 「사영 트랜스폼
이 튜토리얼에서는 행렬을 사용하는 방법을 표시했습니다.「튜토리얼 4:라이트의 작성과 사용」에서는 리얼리티를 높여주기 위한 신에 라이트를 추가하는 방법을 다뤄 보겠습니다.
뷰 트랜스폼 행렬은 뷰의 위치와 회전을 정의합니다. 뷰 행렬은 신에 대해서 사용되는 카메라 입니다.
다음 코드는 뷰 트랜스폼 행렬을 작성해 Direct3D 디바이스에 대한 현재의 뷰 트랜스폼을 설정합니다.
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; D3DXMatrixLookAtLH( &matView, &vEyePt, &vLookatPt, &vUpVec ); g_pd3dDevice->SetTransform( D3DTS_VIEW, &matView );
처음에는
다음에는
뷰 트랜스폼의 자세한 사항은 「뷰 트랜스폼
신에 대한 월드 트랜스폼을 정의하면 사영 트랜스폼 행렬(projection transform matrix)을 사용할 수 있게 됩니다. 이 경우도 트랜스폼을 정의하는 순서는 중요하지 않습니다. 다만, Direct3D 는 다음 순서로 신에 행렬을 적용합니다.
사영 트랜스폼 행렬의 정의에 대해서는「 3 - 사영 트랜스폼 행렬 정의」를 참조해 주세요.
이 튜토리얼에서는 행렬의 개념을 소개하고, 행렬의 사용방법을 보여줍니다. Vertices 샘플 프로젝트에서는 2D의 정점을 렌더링하고 삼각형을 드로우했습니다. 그리고, 이 튜토리얼에서는 3D 정점의 트랜스폼을 처리합니다. 행렬은 카메라와 뷰포트의 셋업에도 사용됩니다.
Matrices 샘플 프로젝트에서는 지오메트리의 렌더링을 실행하기 전에 애플리케이션 정의의 SetupMatrices 함수를 호출해 3D 삼각형의 렌더링에 사용하는 행렬 트랜스폼의 작성과 정의를 실행합니다. 이들 타입의 트랜스폼은 통상 3D 신의 경우에 설정됩니다. 이들 일반적인 각각의 트랜스폼을 작성하는 것을 다루도록 하겠습니다.
==========================
[DX9] 3.행렬의 사용방법 1 - 월드 트랜스폼 행렬 정의
월드 트랜스폼 행렬에서는 3D모델 공간에서 지오메트리의 평행이동, 스케일링, 회전을 실행하는 방법을 정의합니다.
다음의 코드에서는 삼각형을 y축 회전으로 회전 시킨 뒤 Direct3D 디바이스에 대한 현재의 월드 트랜스폼을 설정합니다
D3DXMATRIX matWorld; D3DXMatrixRotationY( &matWorld, timeGetTime()/150.0f ); g_pd3dDevice->SetTransform( D3DTS_WORLD, &matWorld );
처음에는
다음은,
월드 트랜스폼의 자세한 사항에 대해서는 「월드 트랜스폼
신에 대한 월드 트랜스폼을 정의하면 뷰 트랜스폼 행렬을 사용할 수있게 됩니다. 이 경우도 트랜스폼을 정의하는 순서는 중요치 않습니다. 다만, Direct3D에서는 다음 순서로 신에 행렬을 적용합니다.
뷰 트랜스폼 행렬의 정의에 대해서는「2 - 뷰 트랜스폼 행렬의 정의」를 참조해 주십시오.
이것으로 정점 버퍼에 정점이 격납되었습니다. 다음은 표시를 렌더링합니다. 표시의 렌더링에서는 먼저 백 버퍼를 클리어 해 청색으로 하고 그 다음 BeginScene 을 호출합니다.
g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0L ); g_pd3dDevice->BeginScene();
정점 버퍼로부터 정점 데이터를 렌더링 하려면 몇 단계를 거칩니다. 우선 스트림 소스를 설정합니다. 이 때 스트림 0을 사용합니다. 스트림 소스는
g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
첫번째 파라메터는 스트림 번호, 두번째 파라메터는 정점 버퍼로의 포인터 입니다. 세번째 파라메터는 스트림의 선두로부터 정점 데이터의 선두까지의 오프셋입니다. 이 예에서는 0입니다. 마지막 파라메터는 정점 선언의 각요소의 바이트 수입니다.
다음은
g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
SetFVF 의 유일한 파라메터가 정점 데이터 레이아웃을 정의하는 고정 정점 함수 코드입니다.
다음은 아래의 샘플 코드에 나오는 것처럼
g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );
DrawPrimitive 가 받아들이는 1번째의 파라메터는 Direct3D에 드로우하는 프리머티브의 종류를 지시하는 플래그입니다. 이 샘플에서는 D3DPT_TRIANGLELIST 플래그를 사용해 삼각형의 리스트를 지정합니다. 두번째 파라메터는 처음 로드할 정점의 인덱스입니다. 세번째 파라메터는 드로우할 프리머티브의 수를 나타냅니다. 이 샘플에서는 1개의 삼각형만 드로우하므로 이 값은 1이 설정됩니다.
각종 프리머티브의 자세한 내용에 대해서는 「프리머티브」를 참조해 주십시오.
마지막으로 신을 종료한 후 백 버퍼를 프론트 버퍼에 할당합니다. 이 예를 다음 코드에 나타냈습니다.
g_pd3dDevice->EndScene(); g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
백 버퍼를 프론트 버퍼에 할당하면 클라이언트 윈도우에 3개의 다른 컬러의 포인터를 가진 삼각형이 표시됩니다.
이 튜토리얼에서는 정점을 사요해서 지오메트릭 쉐이프를 렌더링하는 방법을 다뤘습니다.「튜토리얼 3: 행렬의 사용방법」에서 행렬의 컨셉과 그 사용방법을 소개합니다.
커스텀 정점 포맷이 정의 되면 다음은 정점을 초기화 합니다. Vertices 샘플 프로젝트에서는 필요한 Direct3D 오브젝트를 작성한 후에 애플리케이션 정의 함수인 InitVB를 호출해 이것을 실행합니다. 다음 샘플 코드는 3개의 커스텀 정점의 값을 초기화 합니다.
CUSTOMVERTEX 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, },
};
상기 샘플 코드에서는 3개의 정점을 3각형의 포인트로 채우고 각 정점이 방사하는 컬러를 지정합니다. 제1포인트는 (150, 50)이고 컬러는 빨강(0xffff0000)입니다. 제2포인트는(250, 250)이고 컬러는 초록(0xff00ff00)입니다. 제3포인트는 (50, 250)이고 컬러는 청록(0xff00ffff)입니다. 이들 포인트는 각각 심도치는 0.5, RHW(Reciprocal of the W coordinate from the Homogeneous point;동차 좌표 w 성분의 역수)는 1.0입니다.
다음은 아래의 샘플코드에 나타낸 것처럼
if( FAILED( g_pd3dDevice->CreateVertexBuffer( 3*sizeof(CUSTOMVERTEX),
0 /*Usage*/, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL ) ) )
return E_FAIL;
정점 버퍼의 작성 후 다음 샘플 코드에 나온 것처럼 커스텀 정점 데이터로 그것을 채웁니다.
VOID* pVertices;
if( FAILED( g_pVB->Lock( 0, sizeof(vertices), (void**)&pVertices, 0 ) ) )
return E_FAIL;
memcpy( pVertices, vertices, sizeof(vertices) );
g_pVB->Unlock();
우선
그 다음 memcpy 를 사용해 정점은 정점 버퍼에 복사됩니다. 정점 버퍼에 정점이 읽어들여지면
이것으로 정점 버퍼에 정점이 격납됩니다. 다음은「 3 - 표시의 렌더링」에서 표시를 렌더링 하는 것을 다룹니다.
Direct3D로 기술된 애플리케이션에서는 정점을 사용해,지오메트리 쉐이프를 그립니다. 각 3차원(3D) 신에는 이들 지오메트리 쉐이프가 1개 이상 포함되어 있습니다. Vertices 샘플 프로젝트에서는 가장 단순한 쉐이프인 삼각형을 작성해 그것을 렌더링해 표시합니다.
이 튜토리얼에서는 다음 스텝에 따라 정점을 사용해 삼각형을 작성하는 방법을 보여줍니다.
=================
[DX9] 2.정점의 렌더링 1 - 커스텀 정점 타입의 정의
Vertices 샘플 프로젝트는 3개의 정점(vertex; vertices(복수형))을 사용해 2D 삼각형을 렌더링 합니다. 이것은 정점 버퍼(vertex buffer)의 개념, 다시말해 정점을 격납해 렌더링 하기위해 사용되는 Direct3D 오브젝트를 도입하고 있습니다. 정점의 정의하는 방법은 다양하며, 커스텀 정점 구조체와 대응하는 커스텀 플렉서블 정점 포맷(FVF)을 지정하는 등 다양한 방법이 있습니다. Vertices 샘플 프로젝트의 정점 포맷을 다음 샘플 코드에 나타냈습니다.
struct CUSTOMVERTEX
{
FLOAT x, y, z, rhw; // The transformed position for the vertex.
DWORD color; // The vertex color.
};
위의 구조체는 커스텀 타입의 포맷을 지정하고 있습니다. 다음은 버퍼 내의 정점 내용을 나타내는 FVF을 정의 하는 것입니다. 다음 샘플 코드는 위에서 작성된 커스텀 정점 타입에 대응하는 FVF를 정의하고 있습니다.
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
여기서 커스텀 벡터 포맷과 FVF가 지정됩니다. 다음은 「2 - 정점 버퍼의 설정」으로 정점 버퍼를 정점으로 채우는 것 입니다.
| 주의 |
|---|
| Vertices 샘플 프로젝트의 정점은 트랜스폼 되어있습니다. 다시말해, 이미 2D 윈도우 좌표화 되어있습니다. 이것은 포인트 (0,0)이 좌상측 모서리에 위치하며 X축 방향으로 증가하는 것은 오른쪽으로 향하는 것, Y축 방향으로 증가하는 것은 아래로 향한다는 것을 의미합니다. 또, 이것들의 정점은 강조 표시(lit) 되어있습니다. 다시말해 Direct3D 라이팅은 사용하지 않습니다만, 각각 컬러가 지정되어있습니다. |
실행중의 몇몇 포인트에서 애플리케이션을 셧 다운할 필요가 있습니다. DirectX 애플리케이션을 셧 다운하면 애플리케이션 윈도우가 파기될뿐 아니라 애플리케이션이 사용하고 있는 DirectX 오브젝트가 할당을 해제돼 그들로의 포인터는 무효화 됩니다. CreateDevice 샘플 프로젝트에서는 WM_DESTROY 메시지를 받으면 이 메시지를 처리하기 위해서 애플리케이션 정의 함수의 Cleanup을 호출합니다.
VOID Cleanup()
{
if( g_pd3dDevice != NULL)
g_pd3dDevice->Release();
if( g_pD3D != NULL)
g_pD3D->Release();
}
상기 함수는 오브젝트마다 IUnknown 메소드를 호출해 사용하고 있는 Direct3D 오브젝트의 할당을 해제합니다. 이 튜토리얼은 COM 룰을 따르므로 대부분의 오브젝트의 리퍼런스 카운트는 0이 되어 메모리로부터 자동적으로 소거됩니다.
셧다운 이외에도 데스크 톱의 해상도와 색상수를 변경할 경우 등 통상 실행중에 사용중의 Microsoft Direct3D 오브젝트를 파기해 다시 작성할 필요가 생길 수 있습니다. 그때문에 애플리케이션의 클린 업 코드는 필요에 따라 호출하도록 한 곳에 모아 유지할 것을 추천합니다.
이 튜토리얼에서는 디바이스를 작성하는 방법을 다뤘습니다.「튜토리얼2:정점의 렌더링」에서 정점을 사용해 지오메트릭 쉐이프를 그리는 방법을 알아봅니다.
신을 렌더링해 표시하기 위해 이번 샘플 코드에서는 백 버퍼를 청색으로 클리어해서 백 버퍼의 내용을 프론트 버퍼로 전송해 프론트 버퍼를 화면에 할당합니다.
신을 클리어하려면 IDirect3DDevice9::Clear 메소드를 호출합니다.
// Clear the back buffer to a blue color g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f, 0 );
일반적으로 렌더 타겟 전체를 커버하는 단일 사각형을 사용합니다. 이것을 실행하려면 첫번째의 파라메터를 0으로, 두번째의 파라메터를 NULL로 설정합니다. 세번째 파라메터는 메소드의 동작을 결정합니다. 렌더 타겟 서페이스(render-target suface), 관련지어진 심도 버퍼(associated depth buffer), 스텐실 버퍼(stencil buffer), 또는 3개의 임의의 조합을 클리어하기 위한 플래그를 지정할 수 있습니다. 이 튜토리얼에서는 심도 버퍼는 사용하지 않습니다. D3DCLEAR_TARGET 이 사용되고 있는 유일한 플래그입니다. 최초 3개의 파라메터는 렌더 타겟, 심도 버퍼, 그리고 스텐실 버퍼의 값의 클리어를 반영하도록 설정됩니다. CreateDevice 샘플 프로젝트에서는 렌더 타겟 서페이스의 클리어 컬러를 청(D3COLOR_XRGB(0,0,255))으로 설정합니다. 마지막 2개의 파라메터는 대응하는 플래그가 존재하지 않으므로 IDirect3DDevice9::Clear 메소드에서는 무시됩니다.
다음의 샘플 코드에 보이는 것처럼 CreateDevice 샘플 프로젝트는 뷰포트를 클리어한 후, Direct3D에 렌더링이 개시된 것을 통지하고 그 뒤 렌더링이 완료된 것을 통지합니다.
// Begin the scene g_pd3dDevice->BeginScene(); // Rendering of scene objects happens here // End the scene g_pd3dDevice->EndScene();
신이 렌더링되면 IDirect3DDevice9::Present 메소드를 사용해 표시합니다.
g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
최초 2개의 파라메터는 복사할(source) 사각형과 복사될(destination) 사각형입니다. 이 샘플 코드에서는 이 2개의 파라메터를 NULL에 설정하는 것으로 백 버퍼 전체를 프론트 버퍼에 할당하고 있습니다. 3번째 파라메터는 이 프레젠테이션의 소스 윈도우를 설정합니다. 이 파라메터는 NULL에 설정되어있으므로 D3DPRESENT_PARAMETERS의 hWndDeviceWindow 멤버가 사용됩니다. 4번째의 파라메터는 DirtyRegion 파라메터로 일반적으로는 NULL에 설정됩니다.
이 튜토리얼의 마지막 단계로「5 - 셧 다운」에서 애플리케이션을 셧다운 해 봅시다.
애플리케이션 윈도우를 작성하고, Direct3D를 초기화 한 후는 언제라도 신을 렌더링 할 수 있습니다. 통상, Windows 애플리케이션은 각각의 메시지 루프 내에서 시스템 메시지를 모니터하고, 메시지가 큐에 존재하지 않으면 프레임을 렌더링 합니다. 다만, CreateDevice 샘플 프로젝트는 WM_PAINT 메시지가 큐에 들어올 때까지 대기해 애플리케이션에 그 윈도우 전체 또는 일부를 갱신할 필요가 있음을 통지합니다.
// The message loop.
MSG msg;
while( GetMessage( &msg, NULL, 0, 0 ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
루프가 실행될 때마다 DispatchMessage 는 큐 내의 메시지를 처리할 MsgProc를 호출합니다.
WM_PAINT 가 큐에 들어오면 애플리케이션은 윈도우를 갱신할 애플ㄹ리케이션 정의 함수인 Render를 호출합니다. 이어서 클라이언트 영역 전체를 검증하기위해서 Win32함수ValidateRect 가 불립니다.
메시지 처리 함수의 샘플 코드는 다음과 같습니다.
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
switch( msg )
{
case WM_DESTROY:
PostQuitMessage( 0 );
return 0;
case WM_PAINT:
Render();
ValidateRect( hWnd, NULL );
return 0;
}
return DefWindowProc( hWnd, msg, wParam, lParam );
}
이것으로 애플리케이션은 시스템 메시지를 처리할 수 있습니다. 다음에는 「 4 - 신의 렌더링과 표시」에서 설명하는 것 처럼 표시를 렌더링 합니다.
© 2009 Microsoft Corporation. All rights reserved.
バージョン: 1734.00
CreateDevice 샘플 프로젝트는 윈도우 작성후에, WinMain 로부터 호출된 InitD3D 애플리케이션 정의함수 중에서 Direct3D 초기화를 실행합니다. 애플리케이션 윈도우의 적성후에는 언제라도, 신을 렌더링하기 위해 사용하는 Direct3D 오브젝트를 초기화 할 수 있습니다. 이 프로세스는 오브젝트를 작성하고 프레젠테이션 파라메터를 설정하고 마지막으로 Direct3D 디바이스를 작성합니다.
Direct3D 오브젝트의 작성 후 IDirect3D9::CreateDevice 메소드를 사용해 디바이스를 작성하고 디바이스, 타입, 모드 등의 열거 할 수 있습니다.
if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) ) return E_FAIL;
D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
마지막 순서로 다음 코드의 예에 나타낸 것처럼 IDirect3D9::CreateDevice 메소드를 사용해 Direct3D 디바이스를 작성합니다.
if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
D3DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
상기 샘플코드는 D3DADAPTER_DEFAULT 플래그를 사용해서 디폴트 어댑터를 가진 디바이스를 작성합니다. 통상, 시스템은 복수의 그래픽 하드웨어 카드가 인스톨 되어있지 않은 한, 단일 어댑터만을 가집니다. DeviceType 파라메터에 D3DDEVTYPE_HAL을 지정하면, 소프트웨어 디바이스에 의한 하드웨어 디바이스 쪽이 우선됩니다. 이 샘플코드에서는 D3DCREATE_SOFTWARE_VERTEXPROCESSING 를 사용해서, 시스템에 소프트웨어 정점처리를 사용하도록 지시하고 있습니다. D3DCREATE_HARDWARE_VERTEXPROCESSING 를 지정해, 시스템의 하드웨어 정점처리를 사용하도록 하는 경우에는 하드웨어 정점처리 퍼포먼스가 대폭 향상하는 점에 주의해 주십시오.
이것으로 Direct3D 오브젝터는 초기화 되었습니다. 다음에는 「3 - 시스템 메시지의 처리」에서 설명하고 있는 것처럼, 시스템 메시지를 처리하는 메카니즘의 확보를 수행합니다.
Windows 애플리케이션이 실행될 때에 최초로 처리되어야할 것은 유저에게 표시하는 애플리케이션 윈도우를 작성하는 것입니다. 이것을 실행하려면 CreateDevice 샘플 프로젝트의 WinMain 함수로 실행을 개시합니다. 다음의 샘플 코드는 윈도우의 초기화를 실행합니다.
INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT )
{
// Register the window class.
WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,
GetModuleHandle(NULL), NULL, NULL, NULL, NULL,
"Direct3D Tutorial", NULL };
RegisterClassEx( &wc );
// Create the application's window.
HWND hWnd = CreateWindow( "Direct3D Tutorial", "Direct3D Tutorial 01: CreateDevice",
WS_OVERLAPPEDWINDOW, 100, 100, 300, 300,
GetDesktopWindow(), NULL, wc.hInstance, NULL );
상기의 샘플코드는 표준 Windows 프로그래밍입니다. 샘플에서는 최초로 "Direct3D Tutorial"이라는 윈도우 클래스를 정의해 등록하고 있습니다. 클래스를 등록한 뒤 샘플 코드는 폭 300픽셀, 높이 300픽셀의 클라이언트 영역을 가지고 등록한 클래스를 사용하는 기본적인 최상위 윈도우를 작성합니다. 이 윈도우에는 메뉴와 자식 윈도우는 없습니다. 샘플에서는 WS_OVERLAPPEDWINDOW 윈도우 스타일을 사용해 윈도우 애플리케이션에 공통의 [최소화], [최대화], 그리고 [닫기] 버튼을 가진 윈도우를 작성합니다.(샘플이 풀스크린 모드로 실행될 경우, 추천되는 윈도우 스타일은 WS_EX_TOPMOST입니다. 이것은 작성된 윈도우를 최상위가 아닌 모든 윈도우 위에 배치해 윈도우가 비 액티브인 경우에도 최상위에 남아있도록 지정합니다.) 윈도우가 작성되면 표준의 Win32함수를 호출해 윈도우 표시를 갱신합니다.
애플리케이션 윈도우가 준비되었으면 「2 - Direct3D의 초기화」에서 설명하는대로 필수 Direct3D 오브젝트의 셋업을 개시할 수 있습니다.
DirectX Software Development Kit / 튜토리얼/ Direct3D 튜토리얼/ 튜토리얼 1: 디바이스의 작성 도움말에서
svnadmin create /Repo_Master/Sketch_svn





샘플코드에선 각각 사이즈를 지정해줬는데, 걍 화면 크기 구해서 알아서 들어가게 해본 것.
게다가 Xcode 4로 가면서 기기별로 나눠져있던 부분이 하나로 합쳐져서 정리되어있으므로 각각 상속해서 오버라이드 각각 해주기 싫음 이렇게 해줄 필요가 있을지도. 너무나 당연(?)하지만.. 뭐 배울때 따로 배운걸 워쩌겠..ㅋㅋㅋㅋ
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
CGRect viewBound=[[UIScreen mainScreen]bounds]; //메인 화면 사이즈 구하기
_viewCtl=[[LocationEx alloc] init];
[_viewCtl.view setFrame:CGRectMake(0, 20, viewBound.size.width, viewBound.size.height)];
[_window addSubview:_viewCtl.view];
[_window makeKeyAndVisible];
return YES;
}
틀림 할 수 없지 뭐. 케세라세라.
Constants
NSASCIIStringEncoding
Strict 7-bit ASCII encoding within 8-bit chars; ASCII values 0…127 only.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSNEXTSTEPStringEncoding
8-bit ASCII encoding with NEXTSTEP extensions.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSJapaneseEUCStringEncoding
8-bit EUC encoding for Japanese text.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF8StringEncoding
An 8-bit representation of Unicode characters, suitable for transmission or storage by ASCII-based systems.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSISOLatin1StringEncoding
8-bit ISO Latin 1 encoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSSymbolStringEncoding
8-bit Adobe Symbol encoding vector.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSNonLossyASCIIStringEncoding
7-bit verbose ASCII to represent all Unicode characters.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSShiftJISStringEncoding
8-bit Shift-JIS encoding for Japanese text.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSISOLatin2StringEncoding
8-bit ISO Latin 2 encoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUnicodeStringEncoding
The canonical Unicode encoding for string objects.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSWindowsCP1251StringEncoding
Microsoft Windows codepage 1251, encoding Cyrillic characters; equivalent to AdobeStandardCyrillic font encoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSWindowsCP1252StringEncoding
Microsoft Windows codepage 1252; equivalent to WinLatin1.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSWindowsCP1253StringEncoding
Microsoft Windows codepage 1253, encoding Greek characters.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSWindowsCP1254StringEncoding
Microsoft Windows codepage 1254, encoding Turkish characters.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSWindowsCP1250StringEncoding
Microsoft Windows codepage 1250; equivalent to WinLatin2.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSISO2022JPStringEncoding
ISO 2022 Japanese encoding for email.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSMacOSRomanStringEncoding
Classic Macintosh Roman encoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF16StringEncoding
An alias for NSUnicodeStringEncoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF16BigEndianStringEncoding
NSUTF16StringEncoding encoding with explicit endianness specified.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF16LittleEndianStringEncoding
NSUTF16StringEncoding encoding with explicit endianness specified.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF32StringEncoding
32-bit UTF encoding.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF32BigEndianStringEncoding
NSUTF32StringEncoding encoding with explicit endianness specified.
Available in iOS 2.0 and later.
Declared in NSString.h.
NSUTF32LittleEndianStringEncoding
NSUTF32StringEncoding encoding with explicit endianness specified.
Available in iOS 2.0 and later.
Declared in NSString.h.
====================================
[컬럼] 리소스로부터 바이트 배열 읽어오기
====================================
리소스로부터 이미지를 읽어오려면 UIImage의 imageNamed:메소드를 사용하지만, 바이트 배열을 읽어오려면 NSData클래스의 dataWithContentsOfFile:메소드를 사용한다.
(중략)
읽을 위치의 패스로 리소스의 패스를 지정할 때는 NSBundle클래스의 mainBundle메소드에서 NSBundle오브젝트를 취득해 pathForResource:ofType:메소드에서 패스를 생성해 이용한다
(중략)
pathForResource:ofType:메소드의 인수에는 파일명이 "test.txt"일 때의 파일명에 "test"와 확장자에 "txt", 아니면 파일명에 "test.txt"와 확장자에 ""를 지정한다. 리소스로부터 바이트 배열을 읽어오는 메소드로 정리하면 다음과 같다.
-(NSData*)res2data:(NSString*)res {
NSString* file=[[NSBundle mainBundle] pathrForResource:res ofType:@""];
return [NSData dataWithContentsOfFile:file];
}