🎨DirectX

[DX] CubeMap 렌더링

공대 컴린이 2023. 2. 14. 10:08
728x90

📚 Cube Map Rendering

지금까지 다뤄왔던 이미지는 Texture 2D 였다. Texture 2D는 x방향, y방향이 하나만 존재하는 것을 말한다.

Texture 3D는 x픽셀과 y픽셀이 여러 장 존재하는 것을 말한다.

 

이제는 Texture Cube라는 것을 렌더링 해 볼것인데, Texture Cube는 한장인데, 박스를 펼친 모양처럼 생겼다.


DirectX의 왼손 좌표계와 함께 보면 큐브의 앞면은 +Z 방향, 뒷면은 -Z방향, 왼쪽은 -X 방향, 오른쪽은 +X방향, 윗면은 +Y방향, 아랫면은 -Y방향을 가지고 있다.

 

이처럼 한 장의 Texture에 여섯방향을 저장해놓은 Texture를 Cube Map Texture라고 한다.

(Cube Map, Cube Map Texture, Texture Cube 다 같은 말이다^-^)

💡 CubeMap.Sample

CubeMap을 출력할 때 Sample 함수를 쓰는데, 매개변수로  float3 location이 필요하다.

이말은 즉, location을 위치가 아니라 방향벡터로써 사용한다는 의미이다. 

float4에서 위치하는 w값이 0인것과 마찬가지 이기 때문에 float3 location 변수는 방향벡터로 사용된다.

 

location 변수가 방향벡터로써 어딘가를 가리키다가, Texture의 어느 부분에 방향벡터가 닿았을 때 닿은 위치의 픽셀을 가져와서 Sampling을 해준다. (=그려준다)


📄 CubeMap.fx

matrix World;
matrix View;
matrix Projection;

TextureCube CubeMap;

struct VertexInput
{
    float4 Position : Position;
    float2 Uv : Uv;
    float3 Normal : Normal;
};

struct VertexOutput
{
    float4 Position : SV_Position;
    float3 oPosition : Position1; // Original Position
    float2 Uv : Uv;
    float3 Normal : Normal;
};

VertexOutput VS(VertexInput input)
{
    VertexOutput output;

    // 방향벡터로 전달 (w = 0)
    output.oPosition = input.Position.xyz;

    output.Position = mul(input.Position, World); 
    output.Position = mul(output.Position, View);
    output.Position = mul(output.Position, Projection);

    output.Normal = mul(input.Normal, (float3x3) World);

    output.Uv = input.Uv;
    
    return output;
}

SamplerState LinearSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

float4 PS(VertexOutput input) : SV_Target
{
    return CubeMap.Sample(LinearSampler, input.oPosition);
}

RasterizerState FillMode_Wireframe
{
    FillMode = Wireframe;
};

technique11 T0
{
    pass P0
    {
        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS()));
    }

    pass P1
    {
        SetRasterizerState(FillMode_Wireframe);

        SetVertexShader(CompileShader(vs_5_0, VS()));
        SetPixelShader(CompileShader(ps_5_0, PS()));
    }
}

[ 실행결과 ]

728x90