DirectX12
[DirectX12] 15) SkyBox
GiveZero
2023. 1. 18. 14:37
Cube 또는 Sphere로 Skybox 표현
Skybox Shader
더보기
#ifndef _SKYBOX_FX_
#define _SKYBOX_FX_
#include "params.fx"
struct VS_IN
{
float3 localPos : POSITION;
float2 uv : TEXCOORD;
};
struct VS_OUT
{
float4 pos : SV_Position;
float2 uv : TEXCOORD;
};
VS_OUT VS_Main(VS_IN input)
{
VS_OUT output = (VS_OUT)0;
// Translation은 하지 않고 Rotation만 적용한다
float4 viewPos = mul(float4(input.localPos, 0), g_matView);
float4 clipSpacePos = mul(viewPos, g_matProjection);
// w/w=1이기 때문에 항상 깊이가 1로 유지된다
output.pos = clipSpacePos.xyww;
output.uv = input.uv;
return output;
}
float4 PS_Main(VS_OUT input) : SV_Target
{
float4 color = g_tex_0.Sample(g_sam_0, input.uv);
return color;
}
#endif
Resource.cpp
더보기
// Skybox
{
ShaderInfo info =
{
SHADER_TYPE::FORWARD,
RASTERIZER_TYPE::CULL_NONE,
DEPTH_STENCIL_TYPE::LESS_EQUAL
};
shared_ptr<Shader> shader = make_shared<Shader>();
shader->CreateGraphicsShader(L"..\\Resources\\Shader\\skybox.fx", info);
Add<Shader>(L"Skybox", shader);
}
SceneManager.cpp
더보기
{
shared_ptr<GameObject> skybox = make_shared<GameObject>();
skybox->AddComponent(make_shared<Transform>());
skybox->SetCheckFrustum(false);
shared_ptr<MeshRenderer> meshRenderer = make_shared<MeshRenderer>();
{
shared_ptr<Mesh> sphereMesh = GET_SINGLE(Resources)->LoadSphereMesh();
meshRenderer->SetMesh(sphereMesh);
}
{
shared_ptr<Shader> shader = GET_SINGLE(Resources)->Get<Shader>(L"Skybox");
shared_ptr<Texture> texture = GET_SINGLE(Resources)->Load<Texture>(L"skybox", L"..\\Resources\\Texture\\skybox.jpg");
shared_ptr<Material> material = make_shared<Material>();
material->SetShader(shader);
material->SetTexture(0, texture);
meshRenderer->SetMaterial(material);
}
skybox->AddComponent(meshRenderer);
scene->AddGameObject(skybox);
}