응애맘마조
230905 강의 본문
환경매핑을 하면서 어제 미완성이었던 큐브맵 텍스쳐를 완성했습니다.
#pragma once
class Environment : public CubeRenderTarget
{
private:
static ID3D11Buffer* camBuffer;
struct GSCamBuffer
{
Matrix Views[6];
Matrix Projection;
} desc;
Viewport viewport;
public:
Vector3 position;
float fov, nearZ, farZ;
Environment(UINT width = 256, UINT height = 256);
~Environment();
shared_ptr<Texture> environment;
static void CreateStaticMember();
static void DeleteStaticMember();
virtual void ResizeScreen(float width, float height);
void RenderDetail();
void SetTarget(Color clear = Color(0, 0, 0, 1));
void SetRGBTexture(int slot);
};
#include "framework.h"
Environment::Environment(UINT width, UINT height)
: CubeRenderTarget(width, height)
{
environment = make_shared<Texture>();
viewport.width = (float)width;
viewport.height = (float)height;
fov = 90.0f * TORADIAN;
nearZ = 0.001f;
farZ = 10000.0f;
}
Environment::~Environment()
{
SafeReset(environment);
}
ID3D11Buffer* Environment::camBuffer = nullptr;
void Environment::CreateStaticMember()
{
{
D3D11_BUFFER_DESC desc = { 0 };
desc.ByteWidth = sizeof(GSCamBuffer);
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, &camBuffer);
assert(SUCCEEDED(hr));
}
}
void Environment::DeleteStaticMember()
{
SafeRelease(camBuffer);
}
void Environment::ResizeScreen(float width, float height)
{
viewport.width = (float)width;
viewport.height = (float)height;
CubeRenderTarget::ResizeScreen(width, height);
}
void Environment::RenderDetail()
{
if (ImGui::SliderFloat3("position",(float*)&position, -1000, 1000))
{
}
if (ImGui::SliderInt("TextureWidth", &width, 1, 2000))
{
ResizeScreen(width, height);
}
if (ImGui::SliderInt("TextureHeight", &height, 1, 2000))
{
ResizeScreen(width, height);
}
}
void Environment::SetTarget(Color clear)
{
//Create Views
{
float x = position.x;
float y = position.y;
float z = position.z;
struct LookAt
{
Vector3 LookAt;
Vector3 Up;
} lookAt[6];
lookAt[0] = { Vector3(x + 1.0f, y, z), Vector3(0, 1.0f, 0) };
lookAt[1] = { Vector3(x - 1.0f, y, z), Vector3(0, 1.0f, 0) };
lookAt[2] = { Vector3(x, y + 1.0f, z), Vector3(0, 0, -1.0f) };
lookAt[3] = { Vector3(x, y - 1.0f, z), Vector3(0, 0, +1.0f) };
lookAt[4] = { Vector3(x, y, z + 1.0f), Vector3(0, 1.0f, 0) };
lookAt[5] = { Vector3(x, y, z - 1.0f), Vector3(0, 1.0f, 0) };
for (UINT i = 0; i < 6; i++)
{
desc.Views[i] =
Matrix::CreateLookAt(position, lookAt[i].LookAt, lookAt[i].Up);
desc.Views[i] = desc.Views[i].Transpose();
}
}
desc.Projection =
Matrix::CreatePerspectiveFieldOfView(fov, width / height, nearZ, farZ);
desc.Projection = desc.Projection.Transpose();
D3D->GetDC()->RSSetViewports(1, viewport.Get11());
{
D3D11_MAPPED_SUBRESOURCE mappedResource;
D3D->GetDC()->Map(camBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
memcpy_s(mappedResource.pData, sizeof(GSCamBuffer), &desc, sizeof(GSCamBuffer));
D3D->GetDC()->Unmap(camBuffer, 0);
D3D->GetDC()->GSSetConstantBuffers(1, 1, &camBuffer);
}
CubeRenderTarget::SetTarget(clear);
}
void Environment::SetRGBTexture(int slot)
{
CubeRenderTarget::SetRGBTexture(slot);
}
Enviroment 클래스도 완성되었습니다. 전에 만든 스카이 클래스에서 Render를 오버로딩해서 다른 함수를 추가했습니다.
void Sky::Render(shared_ptr<Shader> shader)
{
DEPTH->Set(false);
BLEND->Set(true);
RASTER->Set(D3D11_CULL_FRONT);
texCube->Set(4);
Actor::Render(shader);
RASTER->Set(D3D11_CULL_BACK);
DEPTH->Set(true);
BLEND->Set(false);
}
읽어주셔서 감사합니다.