페이지

2018년 3월 4일 일요일

ASSIMP 라이브러리를 이용한 모델데이터 불러오기 (3. 데이터 출력을 위한 HLSL코드)

 이번 게시글에서는 이전 게시글에서 불러왔던 데이터를 응용프로그램 상에서 랜더링하기 위한 셰이더 코드에 대해서 간단히 살펴보도록 하겠습니다.
(이 게시글에서는 버텍스셰이더에 대해서만 다룰 것입니다.)

 먼저 데이터를 불러오기 위한 버텍스 셰이더 구조체 모형입니다.
struct VS_MODEL_INPUT
{
    float3 pos : POSITION;
    float3 normal : NORMAL;
    float2 uv : TEXCOORD;
    uint4 index : BORNINDEX;
    float3 weight : WEIGHT;
};
cs
 순서대로 위치, 법선벡터, UV, 본 인덱스, 가중치입니다.

 우선 본 인덱스와 가중치는 애니메이션을 위한 변수입니다. 
 이에 대해서는 다음 애니메이션에 대한 게시글에서 좀 더 자세히 다루도록 하겠습니다.
(지금 예상으로는 애니메이션에 관한 게시글은 3~4개정도 될 것으로 예상하고 있습니다.)

 다이렉트 상에서 위 포맷에 맞추어 버텍스 셰이터를 컴파일하면 데이터가 정상적으로 로드될 것입니다.

 이번 구조체는 버텍스셰이더를 적절히 가공해서 픽실 셰이더로 출력할 구조체 모형입니다.
struct VS_TEXTURED_LIGHTING_OUTPUT
{
    float4 position : SV_POSITION;
    float3 positionW : POSITION;
    float3 normalW : NORMAL;
    float2 uv : TEXCOORD;
#ifdef _WITH_VERTEX_LIGHTING
    float4 color : COLOR;
#endif
};
cs
 여기까지 쓰고 보니 어떻게 설명해야 할지 어렵네요;
 (사실 셰이더에 관련된 부분은 저 말고 다른 친구가 주로 다뤘었습니다. 그냥 이런 포맷으로 출력했구나 정도만 보시는 것이 좋을 것 같습니다.)

 그리고 마지막으로 오브젝트의 위치, 재질, 뼈를 저장할 cbuffer입니다.
cbuffer cbGameObjectInfo : register(b2)
{
    matrix        gmtxGameObject;
    matrix        gBoneTransforms[96];

};
cs
 위에서부터 차례대로 오브젝트의 위치, 뼈, 재질입니다.

 위치는 게임월드 상에서의 오브젝트의 위치입니다.
 
 두번째로 뼈는 오브젝트의 애니메이션을 위한 변수입니다. 이에 대해서는 다른 게시글에서 더 자세히 다루도록 하겠습니다.
 
 이제 필요한 구조체 및 cbuffer의 소개는 끝났습니다.

 본격적으로 코드를 살펴보죠.

VS_TEXTURED_LIGHTING_OUTPUT VSModel(VS_MODEL_INPUT input)
{
    VS_TEXTURED_LIGHTING_OUTPUT output;
 
    output.positionW = (float3)mul(float4(input.pos, 1.0f), gmtxGameObject);
    //output.positionW = (float3)mul(float4(posL, 1.0f), gmtxGameObject);
    
    output.normalW = mul(input.normal, (float3x3)gmtxGameObject);
    //output.normalW = mul(normalL, (float3x3)gmtxGameObject);
    output.position = mul(mul(float4(output.positionW, 1.0f), gmtxView), gmtxProjection);
    output.uv = input.uv;
#ifdef _WITH_VERTEX_LIGHTING
    output.normalW = normalize(output.normalW);
    output.color = Lighting(output.positionW, output.normalW);
#endif
    return(output);
}
cs
 (주석친 부분은 애니메이션을 위한 부분이므로 지금은 무시하시면 됩니다.)

 사실 버텍스 셰이더 코드 자체도 그리 어렵지 않습니다.

 출력할 픽셀셰이더 구조체를 선언해주고,
 불러온 버텍스셰이더를 위한 데이터를 픽셀셰이더에 맞추어 적절히 가공해준 뒤 픽셀셰이더로 리턴해주면 완료입니다.

 여기서 적절한 가공이란 위치에 월드변환행렬, 카메라변환행렬, 투영변환행렬을 곱해주는 것을 뜻합니다.

 셰이더코드에 대해서는 이정도까지만 설명하고 마치도록 하겠습니다.

 다음 게시글부터는 불러온 모델데이터(FBX 등...)에서 애니메이션 데이터를 추출하고, 이를 자신의 응용프로그램에 적용하는 방법에 대해 설명해보려고 합니다.

댓글 1개: