사용자 삽입 이미지

텍스쳐 효과가 아닌 정점이 직접 움직인다.

사용자 삽입 이미지

원래는 그냥 평면. 가운데는 왜 검지?

■ DX SDK 샘플들 중에서 HLSLwithoutEffects에 대한 세미나 발표 후 내용 정리. 아직까지는 임시변통적으로 키워드만 나열한 상태이므로 집중해서 읽을필요는 없음. 다음 주(가능하다면)에 정리해서 자세히 설명하겠음.

■ 일단 오늘 새롭게 뇌에 주입된 주제.
(1) GLUT를 모방한 것처럼 보이는 <DXUT> 이제 DirectX SDK 샘플들은 모두 DXUT바탕이 될 듯. 즉, GLUT처럼 콜백함수를 등록하는 방식으로 윈도우 생성이나 함수들을 등록하여 쉽게 DX를 배울 수 있다. 역시 점점 쉬워지는 구만.
(2) <HLSL>의 함수에 정점 정보를 넘겨주면 HLSL에서정점의 위치와 색을 변경할 수 있다.
(3) g_Camera에 대한 것.
(4) g_HUD에 대한 것. HUD는 무슨 뜻?
(5) 인덱스버퍼를 채우는 것에 대한 것.
(6) XZ평면에 놓인 직사각형의 면을 꿀렁꿀렁하게 하는(즉 Y좌표를 변화) 효과에 대한 것.

HLSLwithoutEffects.cpp파일의 OnResetDevice()

HLSLwithoutEffects.vsh파일 안의 HLSL코딩(면을 꿀렁꿀렁하게 만드는 Ripple() 함수)

HLSL에서 정점의 위치를(Output.Position) 바꿀 수 있는것 같다.
ConstantTable, HLSL, FVF없이 x와 y만 있는 vertex. 그후 HLSL의 Ripple함수에 정점을 넘겨줌.
HLSL의 Ripple 함수 내에서 넘겨받은 정점의 위치를 수정함.

XZ평면에 놓인 정사각형의 물체를 각 프레임 마다 Y축 방향으로 꿀렁꿀렁하게 만드는 프로그램이다. 꿀렁꿀렁한 것은 원래 평면과의 거리와 시간에 기초한다. 시간은 매 프레임마다 계속 증가한다. 왜냐하면 Y좌표와 정점의 색은 각 프레임마다 생성되기 때문이다. 그것들은 저장이 필요없다. 그러므로 정점정의(the vertex declaration)은 오직 D3DXVECTOR2만 포함된다. (X와 Z좌표로 이루어진.)
(주석: FVF를 안쓰고 X와 Z의 2개의 벡터만 사용한다. 근데 위의 소스에서는 x와 y의 값을 사용한다. 뭥미?)

초기화하는 동안, D3DXCompileShaderFromFile()로 파일로 부터 셰이더를 읽어 컴파일한다. 그 후에 ID3DXBuffer은 셰이더 코드와 ID3DXConstantTable을 포함한다. (ID3DXConstantTable은 App가 셰이더가 만든 전역변수를 얻고 설정하도록 허용한다.) 그리고 IDirect3DDevice9::CreateVertexShader를 호출한다.

FrameMove() 에서는 ID3DXConstantTable 인터페이스를 사용한다 (셰이더의 전역 변수들인 mViewProj과 fTime을 설정하기 위해, 그리고 view+projection transformation과 셰이더를 위한 time parameter를 업데이트 하기 위해) 렌더링 할때 이 샘플은 IDirect3DDevice9::SetVertexShader를 호출한다. SetVertexShader 함수는 디바이스에 버텍스 셰이더 렌더링이 가능하도록 키는(enable) 하는 것이다. IDirect3DDevice9::DrawIndexedPrimitive가 호출된 이후, 정점 셰이더는 버텍스 처리가 있을때마다 한번씩 불러지게 된다.

버텍스 쉐이더는 HLSLwithoutEffects.vsh 이 파일에 텍스트 형식으로 써 있다. 이 파일에는 두 개의 전역변수와 한 개의 셰이더 함수가(Ripple()) 있다. Ripple() 함수는 float2(정점의 X와 Z)을 받아서 2개의 float4를 리턴한다. 리턴하는 이 변수는 화면공간의 위치와 정점의 색을 나타낸다. Y좌표는 아래의 함수에 의해 매번 생성된다. 

Y = 0.1 * sin( 15 * L * sin(T) );

L은 정점과 Y가 조정되기 전 과의 거리이다. 즉 L은 루트(X제곱+Z제곱)의 값이다. 왜냐하면 정점들은 XZ평면 위에 있기 때문이다. T는 전역변수 fTime이다. sin(시간) 이니까 시간이 지나감에 따라서 sin 그래프 처럼 꿀렁꿀렁 해지는 것 같다.

정점의 색은 아래의 함수에 의해서 명암이 결정된다.

C = 0.5 - 0.5 * cos( 15 * L * sin(T) );

C는 RGBA(0~1의 범위).  (각 정점마다)검정에서 흰색으로의 색이 나온다. 그래서 명암이 꿀렁꿀렁하게 보이게 된다.

Trackback Address :: http://zsimi.tistory.com/trackback/172

댓글을 달아 주세요

  1. 현기쿤 2008/06/06 01:48 주소 수정 답글 달기

    D3DXVECTOR2( ((float)x / (float)(VERTS_PER_EDGE-1) - 0.5f) * D3DX_PI,

    이거 괜히 파이 들어있어서 꾸물꾸물하게 하는것 같았는데;;
    아니네 ㅋㅋ

    • 2008/06/06 12:52 주소 수정 BlogIcon 시미

      그러게. 왜 이렇게 되는지 연구(?) 하고 있으니까 다음주를 기대해. 후후.

  2. 현기쿤 2008/06/11 03:38 주소 수정 답글 달기

    예전에 내꺼 hlsl without effect 컴파일 할때
    __in, __out 때문에 컴파일 에러 났던적 있잖아 그게
    구글에서 검색해본 결과
    windows platform sdk 최신버전을 깔아야 한다는군~

    http://www.microsoft.com/downloads/details.aspx?FamilyId=A55B6B43-E24F-4EA3-A93E-40C0EC4F68E5&displaylang=en

    에서 다운 받을수 있음~

    • 2008/06/15 22:35 주소 수정 BlogIcon 시미

      platform sdk 면 VS 설치할때 깔리는거 아냐? 그런 하위 호완성도 없이 특성 타도록 DX를 만들다니. MS가 점점 하위호완성을 무시하는것 같애. 비스타도 그렇고, 말이야. 쯧쯧.