글의 요약 설명 부분. 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();
    }