DirectX 11 3d

230517 Light MRT - Directional Light (다시 공부..)

슬뷔 2023. 5. 18. 02:39

Light에 랜더함수를 호출하면, Light가 무슨 타입인지에 따라서 랜더링방식이 달라진다.

why? 사용하는 매쉬와 재질이 달라지기 때문

 

Deferred 물체를 먼저 그려준 후, 빛을 입혀준다.

(먼저 물체들에 정보들이 만들어지고)

 

Directional Light 전용쉐이더 제작

// ============================
// Directional Light Shader
// RS_TYPE : CULL_NONE
// DS_TYPE : NO_TEST_NO_WRITE
// BS_TYPE : DEFAULT	 
// Domain : DOMAIN_LIGHT
// ============================

pShader = new CGraphicsShader;
pShader->SetKey(L"DirLightShader");
pShader->CreateVertexShader(L"shader\\light.fx", "VS_DirLightShader");
pShader->CreatePixelShader(L"shader\\light.fx", "PS_DirLightShader");
pShader->SetRSType(RS_TYPE::CULL_NONE);
pShader->SetDSType(DS_TYPE::NO_TEST_NO_WRITE);
pShader->SetBSType(BS_TYPE::ONE_ONE);
pShader->SetDomain(SHADER_DOMAIN::DOMAIN_LIGHT);
AddRes(pShader->GetKey(), pShader);

SetDSType(DS_TYPE::NO_TEST_NO_WRITE);

 

=> 화면 전체를 호출시키기 위해서 사각형을 화면 전체크기로 잡았지만, 면 자체가 깊이를 남기거나 하면 안된다.

깊이를 남기는게 목적이 아니라 화면 전체를 잡아주기위해 배치를 한 것이기 때문에 

 

SetBSType(BS_TYPE::ONE_ONE);

포워드랜더링은 한번에 광원을 물체기준으로 본인한테 적용될 모든 광원들을 반복문을 돌아서 계산을 끝냈다.

쉐이더 코드상에서 이미 누적된 빛의 총 량을 계산하고 있다.

이젠 물체가 그려진 후에 추가적으로 Lighting이 입혀지는 것이다.

내가 그려지고 나면 다른 빛들도 추가로 덧그려진다 (빛이 누적된다)

Lighting 하나가 하나의 광원에 대한 Lighting을 주는 것이다.

 

두번째가 출력이 될때, 기존에 이미 타겟에 출력이 되어있는 것은 앞선 광원이 먼저 출력된 것이다.

영역이 겹쳤기 때문에 내가 그 영역에 또 빛을 줘야한다면, 블랜드스테이트를 이용해서 누적해서 +a가 되어야 한다.

ex) 앞선 광원이 0.3 0.3 0.3 이고 뒤에 또 다른 광원이 0.2 0.2 0.2 라면 둘을 더해준다.

 

광원관련 쉐이더는 전부다 누적해서 더해줘야되기 때문에 브랜드스테이트를 ONE_ONE을 사용한다.

 

Directional Light 는 Light쉐이더에 전달해줘야할게 있다

Lighting처리를 하려면 이 지점에 빛을 들어갈 수 있는가를 따져야 하는데,

앞에 Deferred 물체들이 그려져 있을 때 특정 타겟에다 Deferred 물체들의 정보들을 담아놓은 타겟들을 받아와야한다.

 

빛을 받으려면, Position 타겟과 Normal 타겟이 필요하다.

(Deferred MRT가 갖고있지만 ResMgr이 관리하고 있어서 재질을 통해 전달시키면 된다)

전달할 텍스쳐가 반드시 랜더타겟으로 설정되어있어선 안된다.

출력타겟임과 동시에 쉐이더리소스로 동시에 바인드 될 수가 없다.

랜더타겟에 출력이면 출력이고, 쉐이더리소스로 텍스쳐 레지스터에 바인딩하려면 랜더타겟에 바인딩 되어있으면 안된다.

Lighting이 랜더링 하는 시점에서는 Deferred MRT 시점에 셋팅이 되어있으면 안되는데, Light MRT로 교체하고 랜더링 하는 거라 상관 없다.

 

Light Merge Shader

색상과 광원을 합치는 쉐이더!

// ========================
// Light Merge Shader
// mesh : RectMesh
// g_tex_0 : ColorTarget
// g_tex_1 : DiffuseTarget
// g_tex_2 : SpecularTarget
// ========================
VS_OUT VS_LightMerge(VS_IN _in)
{
    VS_OUT output = (VS_OUT) 0.f;
    
    output.vPosition = float4(_in.vPos.xyz * 2.f, 1.f);
    output.vUV = _in.vUV;
    
    return output;
}

float4 PS_LightMerge(VS_OUT _in) : SV_Target0
{
    float4 vOutColor = (float4) 0.f;
    
    // Position Target 
    float3 Color = g_tex_0.Sample(g_sam_0, _in.vUV).xyz;
    float3 Diffuse = g_tex_1.Sample(g_sam_0, _in.vUV).xyz;
    float3 Specular = g_tex_2.Sample(g_sam_0, _in.vUV).xyz;
    
    vOutColor.xyz = Color * Diffuse + Specular;
    vOutColor.a = 1.f;
    
    return vOutColor;
}

 

 

'DirectX 11 3d' 카테고리의 다른 글

230519 Stencil Buffer  (0) 2023.05.20
230518 Light MRT - PointLight (다시 공부)  (0) 2023.05.20
230516 Deferred Rendering - Light MRT  (0) 2023.05.17
230515 3D PointLight  (0) 2023.05.17
230512 MRT 출력 - Deferred MRT  (0) 2023.05.15