응애맘마조

230905 강의 본문

공부/3D강의

230905 강의

TH.Wert 2023. 9. 5. 19:21

환경매핑을 하면서 어제 미완성이었던 큐브맵 텍스쳐를 완성했습니다.

#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);
}

정상적으로 환경 매핑이 된 모습

읽어주셔서 감사합니다.

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

230907 강의  (0) 2023.09.07
230906 강의  (0) 2023.09.06
230904 강의  (0) 2023.09.04
230901 강의  (0) 2023.09.01
230831 강의  (0) 2023.08.31