응애맘마조
231013 강의 본문
디퍼드 렌더링에 대해서 강의했습니다. 포워드 렌더링과는 다르게 객체마다 광원 처리를 하는 것이 아닌 모든 객체를 출력하고 광원을 사용해 한 번에 처리하는 방법으로 연산량이 줄어들어 빠르게 출력할 수 있지만 반투명은 처리할 수 없다는 단점이 있습니다.
#include "Common.hlsl"
struct VertexInput
{
float4 Position : POSITION0;
float2 Uv : UV0;
};
struct PixelInput
{
float4 Position : SV_POSITION;
float2 Uv : UV0;
};
PixelInput VS(VertexInput input)
{
PixelInput output;
output.Uv = input.Uv;
output.Position = mul(input.Position, World);
return output;
}
Texture2D diffuseTexture : register(t10);
Texture2D specularTexture : register(t11);
Texture2D normalTexture : register(t12);
Texture2D posTexture : register(t13);
float4 PS(PixelInput input) : SV_TARGET
{
float4 BaseColor = diffuseTexture.Sample(SamplerDefault, input.Uv);
float3 Normal = normalTexture.Sample(SamplerDefault, input.Uv).xyz;
float3 Specular = specularTexture.Sample(SamplerDefault, input.Uv).xyz;
float3 wPosition = posTexture.Sample(SamplerDefault, input.Uv).xyz;
float4 Result = float4(DirLighting(BaseColor.rgb, Specular, Normal, wPosition), BaseColor.a);
//광원 수만큼
//반복
for (int i = 0; i < lights[0].Size; i++)
{
[flatten]
if (!lights[i].isActive)
continue;
[flatten]
if (lights[i].Type == 0)
{
Result.rgb += PointLighting(BaseColor.rgb, Specular,
Normal, wPosition, i);
}
else if (lights[i].Type == 1)
{
Result.rgb += SpotLighting(BaseColor.rgb, Specular,
Normal, wPosition, i);
}
}
return Result;
}
여태까지 사용하던 것과는 다른 값들만을 사용합니다. Diffuse, Specular, Normal, Position을 사용하며 이외의 값들은 디퍼드 렌더링에서 사용되지 않고 버려집니다.
렌더링 방식만 바꿨기 때문에 따로 사진은 없습니다.
10월 16일은 매주 셋째 주 월요일에 쉬는 학원에 따라 강의가 없습니다.
읽어주셔서 감사합니다.
Comments