 텍스쳐 효과가 아닌 정점이 직접 움직인다. |  원래는 그냥 평면. 가운데는 왜 검지? |
■ 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()
//--------------------------------------------------------------------------------------
// File: HLSLwithoutEffects.cpp
// Desc: Sample showing a simple vertex shader in D3DX High Level Shader Language (HLSL) without using an ID3DXEffect interface. Not using the ID3DXEffect interface is a more difficult method of using HLSL. See the BasicHLSL sample for a simpler method of using HLSL.
//--------------------------------------------------------------------------------------
HRESULT CALLBACK
OnResetDevice( IDirect3DDevice9* pd3dDevice,
const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )
{
... 생략
for( y = 1; y < VERTS_PER_EDGE; y++ ) {
for( x = 1; x < VERTS_PER_EDGE; x++ ) {
//첫번째 삼각형
*pIndices++ = (WORD)( (y
-1)*VERTS_PER_EDGE + (x
-1) );
*pIndices++ = (WORD)( (y
-0)*VERTS_PER_EDGE + (x
-1) );
*pIndices++ = (WORD)( (y
-1)*VERTS_PER_EDGE + (x
-0) );
//두번째 삼각형
*pIndices++ = (WORD)( (y-1)*VERTS_PER_EDGE + (x-0) );
*pIndices++ = (WORD)( (y-0)*VERTS_PER_EDGE + (x-1) );
*pIndices++ = (WORD)( (y-0)*VERTS_PER_EDGE + (x-0) );
}
}
... 생략
for( y = 0; y < VERTS_PER_EDGE; y++ ) {
for( x = 0; x < VERTS_PER_EDGE; x++ ) {
*pVertices++ = D3DXVECTOR2( ((float)x / (float)(VERTS_PER_EDGE-1) - 0.5f) * D3DX_PI,
((float)y / (float)(VERTS_PER_EDGE-1) - 0.5f) * D3DX_PI );
}
}
... 생략
}
HLSLwithoutEffects.vsh파일 안의 HLSL코딩(면을 꿀렁꿀렁하게 만드는 Ripple() 함수)
VS_OUTPUT
Ripple( in float2 vPosition : POSITION ) {
VS_OUTPUT Output;
float fSin, fCos;
//아래와 같이 x는 거리와 시간에 영향을 받아서 구해진다.
float x =
length( vPosition ) *
sin( fTime ) * 15.0f;
//x에 대한 sin(x)와 cos(x)를 구해서 fSin과 fCos에 넣는다. (추측) sincos( x, fSin, fCos );
//함수가 실행된 시간에 기초해서 y의 위치를 변경한다.
//그리고 정점을 변경해서 projectrion space에 넣는다.
Output.Position = mul( float4( vPosition.x, fSin * 0.1f, vPosition.y, 1.0f ), mWorldViewProj );
// Output the diffuse color as function of time and
// the vertex's object space position
//diffuse color를 출력한다. (함수의 시간과, 정점의 공간 위치에 의한)
Output.Diffuse = 0.5f - 0.5f * fCos;
return Output;
}
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
댓글을 달아 주세요