[DirectX11] 032 Renderer
글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자입니다
목차
H2 제목
WVP
out.pos = mul(in.pos.W)
out.pos = mul(out.pos, V)
out.pos = mul(out.pos, P)
in.pos->W*V*P
두 가지 WVP방법 모두 사용 가능하다.
Global.fx
00_Global.fx
더보기
cbuffer CB_PerFrame
{
matrix View;
matrix ViewInverse;//View의 역행렬
matrix Projection;
matrix VP;
float4 Culling[4];
float4 Clipping;
float Time; //게임시간
};
cbuffer CB_World
{
matrix World;
};
Texture2D DiffuseMap;
Texture2D SpecularMap;
Texture2D NormalMap;
TextureCube SkyCubeMap;
///////////////////////////////////////////////////////////////////////////////
static const float PI = 3.14159265f;
///////////////////////////////////////////////////////////////////////////////
float4 WorldPosition(float4 position)
{
return mul(position, World);
}
float4 ViewProjection(float4 position)
{
return mul(position, VP);
//position = mul(position, View);
//return mul(position, Projection);
}
float3 WorldNormal(float3 normal)
{
return mul(normal, (float3x3) World);
}
float3 WorldTangent(float3 tangent)
{
return mul(tangent, (float3x3) World);
}
float3 ViewPosition()
{
return ViewInverse._41_42_43;
}
///////////////////////////////////////////////////////////////////////////////
struct Vertex
{
float4 Position : Position;
};
struct VertexNormal
{
float4 Position : Position;
float3 Normal : Normal;
};
struct VertexColor
{
float4 Position : Position;
float4 Color : Color;
};
struct VertexColorNormal
{
float4 Position : Position;
float4 Color : Color;
float3 Normal : Normal;
};
struct VertexTexture
{
float4 Position : Position;
float2 Uv : Uv;
};
struct VertexTextureNormal
{
float4 Position : Position;
float2 Uv : Uv;
float3 Normal : Normal;
};
///////////////////////////////////////////////////////////////////////////////
SamplerState LinearSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
SamplerState PointSampler
{
Filter = MIN_MAG_MIP_POINT;
AddressU = Wrap;
AddressV = Wrap;
};
RasterizerState FrontCounterClockwise_True
{
FrontCounterClockwise = true;
};
RasterizerState FillMode_WireFrame
{
FillMode = WireFrame;
};
//RasterizerState CullMode_None
//{
// CullMode = None;
//};
DepthStencilState DepthEnable_False
{
DepthEnable = false;
};
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
// Vertex / Pixel
///////////////////////////////////////////////////////////////////////////////
#define P_VP(name, vs, ps) \
pass name \
{ \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_VP(name, rs, vs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_BS_VP(name, bs, vs, ps) \
pass name \
{ \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_VP(name, dss, vs, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_DSS_VP(name, rs, dss, vs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_BS_VP(name, rs, bs, vs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_BS_VP(name, dss, bs, vs, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
///////////////////////////////////////////////////////////////////////////////
// Vertex / Geometry / Pixel
///////////////////////////////////////////////////////////////////////////////
#define P_VGP(name, vs, gs, ps) \
pass name \
{ \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_VGP(name, rs, vs, gs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_BS_VGP(name, bs, vs, gs, ps) \
pass name \
{ \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_VGP(name, dss, vs, gs, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_DSS_VGP(name, rs, dss, vs, gs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_BS_VGP(name, rs, bs, vs, gs, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_BS_VGP(name, dss, bs, vs, gs, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetGeometryShader(CompileShader(gs_5_0, gs())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
///////////////////////////////////////////////////////////////////////////////
// Vertex / Tessellation / Pixel
///////////////////////////////////////////////////////////////////////////////
#define P_VTP(name, vs, hs, ds, ps) \
pass name \
{ \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_VTP(name, rs, vs, hs, ds, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_BS_VTP(name, bs, vs, hs, ds, ps) \
pass name \
{ \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_VTP(name, dss, vs, hs, ds, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_DSS_VTP(name, rs, dss, vs, hs, ds, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetDepthStencilState(dss, 1); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_BS_VTP(name, rs, bs, vs, hs, ds, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_DSS_BS_VTP(name, dss, bs, vs, hs, ds, ps) \
pass name \
{ \
SetDepthStencilState(dss, 1); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
#define P_RS_DSS_BS_VTP(name, rs, dss, bs, vs, hs, ds, ps) \
pass name \
{ \
SetRasterizerState(rs); \
SetDepthStencilState(dss, 1); \
SetBlendState(bs, float4(0, 0, 0, 0), 0xFF); \
SetVertexShader(CompileShader(vs_5_0, vs())); \
SetHullShader(CompileShader(hs_5_0, hs())); \
SetDomainShader(CompileShader(ds_5_0, ds())); \
SetPixelShader(CompileShader(ps_5_0, ps())); \
}
Transform
Transform.h
더보기
#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;
};
Transform.cpp
더보기
#include "Framework.h"
#include "Transform.h"
Transform::Transform()
: shader(NULL), buffer(NULL)
, position(0, 0, 0), scale(1, 1, 1), rotation(0, 0, 0)
{
D3DXMatrixIdentity(&bufferDesc.World);
}
Transform::Transform(Shader * shader)
: position(0, 0, 0), scale(1, 1, 1), rotation(0, 0, 0)
{
SetShader(shader);
D3DXMatrixIdentity(&bufferDesc.World);
}
Transform::~Transform()
{
SafeDelete(buffer);
}
void Transform::Set(Transform * transform)
{
position = transform->position;
scale = transform->scale;
rotation = transform->rotation;
UpdateWorld();
}
void Transform::SetShader(Shader* shader)
{
this->shader = shader;
buffer = new ConstantBuffer(&bufferDesc, sizeof(BufferDesc));
sBuffer = shader->AsConstantBuffer("CB_World");
}
void Transform::Position(float x, float y, float z)
{
Position(Vector3(x, y, z));
}
void Transform::Position(Vector3 & vec)
{
position = vec;
UpdateWorld();
}
void Transform::Position(Vector3 * vec)
{
*vec = position;
}
void Transform::Scale(float x, float y, float z)
{
Scale(Vector3(x, y, z));
}
void Transform::Scale(Vector3 & vec)
{
scale = vec;
UpdateWorld();
}
void Transform::Scale(Vector3 * vec)
{
*vec = scale;
}
void Transform::Rotation(float x, float y, float z)
{
Rotation(Vector3(x, y, z));
}
void Transform::Rotation(Vector3 & vec)
{
rotation = vec;
UpdateWorld();
}
void Transform::Rotation(Vector3 * vec)
{
*vec = rotation;
}
void Transform::RotationDegree(float x, float y, float z)
{
RotationDegree(Vector3(x, y, z));
}
void Transform::RotationDegree(Vector3 & vec)
{
Vector3 temp;
temp.x = Math::ToRadian(vec.x);
temp.y = Math::ToRadian(vec.y);
temp.z = Math::ToRadian(vec.z);
Rotation(temp);
}
void Transform::RotationDegree(Vector3 * vec)
{
Vector3 temp;
temp.x = Math::ToDegree(rotation.x);
temp.y = Math::ToDegree(rotation.y);
temp.z = Math::ToDegree(rotation.z);
*vec = temp;
}
Vector3 Transform::Forward()
{ //z방향
return Vector3(bufferDesc.World._31, bufferDesc.World._32, bufferDesc.World._33);
}
Vector3 Transform::Up()
{ //y방향
return Vector3(bufferDesc.World._21, bufferDesc.World._22, bufferDesc.World._23);
}
Vector3 Transform::Right()
{ //x방향
return Vector3(bufferDesc.World._11, bufferDesc.World._12, bufferDesc.World._13);
}
void Transform::World(Matrix & matrix)
{
Math::MatrixDecompose(matrix, scale, rotation, position); //엘리오트 컴포싯
bufferDesc.World = matrix;
}
void Transform::UpdateWorld()
{
Matrix S, R, T;
D3DXMatrixScaling(&S, scale.x, scale.y, scale.z);
D3DXMatrixRotationYawPitchRoll(&R, rotation.y, rotation.x, rotation.z);
D3DXMatrixTranslation(&T, position.x, position.y, position.z);
Matrix world = S * R * T;
bufferDesc.World = world;
}
void Transform::Update()
{
}
void Transform::Render()
{
if (shader == NULL)
return;
buffer->Render();
sBuffer->SetConstantBuffer(buffer->Buffer());
}
Per Frame
PerFrame.h
더보기
#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;
};
PerFrame.cpp
더보기
#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());
}
Renderer
Renderer.h
더보기
#pragma once
class Renderer
{
private:
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.cpp
더보기
#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();
}
'⭐ DirectX > DirectX11 3D' 카테고리의 다른 글
[DirectX11] 034~36 Model Editor (0) | 2023.02.01 |
---|---|
[DirectX11] 033 Framework - CubeMap, CubeSky (0) | 2023.02.01 |
[DirectX11] 031 Framework (0) | 2023.01.30 |
[DirectX11] 029~30 Cube Map, Sphere Map (0) | 2023.01.27 |
[DirectX11] 028 Mesh Sphere, Mesh Cylinder + 구면 좌표계, 원통 좌표계 (0) | 2023.01.26 |
댓글
이 글 공유하기
다른 글
-
[DirectX11] 034~36 Model Editor
[DirectX11] 034~36 Model Editor
2023.02.01 -
[DirectX11] 033 Framework - CubeMap, CubeSky
[DirectX11] 033 Framework - CubeMap, CubeSky
2023.02.01 -
[DirectX11] 031 Framework
[DirectX11] 031 Framework
2023.01.30 -
[DirectX11] 029~30 Cube Map, Sphere Map
[DirectX11] 029~30 Cube Map, Sphere Map
2023.01.27