For me
[DirectX12] 19) Deferred , Forward Rendering 본문
Forward Rendering
1개의 Frame - 여러개의 Drawcall
Drawcall은 VertexShader, Geometry Shader, Fragment Shader 순으로 연산 수행하여 최종 Frame 생성
하나의 Drawcall 계산할 때 마다 Light 연산을 수행 하여 오브젝트들의 색상을 결정
연산이 완료되면, Render Target에 업데이트
Deferred Rendering
필요한 정보들을 전부 텍스쳐에 보존하여 그려주게 됨.
Forward에서는 물체를 그릴 때 Depth , Normal, Color값이 저장되지 않지만 Deferred는 보존하고 싶은 값들을 저장하여 최종적으로 모든 정보를 합쳐 출력하는 방식을 사용한다.
아래의 사진과 같이, UI로 저장되고 있는 값들을 출력하고, 모두 합친 정보를 나타내고있다.
Deferred Shader
원하는 중간 정보를 저장하며 진행함
더보기
#ifndef _DEFAULT_FX_
#define _DEFAULT_FX_
#include "params.fx"
#include "utils.fx"
struct VS_IN
{
float3 pos : POSITION;
float2 uv : TEXCOORD;
float3 normal : NORMAL;
float3 tangent : TANGENT;
float4 weight : WEIGHT;
float4 indices : INDICES;
row_major matrix matWorld : W;
row_major matrix matWV : WV;
row_major matrix matWVP : WVP;
uint instanceID : SV_InstanceID;
};
struct VS_OUT
{
float4 pos : SV_Position;
float2 uv : TEXCOORD;
float3 viewPos : POSITION;
float3 viewNormal : NORMAL;
float3 viewTangent : TANGENT;
float3 viewBinormal : BINORMAL;
};
VS_OUT VS_Main(VS_IN input)
{
VS_OUT output = (VS_OUT)0;
if (g_int_0 == 1)
{
if (g_int_1 == 1)
Skinning(input.pos, input.normal, input.tangent, input.weight, input.indices);
output.pos = mul(float4(input.pos, 1.f), input.matWVP);
output.uv = input.uv;
output.viewPos = mul(float4(input.pos, 1.f), input.matWV).xyz;
output.viewNormal = normalize(mul(float4(input.normal, 0.f), input.matWV).xyz);
output.viewTangent = normalize(mul(float4(input.tangent, 0.f), input.matWV).xyz);
output.viewBinormal = normalize(cross(output.viewTangent, output.viewNormal));
}
else
{
if (g_int_1 == 1)
Skinning(input.pos, input.normal, input.tangent, input.weight, input.indices);
output.pos = mul(float4(input.pos, 1.f), g_matWVP);
output.uv = input.uv;
output.viewPos = mul(float4(input.pos, 1.f), g_matWV).xyz;
output.viewNormal = normalize(mul(float4(input.normal, 0.f), g_matWV).xyz);
output.viewTangent = normalize(mul(float4(input.tangent, 0.f), g_matWV).xyz);
output.viewBinormal = normalize(cross(output.viewTangent, output.viewNormal));
}
return output;
}
struct PS_OUT
{
float4 position : SV_Target0;
float4 normal : SV_Target1;
float4 color : SV_Target2;
};
PS_OUT PS_Main(VS_OUT input)
{
PS_OUT output = (PS_OUT)0;
float4 color = float4(1.f, 1.f, 1.f, 1.f);
if (g_tex_on_0 == 1)
color = g_tex_0.Sample(g_sam_0, input.uv);
float3 viewNormal = input.viewNormal;
if (g_tex_on_1 == 1)
{
// [0,255] 범위에서 [0,1]로 변환
float3 tangentSpaceNormal = g_tex_1.Sample(g_sam_0, input.uv).xyz;
// [0,1] 범위에서 [-1,1]로 변환
tangentSpaceNormal = (tangentSpaceNormal - 0.5f) * 2.f;
float3x3 matTBN = { input.viewTangent, input.viewBinormal, input.viewNormal };
viewNormal = normalize(mul(tangentSpaceNormal, matTBN));
}
output.position = float4(input.viewPos.xyz, 0.f);
output.normal = float4(viewNormal.xyz, 0.f);
output.color = color;
return output;
}
#endif
'DirectX12' 카테고리의 다른 글
[DirectX12] 21) Particle System (0) | 2023.01.19 |
---|---|
[DirectX12] 20) Compute Shader (0) | 2023.01.19 |
[DirectX12] 18) Render Target (1) | 2023.01.19 |
[DirectX12] 17) 직교투영 (0) | 2023.01.19 |
[DirectX12] 16) Quaternion (0) | 2023.01.19 |