DirectX 11 _ 2

230523 Decal (다시 공부)

슬뷔 2023. 5. 24. 02:36

오늘 할 것.

1. hlsl Decal Shader 작성

2. ResMgr에서 쉐이더랑 Mtrl 작성


 

큐브안에 있는 부위만 구분하기 위해서 이미 그려져있던 포지션?을 가져와서 구분

 

// ============================
// Decal Shader
// RS_TYPE : CULL_FRONT
// DS_TYPE : NO_TEST_NO_WRITE
// BS_TYPE : DEFAULT	 
// Domain : DOMAIN_DECAL
// ============================
pShader = new CGraphicsShader;
pShader->SetKey(L"DecalShader");
pShader->CreateVertexShader(L"shader\\decal.fx", "VS_Decal");
pShader->CreatePixelShader(L"shader\\decal.fx", "PS_Decal");
pShader->SetRSType(RS_TYPE::CULL_FRONT);
pShader->SetDSType(DS_TYPE::NO_TEST_NO_WRITE);
pShader->SetBSType(BS_TYPE::ALPHA_BLEND);
pShader->SetDomain(SHADER_DOMAIN::DOMAIN_DECAL);
AddRes(pShader->GetKey(), pShader);

resmgr 에서 shader 작성

RS_TYPE : CULL_FRONT -> 박스 내부로 들어갈때도 가정해야해서 뒷면을 그려야해서 

DS_TYPE : NO_TEST_NO_WRITE -> 테스트도 안하고 깊이도 안남겨서 큐브모양 그대로 모든 픽셀쉐이더가 다 호출되게..  

다 호출된 후 포지션 타겟값을 받아와서 내부영역에 들어오는 부분만 정상완료되게 하고 나머진 discard

BS_TYPE : DEFAULT -> 기존에 그려진 물체 위에다 덧그릴것, 색상을 입혀줄거라서..

데칼이 디퍼드에 들어가는지 포워드에 들어가는지에 따라 데칼 도메인이 달라진다.

why? 물체를 그릴 때 

지금은 forward버전의 Decal

디퍼드가 다 그려지고나서 포지션타겟이 모든 물체들이 다 기록된다 

lighting 다 그려지고나서 forward 랜더링때 

 

포워드단계때 입힌다는건 디퍼드랑 라이팅처리 다 끝나 후에[ 포워드까지 다 들어가고나서 데칼처리가 들어간다.

만약 데칼로 입히는거에 광원처리(자체발광?)을 하려고 하면 어떻게 해야하는지?

그럼 포워드때가 아닌 디퍼드때 해야됐다..

그럼 emissive에 보내서 출력을 한다.. light로 취급 

본인이 광원으로 취급 -> 디퍼드단계

광원 적용 -> 디퍼드단계

빛을 다 무시하고 색을 보여주고 싶은 경우(어두워도 원래색이 보임) -> 포워드단계  (이럴 경우는 거의 없을듯)

 

이미시브타겟일지 컬러타겟에 들어갈지로 나뉨

빛처럼 빛나고 싶으면 -> 이미시브타겟(빛으로 취급)

원래의 색상 * (원래 비춰지는 빛 + 데칼)

 

 

 

 

 

 

 

// ==========================
// Decal Shader
// RS_TYPE  : CULL_FRONT
// DS_TYPE  : NO_TEST_NO_WRITE
// BS_TYPE  : ONE_ONE

//영역안에 들어왔으면 입혀줄 텍스쳐
// g_tex_0  : Output Texture 
// 포지션값 
// g_tex_1  : Position Target
// =========================
struct VS_DECAL_IN
{
    float3 vPos : POSITION;
};

struct VS_DECAL_OUT
{
    float4 vPosition : SV_Position;
    float3 vViewPos : POSITION;
    float3 vViewNormal : NORMAL;
};

VS_DECAL_OUT VS_Decal(VS_DECAL_IN _in)
{
    VS_DECAL_OUT output = (VS_DECAL_OUT) 0.f;    
    output.vPosition = mul(float4(_in.vPos, 1.f), g_matWVP);
    return output;
}

struct PS_OUT
{
    float4 vColor : SV_Target0;   
    float4 vEmissive : SV_Target1;
};

PS_OUT PS_Decal(VS_DECAL_OUT _in)
{
    PS_OUT output = (PS_OUT) 0.f;
    
    float2 vUV = _in.vPosition.xy / g_Resolution;
    
    float3 vViewPos = g_tex_1.Sample(g_sam_0, vUV).xyz;
    //if (!any(vViewPos))
    //    discard;
    
    float3 vWorldPos = mul(float4(vViewPos, 1.f), g_matViewInv);
    float3 vLocalPos = mul(float4(vWorldPos, 1.f), g_matWorldInv);
    
    if (abs(vLocalPos.x) <= 0.5f
        && abs(vLocalPos.y) <= 0.5f
        && abs(vLocalPos.z) <= 0.5f)
    {
        if(g_btex_0)
        {
            float2 vSampleUV = float2(vLocalPos.x + 0.5f, 0.5f - vLocalPos.z);
            output.vColor = g_tex_0.Sample(g_sam_0, vSampleUV);
        }
        else
        {
            output.vColor = float4(1.f, 0.f, 0.f, 1.f);
        }
    }
    else
    {
        //output.vColor = float4(0.f, 0.f, 1.f, 1.f);
        discard;
    }   
   
    return output;
}