응애맘마조

230801 강의 본문

공부/3D강의

230801 강의

TH.Wert 2023. 8. 1. 12:59

어제의 조명을 이어서 했습니다.

cbuffer PS_DirLight : register(b2)
{
	float4 DirLight;
	float4 DirColor;
}
#define MAX_LIGHT 16
struct Light
{
    //4
	int isActive;
	int Type;
	float Inner;
	float Outer;
	//
	int Size;
	float3 Direction;
    //4
	float3 Position;
	float Range;
    //4
	float4 Color;
};
cbuffer PS_Lights : register(b3)
{
	Light lights[MAX_LIGHT];
}

hlsl로 먼저 조명을 구현할 수 있도록 했습니다.

#pragma once

struct DirLight
{
	Vector4			direction;
	Color			color;
	DirLight()
	{
		direction = Vector4(1, -1, 0, 0);
		color = Vector4(1, 1, 1, 1);
	};
};

#define MAX_LIGHT 16
class LightManager : public Singleton<LightManager>
{
	ID3D11Buffer* dirLightBuffer;
public:
	LightManager();
	~LightManager();
	DirLight			dirLight;
	void				Set();
	void                RenderDetail();
};
#include "framework.h"

LightManager::LightManager()
{
    {
        D3D11_BUFFER_DESC desc = { 0 };
        desc.ByteWidth = sizeof(DirLight);
        desc.Usage = D3D11_USAGE_DYNAMIC;
        desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER;//상수버퍼
        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
        desc.MiscFlags = 0;
        desc.StructureByteStride = 0;
        HRESULT hr = D3D->GetDevice()->CreateBuffer(&desc, NULL, &dirLightBuffer);
        assert(SUCCEEDED(hr));
        D3D->GetDC()->PSSetConstantBuffers(2, 1, &dirLightBuffer);
    }
}

LightManager::~LightManager()
{
    SafeRelease(dirLightBuffer);
}

void LightManager::Set()
{
    {
        D3D11_MAPPED_SUBRESOURCE mappedResource;
        D3D->GetDC()->Map(dirLightBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
        memcpy_s(mappedResource.pData, sizeof(DirLight), &dirLight, sizeof(DirLight));
        D3D->GetDC()->Unmap(dirLightBuffer, 0);
    }
}

void LightManager::RenderDetail()
{
    ImGui::SliderFloat3("dirLight", (float*)(&dirLight.direction), -1, 1);
    ImGui::ColorEdit3("dirColor", (float*)(&dirLight.color));
}

라이트 클래스를 따로 만들었습니다. 여기서 방향과 색상을 정할 수 있도록 했습니다. 이렇게 해서 태양빛을 받는 것 같은 조명을 만들었습니다. 만약 어두운 배경으로 만들어야 하거나 실내, 또는 공포게임을 만들 경우에 이러한 조명이 있으면 안 되는 경우도 있는데 이 경우 받는 조명의 색상을 어둡게 하면 됩니다.

float d = saturate(dot(-Light, Nor));
d = pow(d, 30.0f);
BaseColor = TextureBG.Sample(SamplerBG, input.Uv);
BaseColor.rgb += float3(d, d, d);
    
return BaseColor;

만약 조명의 세기를 조정하고 싶으면 이 값을 변경하면 됩니다. 만약 약하게 하고 싶으면 곱셈을 통해 약하게 만들고 강하게 만들고 싶으면 덧셈을 하면 됩니다.

조명의 위치에 따라 받게 되는 조명의 위치도 달라짐

8월 2일부터 6일까지는 학원의 쉬는 날로 인해 강의가 올라오지 않습니다.

읽어주셔서 감사합니다.

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

230814 강의  (0) 2023.08.14
230807 강의  (0) 2023.08.07
230731 강의  (0) 2023.07.31
230728 강의  (0) 2023.07.28
230727 강의  (0) 2023.07.27