응애맘마조

231013 강의 본문

공부/3D강의

231013 강의

TH.Wert 2023. 10. 13. 13:29

디퍼드 렌더링에 대해서 강의했습니다. 포워드 렌더링과는 다르게 객체마다 광원 처리를 하는 것이 아닌 모든 객체를 출력하고 광원을 사용해 한 번에 처리하는 방법으로 연산량이 줄어들어 빠르게 출력할 수 있지만 반투명은 처리할 수 없다는 단점이 있습니다.

#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일은 매주 셋째 주 월요일에 쉬는 학원에 따라 강의가 없습니다.

읽어주셔서 감사합니다.

'공부 > 3D강의' 카테고리의 다른 글

231017 강의  (0) 2023.10.17
231012 강의  (0) 2023.10.12
231011 강의  (0) 2023.10.11
231010 강의  (0) 2023.10.11
231006 강의  (1) 2023.10.06
Comments