DirectX 11에서 Blur는 이미지를 초점이 맞지 않거나 흐릿하게 보이게 하는 시각적 효과를 말한다. 이 효과는 종종 그래픽과 게임에서 필드 깊이를 시뮬레이션하거나 이미지의 가장자리를 부드럽게 하는 데 사용된다. Blur 효과를 생성하기 위한 다양한 기법이 있으며, 가장 일반적으로 사용되는 기법 중 하나는 Gaussian Blur다.

 

목차

     

     


     

     

     

     

    Blur

     

    Gaussian blur는 가우스 함수로 이미지를 합성하여 작동하는 블러의 일종이다. 이 기능은 각 픽셀에 적용되는 흐림의 양을 결정하는 종 모양의 곡선을 가지고 있다. 픽셀이 주변 영역에 더 많은 픽셀을 가질수록 픽셀은 더 흐려진다. 가우스 블러 효과는 부드럽고 자연스럽게 보이는 흐림을 생성하기 때문에 종종 사용되며, 다양한 수준의 흐림을 달성하기 위해 다양한 수준의 강도로 적용될 수 있다.

    흐림 효과는 각 픽셀의 주변 픽셀의 색상 값을 평균하여 얻을 수 있는 반면, 가우스 흐림 효과는 이미지를 가우스 커널로 컨볼루션하여 얻을 수 있다. 흐림 정도는 컨볼루션에 사용되는 커널의 크기를 조정하여 제어할 수 있다.

     

    Shaders
       Blurt.fx 생성
     GaussianBlurBlurt.fx 생성
    Framework
      Viewer
       
    UnitTest
      PostEffects
      BlurDemo.h .cpp 생성
    GaussianBlurDemo.h .cpp 생성
    GaussianBlurDemo2.h .cpp 생성

     


     

     

    Blur.fx

     

    Blur.fx

    더보기
    #include "00_Global.fx"
    #include "00_Light.fx"
    
    float2 PixelSize;
    
    struct VertexOutput
    {
        float4 Position : SV_Position;
        float2 Uv : Uv;
    };
    
    VertexOutput VS(float4 Position : Position)
    {
        VertexOutput output;
        
        output.Position = Position;
        output.Uv.x = Position.x * 0.5f + 0.5f;
        output.Uv.y = -Position.y * 0.5f + 0.5f;
        
        return output;
    }
    
    float4 PS_Diffuse(VertexOutput input) : SV_Target
    {
        return DiffuseMap.Sample(LinearSampler, input.Uv);
    }
    
    uint BlurCount = 8;
    float4 PS_Blur(VertexOutput input) : SV_Target
    {
        float2 arr[9] =
        {
            float2(-1, -1), float2(+0, -1), float2(+1, -1),
            float2(-1, +0), float2(+0, +0), float2(+1, +0),
            float2(-1, +1), float2(+0, +1), float2(+1, +1),
        };
        
        
        float3 color = 0;
        for (uint blur = 1; blur < BlurCount; blur++)
        {
            for (int i = 0; i < 9; i++)
            {
                float x = arr[i].x * (float) blur * PixelSize.x;
                float y = arr[i].y * (float) blur * PixelSize.y;
                
                float2 uv = input.Uv + float2(x, y);
                color += DiffuseMap.Sample(LinearSampler, uv).rgb;
            }
    
        }
        
        color /= BlurCount * 9;
        
        return float4(color.rgb, 1);
    }
    
    
    uint RadialBlurCount = 8;
    float RadialBlurRadius = 0.0f;
    float RadialBlurAmount = 0.04f; //4%
    float2 RadialCenter = float2(0.5f, 0.5f);
    
    float4 PS_RadialBlur(VertexOutput input) : SV_Target
    {
        float2 radius = input.Uv - RadialCenter;
        float r = length(radius) + 1e-6f;
        radius /= r;
        
        r = 2 * r / RadialBlurRadius;
        r = saturate(r);
        
        float2 delta = radius * r * r * RadialBlurAmount / RadialBlurCount;
        delta = -delta;
        
        float4 color = 0;
        for (uint i = 0; i < RadialBlurCount; i++)
        {
            color += DiffuseMap.Sample(LinearSampler, input.Uv);
            input.Uv += delta;
        }
        color /= RadialBlurCount;
        
        return float4(color.rgb, 1);
    }
    
    technique11 T0
    {
        P_VP(P0, VS, PS_Diffuse)
        P_VP(P1, VS, PS_Blur)
        P_VP(P2, VS, PS_RadialBlur)
    }

     

     


     

     

     

    Gaussian Blur

     

    GaussianBlur.fx

    더보기
    #include "00_Global.fx"
    #include "00_Light.fx"
    
    float2 PixelSize;
    
    struct VertexOutput
    {
        float4 Position : SV_Position;
        float2 Uv : Uv;
    };
    
    VertexOutput VS(float4 Position : Position)
    {
        VertexOutput output;
        
        output.Position = Position;
        output.Uv.x = Position.x * 0.5f + 0.5f;
        output.Uv.y = -Position.y * 0.5f + 0.5f;
        
        return output;
    }
    
    float4 PS_Diffuse(VertexOutput input) : SV_Target
    {
        return DiffuseMap.Sample(LinearSampler, input.Uv);
    }
    
    const int GaussBlurCount = 6;
    static const float Weights[13] =
    {
        0.0561f, 0.1353f, 0.2780f, 0.4868f, 0.7261f, 0.9231f,
        1.0f,
        0.9231f, 0.7261f, 0.4868f, 0.2780f, 0.1353f, 0.0561f
    };
    
    float4 PS_GaussianBlurX(VertexOutput input) : SV_Target
    {
        float2 uv = input.Uv;
        float u = PixelSize.x;
        
        float sum = 0;
        float4 color = 0;
        for (int i = -GaussBlurCount; i <= GaussBlurCount; i++)
        {
            float2 temp = uv + float2(u * (float) i, 0.0f);
            color += Weights[6 + i] * DiffuseMap.Sample(LinearSampler, temp);
            
            sum += Weights[6 + i]; //총합 가중치
        }
        color /= sum; //평균을 구한다.
        
        return float4(color.rgb, 1.0f);
    }
    
    float4 PS_GaussianBlurY(VertexOutput input) : SV_Target
    {
        float2 uv = input.Uv;
        float v = PixelSize.y;
        
        float sum = 0;
        float4 color = 0;
        for (int i = -GaussBlurCount; i <= +GaussBlurCount; i++)
        {
            float2 temp = uv + float2(0.0f, v * (float) i);
            color += Weights[6 + i] * DiffuseMap.Sample(LinearSampler, temp);
            
            sum += Weights[6 + i];
        }
        color /= sum;
        
        return float4(color.rgb, 1);
    }
    
    
    struct PixelOutput_GaussianBlur2
    {
        float4 Color0 : SV_Target0;
        float4 Color1 : SV_Target1;
    };
    
    PixelOutput_GaussianBlur2 PS_GaussianBlurMrt(VertexOutput input)
    {
        PixelOutput_GaussianBlur2 output;
        
        
        float2 uv = input.Uv;
        float u = PixelSize.x;
        
        float sum = 0;
        float4 color = 0;
        for (int i = -GaussBlurCount; i <= GaussBlurCount; i++)
        {
            float2 temp = uv + float2(u * (float) i, 0.0f);
            color += Weights[6 + i] * DiffuseMap.Sample(LinearSampler, temp);
            
            sum += Weights[6 + i];
        }
        color /= sum;
        
        output.Color0 = float4(color.rgb, 1.0f);
        
        
        float v = PixelSize.y;
        
        sum = 0;
        color = 0;
        for (i = -GaussBlurCount; i <= +GaussBlurCount; i++)
        {
            float2 temp = uv + float2(0.0f, v * (float) i);
            color += Weights[6 + i] * DiffuseMap.Sample(LinearSampler, temp);
            
            sum += Weights[6 + i];
        }
        color /= sum;
        
        output.Color1 = float4(color.rgb, 1);
        
        
        return output;
    }
    
    
    Texture2D GaussianMrt[2];
    float4 PS_PS_GaussianCombined(VertexOutput input) : SV_Target
    {
        float4 color = GaussianMrt[0].Sample(LinearSampler, input.Uv);
        float4 color2 = GaussianMrt[1].Sample(LinearSampler, input.Uv);
        
        return float4((color.rgb + color2.rgb) * 0.5f, 1.0f);
    
    }
    
    technique11 T0
    {
        P_VP(P0, VS, PS_Diffuse)
        P_VP(P1, VS, PS_GaussianBlurX)
        P_VP(P2, VS, PS_GaussianBlurY)
        P_VP(P3, VS, PS_GaussianBlurMrt)
        P_VP(P4, VS, PS_PS_GaussianCombined)
    }

     

     

     

     


     

    Blur Demo

     

    BlurDemo.h

    더보기
    #pragma once
    #include "Systems/IExecute.h"
    
    class BlurDemo : public IExecute
    {
    public:
    	virtual void Initialize() override;
    	virtual void Ready() override {}
    	virtual void Destroy() override {}
    	virtual void Update() override;
    	virtual void PreRender() override;
    	virtual void Render() override;
    	virtual void PostRender() override;
    	virtual void ResizeScreen() override {}
    
    private:
    	void Billboards();
    	void Mesh();
    	void Airplane();
    	void Kachujin();
    	void KachujinCollider();
    	void KachujinWeapon();
    	void PointLighting();
    	void SpotLighting();
    
    	void Pass(UINT mesh, UINT model, UINT anim);
    
    private:
    	Shader* shader;
    
    	RenderTarget* renderTarget;
    	DepthStencil* depthStencil;
    	Viewport* viewport;
    	Render2D* render2D;
    	PostEffect* postEffect;
    
    	Billboard* billboard;
    
    	CubeSky* sky;
    
    	Material* floor;
    	Material* stone;
    	Material* brick;
    	Material* wall;
    
    	MeshRender* cube;
    	MeshRender* cylinder;
    	MeshRender* sphere;
    	MeshRender* grid;
    
    	ModelRender* airplane = NULL;
    
    
    	ModelAnimator* kachujin = NULL;
    	Transform* colliderInitTransforms;
    	ColliderObject** colliders;
    
    	ModelRender* weapon = NULL;
    	Transform* weaponInitTransform;
    
    	vector<MeshRender *> meshes;
    	vector<ModelRender *> models;
    	vector<ModelAnimator *> animators;
    };

     

     

     

    BlurDemo.cpp

    더보기
    #include "stdafx.h"
    #include "BlurDemo.h"
    
    void BlurDemo::Initialize()
    {
    	Context::Get()->GetCamera()->RotationDegree(20, 0, 0);
    	Context::Get()->GetCamera()->Position(1, 36, -85);
    	((Freedom *)Context::Get()->GetCamera())->Speed(50, 2);
    
    
    	shader = new Shader(L"96_Billboard.fxo");
    
    
    	float width = D3D::Width(), height = D3D::Height();
    	width = height = 4096;
    
    	
    	renderTarget = new RenderTarget((UINT)width, (UINT)height);
    
    	depthStencil = new DepthStencil((UINT)width, (UINT)height);
    	viewport = new Viewport(width, height);
    
    	
    	render2D = new Render2D();
    	render2D->GetTransform()->Scale(355, 200, 1);
    	render2D->GetTransform()->Position(200, 120, 0);
    	render2D->SRV(renderTarget->SRV());
    
    	postEffect = new PostEffect(L"104_Blur.fxo");
    
    
    	sky = new CubeSky(L"Environment/GrassCube1024.dds");
    	
    	Billboards();
    
    	Mesh();
    	Airplane();
    	
    	Kachujin();
    	KachujinCollider();
    	KachujinWeapon();
    
    	PointLighting();
    	SpotLighting();
    }
    
    void BlurDemo::Update()
    {
    	static UINT Pass = postEffect->GetShader()->PassCount() - 1;
    	ImGui::InputInt("Blur Pass", (int *)&Pass);
    	Pass %= postEffect->GetShader()->PassCount();
    	postEffect->Pass(Pass);
    
    
    	//Blur
    	{
    		Vector2 PixelSize = Vector2(1.0f / D3D::Width(), 1.0f / D3D::Height());
    		postEffect->GetShader()->AsVector("PixelSize")->SetFloatVector(PixelSize);
    
    		static UINT BlurCount = 8;
    		ImGui::InputInt("Blur Count", (int *)&BlurCount);
    		postEffect->GetShader()->AsScalar("BlurCount")->SetInt(BlurCount);
    	}
    
    	//RadialBlur //중심점을 기준으로 밖으로 퍼져나가는 효과
    	{
    		ImGui::Separator();
    
    		static UINT BlurCount = 8;
    		ImGui::InputInt("RadialBlurCount", (int *)&BlurCount);
    		BlurCount %= 32;
    		postEffect->GetShader()->AsScalar("RadialBlurCount")->SetInt(BlurCount);
    
    		static float Radius = 0.6f;
    		ImGui::InputFloat("RadialBlurRadius", &Radius, 0.01f);
    		postEffect->GetShader()->AsScalar("RadialBlurRadius")->SetFloat(Radius);
    
    		static float Amount = 0.04f;
    		ImGui::InputFloat("RadialBlurAmount", &Amount, 0.001f);
    		postEffect->GetShader()->AsScalar("RadialBlurAmount")->SetFloat(Amount);
    
    
    		static float CenterX = 0.5f;
    		ImGui::InputFloat("CenterX", &CenterX, 0.01f);
    
    		static float CenterY = 0.5f;
    		ImGui::InputFloat("CenterY", &CenterY, 0.01f);
    		postEffect->GetShader()->AsVector("RadialCenter")->SetFloatVector(Vector2(CenterX, CenterY));
    	}
    
    
    
    	sky->Update();
    
    	cube->Update();
    	grid->Update();
    	cylinder->Update();
    	sphere->Update();
    
    	airplane->Update();
    	kachujin->Update();
    
    	Matrix worlds[MAX_MODEL_TRANSFORMS];
    	for (UINT i = 0; i < kachujin->GetTransformCount(); i++)
    	{
    		kachujin->GetAttachTransform(i, worlds);
    		weapon->GetTransform(i)->World(weaponInitTransform->World() * worlds[40]);
    	}
    
    	weapon->UpdateTransforms();
    	weapon->Update();
    
    	billboard->Update();
    
    	render2D->Update();
    	postEffect->Update();
    }
    
    void BlurDemo::PreRender()
    {
    	renderTarget->PreRender(depthStencil);
    	viewport->RSSetViewport();
    
    
    	//Render
    	{
    		sky->Render();
    
    
    		Pass(0, 1, 2);
    
    		wall->Render();
    		sphere->Render();
    
    		brick->Render();
    		cylinder->Render();
    
    		stone->Render();
    		cube->Render();
    
    		floor->Render();
    		grid->Render();
    
    		airplane->Render();
    
    		kachujin->Render();
    		weapon->Render();
    
    		billboard->Render();
    	}
    }
    
    void BlurDemo::Render()
    {
    	
    }
    
    void BlurDemo::PostRender()
    {
    	postEffect->SRV(renderTarget->SRV());
    	postEffect->Render();
    
    	render2D->Render();
    }
    
    void BlurDemo::Billboards()
    {
    	billboard = new Billboard(shader);
    	//billboard->Pass(3);
    	billboard->Pass(4);
    	
    	billboard->AddTexture(L"Terrain/grass_14.tga");
    	billboard->AddTexture(L"Terrain/grass_07.tga");
    	billboard->AddTexture(L"Terrain/grass_11.tga");
    
    	for (UINT i = 0; i < 1200; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 0);
    	}
    
    	for (UINT i = 0; i < 300; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 1);
    	}
    
    	for (UINT i = 0; i < 700; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 2);
    	}
    }
    
    void BlurDemo::Mesh()
    {
    	//Create Material
    	{
    		floor = new Material(shader);
    		floor->DiffuseMap("Floor.png");
    		floor->Specular(1, 1, 1, 20);
    		floor->SpecularMap("Floor_Specular.png");
    		floor->NormalMap("Floor_Normal.png");
    		
    		stone = new Material(shader);
    		stone->DiffuseMap("Stones.png");
    		stone->Specular(1, 1, 1, 20);
    		stone->SpecularMap("Stones_Specular.png");
    		stone->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		stone->NormalMap("Stones_Normal.png");
    
    		
    		brick = new Material(shader);
    		brick->DiffuseMap("Bricks.png");
    		brick->Specular(1, 0.3f, 0.3f, 20);
    		brick->SpecularMap("Bricks_Specular.png");
    		brick->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		brick->NormalMap("Bricks_Normal.png");
    
    		wall = new Material(shader);
    		wall->DiffuseMap("Wall.png");
    		wall->Specular(1, 1, 1, 20);
    		wall->SpecularMap("Wall_Specular.png");
    		wall->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		wall->NormalMap("Wall_Normal.png");
    	}
    
    	//Create Mesh
    	{
    		Transform* transform = NULL;
    
    		cube = new MeshRender(shader, new MeshCube());
    		transform = cube->AddTransform();
    		transform->Position(0, 5, 0);
    		transform->Scale(20, 10, 20);
    
    		grid = new MeshRender(shader, new MeshGrid(5, 5));
    		transform = grid->AddTransform();
    		transform->Position(0, 0, 0);
    		transform->Scale(12, 1, 12);
    
    		cylinder = new MeshRender(shader, new MeshCylinder(0.5f, 3.0f, 20, 20));
    		sphere = new MeshRender(shader, new MeshSphere(0.5f, 20, 20));
    		for (UINT i = 0; i < 5; i++)
    		{
    			transform = cylinder->AddTransform();
    			transform->Position(-30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = cylinder->AddTransform();
    			transform->Position(30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    
    			transform = sphere->AddTransform();
    			transform->Position(-30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = sphere->AddTransform();
    			transform->Position(30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    		}
    	}
    
    	sphere->UpdateTransforms();
    	cylinder->UpdateTransforms();
    	cube->UpdateTransforms();
    	grid->UpdateTransforms();
    
    	meshes.push_back(sphere);
    	meshes.push_back(cylinder);
    	meshes.push_back(cube);
    	meshes.push_back(grid);
    }
    
    void BlurDemo::Airplane()
    {
    	airplane = new ModelRender(shader);
    	airplane->ReadMesh(L"B787/Airplane");
    	airplane->ReadMaterial(L"B787/Airplane");
    
    	Transform* transform = airplane->AddTransform();
    	transform->Position(2.0f, 9.91f, 2.0f);
    	transform->Scale(0.004f, 0.004f, 0.004f);
    	airplane->UpdateTransforms();
    
    	models.push_back(airplane);
    }
    
    void BlurDemo::Kachujin()
    {
    	kachujin = new ModelAnimator(shader);
    	kachujin->ReadMesh(L"Kachujin/Mesh");
    	kachujin->ReadMaterial(L"Kachujin/Mesh");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Idle");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Walk");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Run");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Slash");
    	kachujin->ReadClip(L"Kachujin/Salsa Dancing");
    
    
    	Transform* transform = NULL;
    
    	transform = kachujin->AddTransform();
    	transform->Position(0, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(0, 0, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(1, 1, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-30, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(2, 2, 0.75f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayBlendMode(3, 0, 1, 2);
    	kachujin->SetBlendAlpha(3, 1.5f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(30, 0, -32.5f);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(4, 4, 0.75f);
    
    	kachujin->UpdateTransforms();
    
    	animators.push_back(kachujin);
    }
    
    void BlurDemo::KachujinCollider()
    {
    	UINT count = kachujin->GetTransformCount();
    	colliders = new  ColliderObject*[count];
    
    	colliderInitTransforms = new Transform();
    	colliderInitTransforms->Position(-2.9f, 1.45f, -50.0f);
    	colliderInitTransforms->Scale(5, 5, 75);
    
    	for (UINT i = 0; i < count; i++)
    	{
    		colliders[i] = new ColliderObject();
    
    		//colliders[i]->Init = new Transform();
    		//colliders[i]->Init->Position(0, 0, 0);
    		//colliders[i]->Init->Scale(10, 30, 10);
    
    		colliders[i]->Transform = new Transform();
    		//colliders[i]->Collider = new Collider(colliders[i]->Transform, colliders[i]->Init);
    		colliders[i]->Collider = new Collider(colliders[i]->Transform, colliderInitTransforms);
    	}
    }
    
    void BlurDemo::KachujinWeapon()
    {
    	weapon = new ModelRender(shader);
    	weapon->ReadMesh(L"Weapon/Sword");
    	weapon->ReadMaterial(L"Weapon/Sword");
    
    	UINT count = kachujin->GetTransformCount();
    	for (UINT i = 0; i < count; i++)
    		weapon->AddTransform();
    
    	weapon->UpdateTransforms();
    	models.push_back(weapon);
    
    	
    	weaponInitTransform = new Transform();
    	weaponInitTransform->Position(-2.9f, 1.45f, -6.45f);
    	weaponInitTransform->Scale(0.5f, 0.5f, 0.75f);
    	weaponInitTransform->Rotation(0, 0, 1);
    }
    
    void BlurDemo::PointLighting()
    {
    	PointLight light;
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 0.0f, 1.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Specular
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Emissive
    		Vector3(-30, 10, -30), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(1.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.6f, 0.2f, 0.0f, 1.0f),
    		Color(0.6f, 0.3f, 0.0f, 1.0f),
    		Vector3(15, 10, -30), 10.0f, 0.3f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 1.0f, 0.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Specular
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Emissive
    		Vector3(-5, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.0f, 0.0f, 1.0f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Vector3(-10, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    }
    
    void BlurDemo::SpotLighting()
    {
    	SpotLight light;
    	light =
    	{
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.7f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Vector3(-15, 20, -30), 25.0f,
    		Vector3(0, -1, 0), 30.0f, 0.4f
    	};
    	Lighting::Get()->AddSpotLight(light);
    
    	light =
    	{
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Vector3(0, 20, -30), 30.0f,
    		Vector3(0, -1, 0), 40.0f, 0.55f
    	};
    	Lighting::Get()->AddSpotLight(light);
    }
    
    void BlurDemo::Pass(UINT mesh, UINT model, UINT anim)
    {
    	for (MeshRender* temp : meshes)
    		temp->Pass(mesh);
    
    	for (ModelRender* temp : models)
    		temp->Pass(model);
    
    	for (ModelAnimator* temp : animators)
    		temp->Pass(anim);
    }

     


     

     

    Gaussian Blur Demo

     

    GaussianBlurDemo.h

    더보기
    #pragma once
    #include "Systems/IExecute.h"
    
    class GaussianBlurDemo : public IExecute
    {
    public:
    	virtual void Initialize() override;
    	virtual void Ready() override {}
    	virtual void Destroy() override {}
    	virtual void Update() override;
    	virtual void PreRender() override;
    	virtual void Render() override;
    	virtual void PostRender() override;
    	virtual void ResizeScreen() override {}
    
    private:
    	void Billboards();
    	void Mesh();
    	void Airplane();
    	void Kachujin();
    	void KachujinCollider();
    	void KachujinWeapon();
    	void PointLighting();
    	void SpotLighting();
    
    	void Pass(UINT mesh, UINT model, UINT anim);
    
    private:
    	Shader* shader;
    
    	RenderTarget* renderTarget[3];
    	DepthStencil* depthStencil;
    	Viewport* viewport;
    	Render2D* render2D;
    	PostEffect* postEffect;
    
    	Billboard* billboard;
    
    	CubeSky* sky;
    
    	Material* floor;
    	Material* stone;
    	Material* brick;
    	Material* wall;
    
    	MeshRender* cube;
    	MeshRender* cylinder;
    	MeshRender* sphere;
    	MeshRender* grid;
    
    	ModelRender* airplane = NULL;
    
    
    	ModelAnimator* kachujin = NULL;
    	Transform* colliderInitTransforms;
    	ColliderObject** colliders;
    
    	ModelRender* weapon = NULL;
    	Transform* weaponInitTransform;
    
    	vector<MeshRender *> meshes;
    	vector<ModelRender *> models;
    	vector<ModelAnimator *> animators;
    };

    BlurDemo.h와 동일

     

     

    GaussianBlurDemo.cpp

    더보기
    #include "stdafx.h"
    #include "GaussianBlurDemo.h"
    
    void GaussianBlurDemo::Initialize()
    {
    	Context::Get()->GetCamera()->RotationDegree(20, 0, 0);
    	Context::Get()->GetCamera()->Position(1, 36, -85);
    	((Freedom *)Context::Get()->GetCamera())->Speed(50, 2);
    
    
    	shader = new Shader(L"96_Billboard.fxo");
    
    
    	float width = D3D::Width(), height = D3D::Height();
    	width = height = 4096;
    
    	
    	renderTarget[0] = new RenderTarget((UINT)width, (UINT)height);
    	renderTarget[1] = new RenderTarget((UINT)width, (UINT)height);
    	renderTarget[2] = new RenderTarget((UINT)width, (UINT)height);
    
    	depthStencil = new DepthStencil((UINT)width, (UINT)height);
    	viewport = new Viewport(width, height);
    
    	
    	render2D = new Render2D();
    	render2D->GetTransform()->Scale(355, 200, 1);
    	render2D->GetTransform()->Position(200, 120, 0);
    	render2D->SRV(renderTarget[0]->SRV());
    
    	postEffect = new PostEffect(L"104_GaussianBlur.fxo");
    
    
    	sky = new CubeSky(L"Environment/GrassCube1024.dds");
    	
    	Billboards();
    
    	Mesh();
    	Airplane();
    	
    	Kachujin();
    	KachujinCollider();
    	KachujinWeapon();
    
    	PointLighting();
    	SpotLighting();
    }
    
    void GaussianBlurDemo::Update()
    {
    	sky->Update();
    
    	cube->Update();
    	grid->Update();
    	cylinder->Update();
    	sphere->Update();
    
    	airplane->Update();
    	kachujin->Update();
    
    	Matrix worlds[MAX_MODEL_TRANSFORMS];
    	for (UINT i = 0; i < kachujin->GetTransformCount(); i++)
    	{
    		kachujin->GetAttachTransform(i, worlds);
    		weapon->GetTransform(i)->World(weaponInitTransform->World() * worlds[40]);
    	}
    
    	weapon->UpdateTransforms();
    	weapon->Update();
    
    	billboard->Update();
    
    	render2D->Update();
    	postEffect->Update();
    }
    
    void GaussianBlurDemo::PreRender()
    {
    	renderTarget[0]->PreRender(depthStencil);
    	viewport->RSSetViewport();
    
    
    	//Render
    	{
    		sky->Render();
    
    
    		Pass(0, 1, 2);
    
    		wall->Render();
    		sphere->Render();
    
    		brick->Render();
    		cylinder->Render();
    
    		stone->Render();
    		cube->Render();
    
    		floor->Render();
    		grid->Render();
    
    		airplane->Render();
    
    		kachujin->Render();
    		weapon->Render();
    
    		billboard->Render();
    	}
    
    
    	Vector2 PixelSize = Vector2(1.0f / D3D::Width(), 1.0f / D3D::Height());
    	postEffect->GetShader()->AsVector("PixelSize")->SetFloatVector(PixelSize);
    
    	//GuassianBlurX
    	{
    		renderTarget[1]->PreRender(depthStencil);
    
    		postEffect->Pass(1);
    		postEffect->SRV(renderTarget[0]->SRV());
    		postEffect->Render();
    	}
    	
    	//GuassianBlurY
    	{
    		renderTarget[2]->PreRender(depthStencil);
    
    		postEffect->Pass(2);
    		postEffect->SRV(renderTarget[1]->SRV());
    		postEffect->Render();
    	}
    }
    
    void GaussianBlurDemo::Render()
    {
    	
    }
    
    void GaussianBlurDemo::PostRender()
    {
    	postEffect->Pass(0);
    	postEffect->SRV(renderTarget[2]->SRV());
    	postEffect->Render();
    
    	render2D->Render();
    }
    
    void GaussianBlurDemo::Billboards()
    {
    	billboard = new Billboard(shader);
    	//billboard->Pass(3);
    	billboard->Pass(4);
    	
    	billboard->AddTexture(L"Terrain/grass_14.tga");
    	billboard->AddTexture(L"Terrain/grass_07.tga");
    	billboard->AddTexture(L"Terrain/grass_11.tga");
    
    	for (UINT i = 0; i < 1200; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 0);
    	}
    
    	for (UINT i = 0; i < 300; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 1);
    	}
    
    	for (UINT i = 0; i < 700; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 2);
    	}
    }
    
    void GaussianBlurDemo::Mesh()
    {
    	//Create Material
    	{
    		floor = new Material(shader);
    		floor->DiffuseMap("Floor.png");
    		floor->Specular(1, 1, 1, 20);
    		floor->SpecularMap("Floor_Specular.png");
    		floor->NormalMap("Floor_Normal.png");
    		
    		stone = new Material(shader);
    		stone->DiffuseMap("Stones.png");
    		stone->Specular(1, 1, 1, 20);
    		stone->SpecularMap("Stones_Specular.png");
    		stone->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		stone->NormalMap("Stones_Normal.png");
    
    		
    		brick = new Material(shader);
    		brick->DiffuseMap("Bricks.png");
    		brick->Specular(1, 0.3f, 0.3f, 20);
    		brick->SpecularMap("Bricks_Specular.png");
    		brick->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		brick->NormalMap("Bricks_Normal.png");
    
    		wall = new Material(shader);
    		wall->DiffuseMap("Wall.png");
    		wall->Specular(1, 1, 1, 20);
    		wall->SpecularMap("Wall_Specular.png");
    		wall->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		wall->NormalMap("Wall_Normal.png");
    	}
    
    	//Create Mesh
    	{
    		Transform* transform = NULL;
    
    		cube = new MeshRender(shader, new MeshCube());
    		transform = cube->AddTransform();
    		transform->Position(0, 5, 0);
    		transform->Scale(20, 10, 20);
    
    		grid = new MeshRender(shader, new MeshGrid(5, 5));
    		transform = grid->AddTransform();
    		transform->Position(0, 0, 0);
    		transform->Scale(12, 1, 12);
    
    		cylinder = new MeshRender(shader, new MeshCylinder(0.5f, 3.0f, 20, 20));
    		sphere = new MeshRender(shader, new MeshSphere(0.5f, 20, 20));
    		for (UINT i = 0; i < 5; i++)
    		{
    			transform = cylinder->AddTransform();
    			transform->Position(-30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = cylinder->AddTransform();
    			transform->Position(30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    
    			transform = sphere->AddTransform();
    			transform->Position(-30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = sphere->AddTransform();
    			transform->Position(30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    		}
    	}
    
    	sphere->UpdateTransforms();
    	cylinder->UpdateTransforms();
    	cube->UpdateTransforms();
    	grid->UpdateTransforms();
    
    	meshes.push_back(sphere);
    	meshes.push_back(cylinder);
    	meshes.push_back(cube);
    	meshes.push_back(grid);
    }
    
    void GaussianBlurDemo::Airplane()
    {
    	airplane = new ModelRender(shader);
    	airplane->ReadMesh(L"B787/Airplane");
    	airplane->ReadMaterial(L"B787/Airplane");
    
    	Transform* transform = airplane->AddTransform();
    	transform->Position(2.0f, 9.91f, 2.0f);
    	transform->Scale(0.004f, 0.004f, 0.004f);
    	airplane->UpdateTransforms();
    
    	models.push_back(airplane);
    }
    
    void GaussianBlurDemo::Kachujin()
    {
    	kachujin = new ModelAnimator(shader);
    	kachujin->ReadMesh(L"Kachujin/Mesh");
    	kachujin->ReadMaterial(L"Kachujin/Mesh");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Idle");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Walk");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Run");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Slash");
    	kachujin->ReadClip(L"Kachujin/Salsa Dancing");
    
    
    	Transform* transform = NULL;
    
    	transform = kachujin->AddTransform();
    	transform->Position(0, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(0, 0, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(1, 1, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-30, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(2, 2, 0.75f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayBlendMode(3, 0, 1, 2);
    	kachujin->SetBlendAlpha(3, 1.5f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(30, 0, -32.5f);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(4, 4, 0.75f);
    
    	kachujin->UpdateTransforms();
    
    	animators.push_back(kachujin);
    }
    
    void GaussianBlurDemo::KachujinCollider()
    {
    	UINT count = kachujin->GetTransformCount();
    	colliders = new  ColliderObject*[count];
    
    	colliderInitTransforms = new Transform();
    	colliderInitTransforms->Position(-2.9f, 1.45f, -50.0f);
    	colliderInitTransforms->Scale(5, 5, 75);
    
    	for (UINT i = 0; i < count; i++)
    	{
    		colliders[i] = new ColliderObject();
    
    		//colliders[i]->Init = new Transform();
    		//colliders[i]->Init->Position(0, 0, 0);
    		//colliders[i]->Init->Scale(10, 30, 10);
    
    		colliders[i]->Transform = new Transform();
    		//colliders[i]->Collider = new Collider(colliders[i]->Transform, colliders[i]->Init);
    		colliders[i]->Collider = new Collider(colliders[i]->Transform, colliderInitTransforms);
    	}
    }
    
    void GaussianBlurDemo::KachujinWeapon()
    {
    	weapon = new ModelRender(shader);
    	weapon->ReadMesh(L"Weapon/Sword");
    	weapon->ReadMaterial(L"Weapon/Sword");
    
    	UINT count = kachujin->GetTransformCount();
    	for (UINT i = 0; i < count; i++)
    		weapon->AddTransform();
    
    	weapon->UpdateTransforms();
    	models.push_back(weapon);
    
    	
    	weaponInitTransform = new Transform();
    	weaponInitTransform->Position(-2.9f, 1.45f, -6.45f);
    	weaponInitTransform->Scale(0.5f, 0.5f, 0.75f);
    	weaponInitTransform->Rotation(0, 0, 1);
    }
    
    void GaussianBlurDemo::PointLighting()
    {
    	PointLight light;
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 0.0f, 1.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Specular
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Emissive
    		Vector3(-30, 10, -30), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(1.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.6f, 0.2f, 0.0f, 1.0f),
    		Color(0.6f, 0.3f, 0.0f, 1.0f),
    		Vector3(15, 10, -30), 10.0f, 0.3f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 1.0f, 0.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Specular
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Emissive
    		Vector3(-5, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.0f, 0.0f, 1.0f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Vector3(-10, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    }
    
    void GaussianBlurDemo::SpotLighting()
    {
    	SpotLight light;
    	light =
    	{
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.7f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Vector3(-15, 20, -30), 25.0f,
    		Vector3(0, -1, 0), 30.0f, 0.4f
    	};
    	Lighting::Get()->AddSpotLight(light);
    
    	light =
    	{
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Vector3(0, 20, -30), 30.0f,
    		Vector3(0, -1, 0), 40.0f, 0.55f
    	};
    	Lighting::Get()->AddSpotLight(light);
    }
    
    void GaussianBlurDemo::Pass(UINT mesh, UINT model, UINT anim)
    {
    	for (MeshRender* temp : meshes)
    		temp->Pass(mesh);
    
    	for (ModelRender* temp : models)
    		temp->Pass(model);
    
    	for (ModelAnimator* temp : animators)
    		temp->Pass(anim);
    }

     

     


     

     

    Gaussian Blur Demo2

     

    GaussianBlurDemo2.h

    더보기
    #pragma once
    #include "Systems/IExecute.h"
    
    class GaussianBlurDemo : public IExecute
    {
    public:
    	virtual void Initialize() override;
    	virtual void Ready() override {}
    	virtual void Destroy() override {}
    	virtual void Update() override;
    	virtual void PreRender() override;
    	virtual void Render() override;
    	virtual void PostRender() override;
    	virtual void ResizeScreen() override {}
    
    private:
    	void Billboards();
    	void Mesh();
    	void Airplane();
    	void Kachujin();
    	void KachujinCollider();
    	void KachujinWeapon();
    	void PointLighting();
    	void SpotLighting();
    
    	void Pass(UINT mesh, UINT model, UINT anim);
    
    private:
    	Shader* shader;
    
    	RenderTarget* renderTarget[3];
    	DepthStencil* depthStencil;
    	Viewport* viewport;
    	Render2D* render2D;
    	PostEffect* postEffect;
    
    	Billboard* billboard;
    
    	CubeSky* sky;
    
    	Material* floor;
    	Material* stone;
    	Material* brick;
    	Material* wall;
    
    	MeshRender* cube;
    	MeshRender* cylinder;
    	MeshRender* sphere;
    	MeshRender* grid;
    
    	ModelRender* airplane = NULL;
    
    
    	ModelAnimator* kachujin = NULL;
    	Transform* colliderInitTransforms;
    	ColliderObject** colliders;
    
    	ModelRender* weapon = NULL;
    	Transform* weaponInitTransform;
    
    	vector<MeshRender *> meshes;
    	vector<ModelRender *> models;
    	vector<ModelAnimator *> animators;
    };

    BlurDemo.h와 동일

     

     

    GaussianBlurDemo2.cpp

    더보기
    #include "stdafx.h"
    #include "GaussianBlurDemo2.h"
    
    void GaussianBlurDemo2::Initialize()
    {
    	Context::Get()->GetCamera()->RotationDegree(20, 0, 0);
    	Context::Get()->GetCamera()->Position(1, 36, -85);
    	((Freedom *)Context::Get()->GetCamera())->Speed(50, 2);
    
    
    	shader = new Shader(L"96_Billboard.fxo");
    
    
    	float width = D3D::Width(), height = D3D::Height();
    	width = height = 4096;
    
    	
    	renderTarget[0] = new RenderTarget((UINT)width, (UINT)height);
    	renderTarget[1] = new RenderTarget((UINT)width, (UINT)height);
    	renderTarget[2] = new RenderTarget((UINT)width, (UINT)height);
    
    	depthStencil = new DepthStencil((UINT)width, (UINT)height);
    	viewport = new Viewport(width, height);
    
    	
    	render2D = new Render2D();
    	render2D->GetTransform()->Scale(355, 200, 1);
    	render2D->GetTransform()->Position(200, 120, 0);
    	render2D->SRV(renderTarget[0]->SRV());
    
    	postEffect = new PostEffect(L"104_GaussianBlur.fxo");
    
    
    	sky = new CubeSky(L"Environment/GrassCube1024.dds");
    	
    	Billboards();
    
    	Mesh();
    	Airplane();
    	
    	Kachujin();
    	KachujinCollider();
    	KachujinWeapon();
    
    	PointLighting();
    	SpotLighting();
    }
    
    void GaussianBlurDemo2::Update()
    {
    	sky->Update();
    
    	cube->Update();
    	grid->Update();
    	cylinder->Update();
    	sphere->Update();
    
    	airplane->Update();
    	kachujin->Update();
    
    	Matrix worlds[MAX_MODEL_TRANSFORMS];
    	for (UINT i = 0; i < kachujin->GetTransformCount(); i++)
    	{
    		kachujin->GetAttachTransform(i, worlds);
    		weapon->GetTransform(i)->World(weaponInitTransform->World() * worlds[40]);
    	}
    
    	weapon->UpdateTransforms();
    	weapon->Update();
    
    	billboard->Update();
    
    	render2D->Update();
    	postEffect->Update();
    }
    
    void GaussianBlurDemo2::PreRender()
    {
    	renderTarget[0]->PreRender(depthStencil);
    	viewport->RSSetViewport();
    
    
    	//Render
    	{
    		sky->Render();
    
    
    		Pass(0, 1, 2);
    
    		wall->Render();
    		sphere->Render();
    
    		brick->Render();
    		cylinder->Render();
    
    		stone->Render();
    		cube->Render();
    
    		floor->Render();
    		grid->Render();
    
    		airplane->Render();
    
    		kachujin->Render();
    		weapon->Render();
    
    		billboard->Render();
    	}
    
    
    	Vector2 PixelSize = Vector2(1.0f / D3D::Width(), 1.0f / D3D::Height());
    	postEffect->GetShader()->AsVector("PixelSize")->SetFloatVector(PixelSize);
    
    
    	//MRT
    	{
    		RenderTarget* temp[2];
    		temp[0] = renderTarget[1];
    		temp[1] = renderTarget[2];
    
    		RenderTarget::PreRender(temp, 2, depthStencil);
    
    
    		postEffect->Pass(3);
    		postEffect->SRV(renderTarget[0]->SRV());
    		postEffect->Render();
    	}
    	
    	//Combined
    	{
    		renderTarget[0]->PreRender(depthStencil);
    
    		ID3D11ShaderResourceView* srvs[2];
    		srvs[0] = renderTarget[1]->SRV();
    		srvs[1] = renderTarget[2]->SRV();
    
    		postEffect->Pass(4);
    		postEffect->GetShader()->AsSRV("GaussianMrt")->SetResourceArray(srvs, 0, 2);
    		postEffect->Render();
    	}
    }
    
    void GaussianBlurDemo2::Render()
    {
    	
    }
    
    void GaussianBlurDemo2::PostRender()
    {
    	postEffect->Pass(0);
    	postEffect->SRV(renderTarget[0]->SRV());
    	postEffect->Render();
    
    	render2D->Render();
    }
    
    void GaussianBlurDemo2::Billboards()
    {
    	billboard = new Billboard(shader);
    	//billboard->Pass(3);
    	billboard->Pass(4);
    	
    	billboard->AddTexture(L"Terrain/grass_14.tga");
    	billboard->AddTexture(L"Terrain/grass_07.tga");
    	billboard->AddTexture(L"Terrain/grass_11.tga");
    
    	for (UINT i = 0; i < 1200; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 0);
    	}
    
    	for (UINT i = 0; i < 300; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 1);
    	}
    
    	for (UINT i = 0; i < 700; i++)
    	{
    		Vector2 scale = Math::RandomVec2(1, 3);
    		Vector2 position = Math::RandomVec2(-60, 60);
    
    		billboard->Add(Vector3(position.x, scale.y * 0.5f, position.y), scale, 2);
    	}
    }
    
    void GaussianBlurDemo2::Mesh()
    {
    	//Create Material
    	{
    		floor = new Material(shader);
    		floor->DiffuseMap("Floor.png");
    		floor->Specular(1, 1, 1, 20);
    		floor->SpecularMap("Floor_Specular.png");
    		floor->NormalMap("Floor_Normal.png");
    		
    		stone = new Material(shader);
    		stone->DiffuseMap("Stones.png");
    		stone->Specular(1, 1, 1, 20);
    		stone->SpecularMap("Stones_Specular.png");
    		stone->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		stone->NormalMap("Stones_Normal.png");
    
    		
    		brick = new Material(shader);
    		brick->DiffuseMap("Bricks.png");
    		brick->Specular(1, 0.3f, 0.3f, 20);
    		brick->SpecularMap("Bricks_Specular.png");
    		brick->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		brick->NormalMap("Bricks_Normal.png");
    
    		wall = new Material(shader);
    		wall->DiffuseMap("Wall.png");
    		wall->Specular(1, 1, 1, 20);
    		wall->SpecularMap("Wall_Specular.png");
    		wall->Emissive(0.15f, 0.15f, 0.15f, 0.3f);
    		wall->NormalMap("Wall_Normal.png");
    	}
    
    	//Create Mesh
    	{
    		Transform* transform = NULL;
    
    		cube = new MeshRender(shader, new MeshCube());
    		transform = cube->AddTransform();
    		transform->Position(0, 5, 0);
    		transform->Scale(20, 10, 20);
    
    		grid = new MeshRender(shader, new MeshGrid(5, 5));
    		transform = grid->AddTransform();
    		transform->Position(0, 0, 0);
    		transform->Scale(12, 1, 12);
    
    		cylinder = new MeshRender(shader, new MeshCylinder(0.5f, 3.0f, 20, 20));
    		sphere = new MeshRender(shader, new MeshSphere(0.5f, 20, 20));
    		for (UINT i = 0; i < 5; i++)
    		{
    			transform = cylinder->AddTransform();
    			transform->Position(-30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = cylinder->AddTransform();
    			transform->Position(30, 6, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    
    			transform = sphere->AddTransform();
    			transform->Position(-30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    
    			transform = sphere->AddTransform();
    			transform->Position(30, 15.5f, -15.0f + (float)i * 15.0f);
    			transform->Scale(5, 5, 5);
    		}
    	}
    
    	sphere->UpdateTransforms();
    	cylinder->UpdateTransforms();
    	cube->UpdateTransforms();
    	grid->UpdateTransforms();
    
    	meshes.push_back(sphere);
    	meshes.push_back(cylinder);
    	meshes.push_back(cube);
    	meshes.push_back(grid);
    }
    
    void GaussianBlurDemo2::Airplane()
    {
    	airplane = new ModelRender(shader);
    	airplane->ReadMesh(L"B787/Airplane");
    	airplane->ReadMaterial(L"B787/Airplane");
    
    	Transform* transform = airplane->AddTransform();
    	transform->Position(2.0f, 9.91f, 2.0f);
    	transform->Scale(0.004f, 0.004f, 0.004f);
    	airplane->UpdateTransforms();
    
    	models.push_back(airplane);
    }
    
    void GaussianBlurDemo2::Kachujin()
    {
    	kachujin = new ModelAnimator(shader);
    	kachujin->ReadMesh(L"Kachujin/Mesh");
    	kachujin->ReadMaterial(L"Kachujin/Mesh");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Idle");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Walk");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Run");
    	kachujin->ReadClip(L"Kachujin/Sword And Shield Slash");
    	kachujin->ReadClip(L"Kachujin/Salsa Dancing");
    
    
    	Transform* transform = NULL;
    
    	transform = kachujin->AddTransform();
    	transform->Position(0, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(0, 0, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(1, 1, 1.0f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(-30, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(2, 2, 0.75f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(15, 0, -30);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayBlendMode(3, 0, 1, 2);
    	kachujin->SetBlendAlpha(3, 1.5f);
    
    	transform = kachujin->AddTransform();
    	transform->Position(30, 0, -32.5f);
    	transform->Scale(0.075f, 0.075f, 0.075f);
    	kachujin->PlayTweenMode(4, 4, 0.75f);
    
    	kachujin->UpdateTransforms();
    
    	animators.push_back(kachujin);
    }
    
    void GaussianBlurDemo2::KachujinCollider()
    {
    	UINT count = kachujin->GetTransformCount();
    	colliders = new  ColliderObject*[count];
    
    	colliderInitTransforms = new Transform();
    	colliderInitTransforms->Position(-2.9f, 1.45f, -50.0f);
    	colliderInitTransforms->Scale(5, 5, 75);
    
    	for (UINT i = 0; i < count; i++)
    	{
    		colliders[i] = new ColliderObject();
    
    		//colliders[i]->Init = new Transform();
    		//colliders[i]->Init->Position(0, 0, 0);
    		//colliders[i]->Init->Scale(10, 30, 10);
    
    		colliders[i]->Transform = new Transform();
    		//colliders[i]->Collider = new Collider(colliders[i]->Transform, colliders[i]->Init);
    		colliders[i]->Collider = new Collider(colliders[i]->Transform, colliderInitTransforms);
    	}
    }
    
    void GaussianBlurDemo2::KachujinWeapon()
    {
    	weapon = new ModelRender(shader);
    	weapon->ReadMesh(L"Weapon/Sword");
    	weapon->ReadMaterial(L"Weapon/Sword");
    
    	UINT count = kachujin->GetTransformCount();
    	for (UINT i = 0; i < count; i++)
    		weapon->AddTransform();
    
    	weapon->UpdateTransforms();
    	models.push_back(weapon);
    
    	
    	weaponInitTransform = new Transform();
    	weaponInitTransform->Position(-2.9f, 1.45f, -6.45f);
    	weaponInitTransform->Scale(0.5f, 0.5f, 0.75f);
    	weaponInitTransform->Rotation(0, 0, 1);
    }
    
    void GaussianBlurDemo2::PointLighting()
    {
    	PointLight light;
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 0.0f, 1.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Specular
    		Color(0.0f, 0.0f, 0.7f, 1.0f), //Emissive
    		Vector3(-30, 10, -30), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(1.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.6f, 0.2f, 0.0f, 1.0f),
    		Color(0.6f, 0.3f, 0.0f, 1.0f),
    		Vector3(15, 10, -30), 10.0f, 0.3f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f), //Ambient
    		Color(0.0f, 1.0f, 0.0f, 1.0f), //Diffuse
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Specular
    		Color(0.0f, 0.7f, 0.0f, 1.0f), //Emissive
    		Vector3(-5, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    
    	light =
    	{
    		Color(0.0f, 0.0f, 0.0f, 1.0f),
    		Color(0.0f, 0.0f, 1.0f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Color(0.0f, 0.0f, 0.7f, 1.0f),
    		Vector3(-10, 1, -17.5f), 5.0f, 0.9f
    	};
    	Lighting::Get()->AddPointLight(light);
    }
    
    void GaussianBlurDemo2::SpotLighting()
    {
    	SpotLight light;
    	light =
    	{
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.7f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Color(0.3f, 1.0f, 0.0f, 1.0f),
    		Vector3(-15, 20, -30), 25.0f,
    		Vector3(0, -1, 0), 30.0f, 0.4f
    	};
    	Lighting::Get()->AddSpotLight(light);
    
    	light =
    	{
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Color(1.0f, 0.2f, 0.9f, 1.0f),
    		Vector3(0, 20, -30), 30.0f,
    		Vector3(0, -1, 0), 40.0f, 0.55f
    	};
    	Lighting::Get()->AddSpotLight(light);
    }
    
    void GaussianBlurDemo2::Pass(UINT mesh, UINT model, UINT anim)
    {
    	for (MeshRender* temp : meshes)
    		temp->Pass(mesh);
    
    	for (ModelRender* temp : models)
    		temp->Pass(model);
    
    	for (ModelAnimator* temp : animators)
    		temp->Pass(anim);
    }

     

     

     


     

     

     

    실행화면