위치(world, view, projection) 각각 연산하는 것과 위치들을 곱해놓고 위치를 변환하는 ㅅ것이나 결과는 같다. 후자가 빠르다.
View의 역행렬은 변환하기 전의 결과가 나옴
Render
지금까지 이동, World,View,Projection 계산을 하나로 묶어서 관리할것이다.
Transform
이동 관련 클래스이다. 지금까지 사용했던 Position, Rotation, Scale 함수들을 다 여기로 넣어주자
Transform.cpp
#pragma once
class Transform
{
public:
Transform();
Transform(Shader* shader);
~Transform();
void Set(Transform* transform);
void SetShader(Shader* shader);
void Position(float x, float y, float z);
void Position(Vector3& vec);
void Position(Vector3* vec);
void Scale(float x, float y, float z);
void Scale(Vector3& vec);
void Scale(Vector3* vec);
void Rotation(float x, float y, float z);
void Rotation(Vector3& vec);
void Rotation(Vector3* vec);
void RotationDegree(float x, float y, float z);
void RotationDegree(Vector3& vec);
void RotationDegree(Vector3* vec);
Vector3 Forward();
Vector3 Up();
Vector3 Right();
void World(Matrix& matrix);
Matrix& World() { return bufferDesc.World; }
private:
void UpdateWorld();
public:
void Update();
void Render();
private:
struct BufferDesc
{
Matrix World;
} bufferDesc;
private:
Shader* shader;
ConstantBuffer* buffer;
ID3DX11EffectConstantBuffer* sBuffer;
Vector3 position;
Vector3 scale;
Vector3 rotation;
};
함수 설명은 생략
PerFrame
View, Peojection을 매 프레임마다 그려준다.
#pragma once
class PerFrame
{
public:
PerFrame(Shader* shader);
~PerFrame();
void Update();
void Render();
private:
struct Desc
{
Matrix View;
Matrix ViewInverse;
Matrix Projection;
Matrix VP;
Plane Culling[4];
Plane Clipping;
float Time;
float Padding[3];
} desc;
private:
Shader* shader;
ConstantBuffer* buffer;
ID3DX11EffectConstantBuffer* sBuffer;
};
desc를 따로 구조체로 묶어 사용하는데 저 중에 설명 안하는것은 뒤에 설명한다.
#include "Framework.h"
#include "PerFrame.h"
PerFrame::PerFrame(Shader * shader)
: shader(shader)
{
buffer = new ConstantBuffer(&desc, sizeof(Desc));
sBuffer = shader->AsConstantBuffer("CB_PerFrame");
}
PerFrame::~PerFrame()
{
SafeDelete(buffer);
}
void PerFrame::Update()
{
desc.Time = Time::Get()->Running();
}
void PerFrame::Render()
{
desc.View = Context::Get()->View();
D3DXMatrixInverse(&desc.ViewInverse, NULL, &desc.View);
desc.Projection = Context::Get()->Projection();
desc.VP = desc.View * desc.Projection;
buffer->Render();
sBuffer->SetConstantBuffer(buffer->Buffer());
}
현재 갖고있는 정보들을 전부 쉐이더에 넘겨준다.(쉐이더는 따로 작성 했는데 너무 많아서 생략한다. desc에 관한 구조체를 쉐이더 안에 넣어준다.) 그리고 그래준다.
D3DXMatrixInverse 이 함수는 역행렬을 구하는 함수인데 갑자기 왜 나오냐 하면, 변환하기 이 전의 View를 구하기 위해 사용했다 필요한곳은 다음에 설명하겠다.
Renderer
#pragma once
class Renderer
{
public:
Renderer(Shader* shader);
Renderer(wstring shaderFile);
virtual ~Renderer();
Shader* GetShader() { return shader; }
UINT& Pass() { return pass; }
void Pass(UINT val) { pass = val; }
virtual void Update();
virtual void Render();
Transform* GetTransform() { return transform; }
private:
void Initialize();
protected:
void Topology(D3D11_PRIMITIVE_TOPOLOGY val) { topology = val; }
protected:
Shader* shader;
Transform* transform;
VertexBuffer* vertexBuffer = NULL;
IndexBuffer* indexBuffer = NULL;
UINT vertexCount = 0;
UINT indexCount = 0;
private:
bool bCreateShader = false;
D3D11_PRIMITIVE_TOPOLOGY topology = D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST;
UINT pass = 0;
PerFrame* perFrame;
};
위에 있는 두 클래스를 갖고있는 Renderer이다. 간단하다 위에서 받은 것들로 그려주고 이동 해준다.
#include "Framework.h"
#include "Renderer.h"
Renderer::Renderer(Shader * shader)
: shader(shader)
{
Initialize();
}
Renderer::Renderer(wstring shaderFile)
: bCreateShader(true)
{
shader = new Shader(shaderFile);
Initialize();
}
void Renderer::Initialize()
{
perFrame = new PerFrame(shader);
transform = new Transform(shader);
}
Renderer::~Renderer()
{
SafeDelete(perFrame);
SafeDelete(transform);
SafeDelete(vertexBuffer);
SafeDelete(indexBuffer);
if (bCreateShader == true)
SafeDelete(shader);
}
void Renderer::Update()
{
perFrame->Update();
transform->Update();
}
void Renderer::Render()
{
if (vertexBuffer != NULL)
{
vertexBuffer->Render();
if (indexBuffer != NULL)
indexBuffer->Render();
}
D3D::GetDC()->IASetPrimitiveTopology(topology);
perFrame->Render();
transform->Render();
}
그리고 현재까지 만든 것들을 다 이것을 샂용해서 클래스를 다시 수정해주자