응애맘마조
230801 강의 본문
어제의 조명을 이어서 했습니다.
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일까지는 학원의 쉬는 날로 인해 강의가 올라오지 않습니다.
읽어주셔서 감사합니다.