목록DirectX12 (14)
For me

Normal Mapping (Bump Mapping) Normal Mapping을 사용하지 않을 때 Vertex Shader에서 정해준 각 정점의 값의 법선벡터로 내부의 점의 노말값을 보간 Normal Mapping을 사용하지 않고 Vertex 값을 무수히 늘릴 때 다양한 색 처리가 가능해짐. 하지만 프로그램 실행속도가 현저하게 느려지고, 연산량도 기하급수적으로 늘어남 Normal Texture u,v 좌표에 해당하는 각각의 픽셀에 Normal 값을 전달해주는 역할 Normal Texture은 local 좌표계를 사용하지 않고, 별도의 좌표계를 사용함. 그 이유는 Mesh 자체는 local 기준으로 지속적으로 변화하고, Normal Texture은 tangent Space(접하는 평면)을 사용 좌표 자체..
1. Light와 같은 위치, 방향, 크기만큼 Camera를 Setting 2. Render 하기 전, RenderShadow를 먼저 호출 ▶ 모든 물체를 그림 (바라보고 있는 깊이를 texture로 그림) 3. Shadow Render Target Map 에 그려짐 4. RenderLight 에서 함께 계산하여 그림자 생성 Shadow Shader 더보기 #ifndef _SHADOW_FX_ #define _SHADOW_FX_ #include "params.fx" struct VS_IN { float3 pos : POSITION; }; struct VS_OUT { float4 pos : SV_Position; float4 clipPos : POSITION; }; VS_OUT VS_Main(VS_IN in..
Dir viewLightDir = 처음에 세팅한 Direction에 View 행렬을 곱한후 단위벡터로 전환 diffuseRatio ( viewLightDir의 반대방향 과, view단위벡터 의 내적 ) Point Dir과 다르게 Position, Distance 이 추가됨. viewLightDir = 포지션 뷰에서 빛 포지션 뷰를 뺀 값 의 단위벡터 viewLightPos = 빛의 위치와 View 행렬을 곱한 값 Distance = 포지션뷰와 빛포지션 뷰의 거리 => distanceRatio = 1 - (Distance / 최대거리)의 제곱 멀어지면 멀어질수록 어두워 지기 위해 위와같이 구현 Spot Point의 viewLightPos 값을 구하는 과정까지 같은 과정 halfAngle = 최대각도 / 2..

조명과 음영의 개념 조명과 음영에 영향을 주는 요인들 Light Source Suface orientation Surface properties psychological effect contrast 차이와 Mach band효과 등 조도 함수와 광원의 색 기여도 조도 함수 위치 방향 파장 물체 면의 밝기는 광원의 모든 영향의 합으로 구함 지역 조명 모델만 고려 점광원 빛이 방사형으로 진행 위치성 광원 광원의 위치가 중요함 밝기는 광원과 표면사이의 거리의 제곱에 반비례 점 p에 도착하는 빛의 세기 원거리 광원 Distant Light, 광원이 태양과 같이 매우 먼 위치에 있음 기본 조명 모델 광-재질 상호작용 눈에 색이 감지되는 과정 현실에서는 태양으로부터 백색광 물체의 표면에서 일부 파장대는 흡수 나머지는..

Transform Camera를 구현하기전, 먼저 Transform을 구현해야함 ▶ 월드좌표, 로컬좌표를 구해야 하기 때문에 PushData를 통해 ConstantBuffer을 통해 transformParams를 GPU로 보내준다 Transfom.h 더보기 #pragma once #include "Component.h" class Transform : public Component { public: Transform(); virtual ~Transform(); virtual void FinalUpdate() override; void PushData(); public: // Parent 기준 const Vec3& GetLocalPosition() { return _localPosition; } const..
Scene 게임 설계에 따라, 게임은 단일 씬으로 구성되거나, 여러 개의 씬으로 구성될 수 있다. 각각의 스테이지에 대응하는 여러 개의 씬으로 구성할 수 있다 SceneManager.h (싱글톤) 더보기 #pragma once #include "EnginePch.h" class Scene; enum { MAX_LAYER = 32, }; class SceneManager { DECLARE_SINGLE(SceneManager); public: void Update(); void Render(); void LoadScene(wstring sceneName); void SetLayerName(uint8 index, const wstring& name); const wstring& IndexToLayerName(..
수많은 물체를 Resources(mesh, shader, texture)를 매 물체마다 만들고, 로딩하고, 연결하는 과정은 좋지않음. => Material이라는 개념을 사용하여 관리 Engine 에서 다음과 같이 선언 ▶ CreateConstantBuffer(CBV_REGISTER::b2, sizeof(MaterialParams), 256); CommandQueue에서 RenderBegin에서 다음과 같이 선언 ▶GEngine->GetConstantBuffer(CONSTANT_BUFFER_TYPE::MATERIAL)->Clear(); Material에서는 ConstantBuffer, ShaderResourceBuffer 를 업로드하여 파이트라인 세팅까지 하나로 관리함. Material.h 더보기 #pra..
Unity 에서는 각종 Component를 통해 오브젝트의 성질을 추가해줄 수 있다. ex) Mesh, Collider etc.. Unreal 에서는 빈 깡통의 오브젝트가 아닌 부모클래스의 상속을 받는 오브젝트로 생성을한다. GameObject GameObject.h 더보기 #pragma once #include "Component.h" #include "Object.h" class Transform; class MeshRenderer; class Camera; class Light; class MonoBehaviour; class ParticleSystem; class BaseCollider; class Terrain; class Animator; class GameObject : public Obje..
Unity의 DeltaTime을 사용하기 위해 구현하고, 게임 내 FPS를 확인하기 위하여 구현 Timer.h 더보기 #pragma once class Timer { DECLARE_SINGLE(Timer); public: void Init(); void Update(); uint32 GetFps() { return _fps; } float GetDeltaTime() { return _deltaTime; } private: uint64_frequency = 0; uint64_prevCount = 0; float_deltaTime = 0.f; private: uint32_frameCount = 0; float_frameTime = 0.f; uint32_fps = 0; }; Timer.cpp 더보기 #incl..
Input 클래스는 키보드의 입력, 마우스의 클릭을 입력받기 위해 작성했다. Input.h 더보기 #pragma once enum class KEY_TYPE { UP = VK_UP, DOWN = VK_DOWN, LEFT = VK_LEFT, RIGHT = VK_RIGHT, LBUTTON = VK_LBUTTON, RBUTTON = VK_RBUTTON, }; enum class KEY_STATE { NONE, PRESS, DOWN, UP, END }; enum { KEY_TYPE_COUNT = static_cast(UINT8_MAX + 1), KEY_STATE_COUNT = static_cast(KEY_STATE::END), }; class Input { DECLARE_SINGLE(Input); public:..