Graphics
통합 (PBR, AO, 그림자, 환경맵)
지금까지 만들었던 것들을 전부 하나로 통합하는 과정이다. 다만 여기서 바뀐것들 두개만 따로 정리하겠다. GTAO(Grando Truth Anblient Occulusion)일단 이전에 만들었던 SSAO와 다른 방법을 사용한다. 간단하게 말하면, 하나의 픽셀에서 주변에 가장 높이 올라가 있는 값을 찾아서 카메라 방향에서 얼마나 가려져 있는지를 계산하는 방법이다. 반구를 슬라이스로 자금이렇게 네개의 슬라이스로 자르고, 다섯개의 스탭 그리고 5도로 기울인다고 생각 해보자그러면 각 슬라이스 에서 각 스탭에서의 앞 뒤로 갔을 경우 가장 높은 값들을 갖고온다.그럼 앞 중에 가장 높은 값, 그리고 뒤 중에 가장 높은 값을 계산 가능하다. (여기서 높은 값은 하나의 픽셀에서 해당 방향을 바라볼 때의 높은 값이다) 해당..
PBR - 6 버그 픽스
이전 모델링에서 뭔가 이상한점을 눈치 챈 사람들이 많을것이다. (난 나중에 눈치 챘다. 머쓱...) 문제점1. 금속 물체인데 빛에 의해 반사가 없었음2. 환경맵 색상이 뭔가 이상함3. Terrain의 Normal, Tangent가 없음이 저번 포스트까지의 눈에 보이는 문제 였고 1. Mesh 파싱 툴의 문제이게 다른 모델을 파싱하면서 생긴 문제였다. 일단, 하나씩 확인 해보자 금속 물체인데 빛에 의해 반사가 없었음Mesh값을 파싱 할때, void Converter::ReadMeshData(aiNode* node, int32 bone){ if(node->mNumMeshes mNumMeshes; ++i) { ... for (uint32 v = 0; v mNumVertices; ++v) { //..
PBR - 5 IBL 적용
아까 구한 Irradiance는 Diffuse Color고 Prefiltered와 BRDF로 Specular Color를 구해본다. Get IBL Colorfloat3 GetDiffuseColor(float3 normal, float4 baseColor, float metallic){ float3 irradiance = IrradianceMap.Sample(PBRSampler, normal).rgb; return irradiance * baseColor.rgb * (1 - metallic);}float3 GetSpecular(float3 normal, float3 reflectVector, float3 view, float roughness, float3 F0){ float3 pr..
PBR - 4 IBL 구현
뒤에서 정말 많은 공식이 지나갔다... 일단, 해당 텍스처를 만들기 위해 큐브맵을 받아 그릴 부분 부터 만들어 보자 IrradianceCPP더보기shared_ptr IBLManager::CreateIrradiance(shared_ptr hdrMap){ ComPtr uav; D3D11_TEXTURE2D_DESC texDesc; ZeroMemory(&texDesc, sizeof(D3D11_TEXTURE2D_DESC)); texDesc.Width = 32; texDesc.Height = 32; texDesc.MipLevels = 1; texDesc.ArraySize = 6; texDesc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT; texDesc.SampleDesc.Count =..
PBR - 3 IBL 이론
일반 구체가 아닌 사람이 아닌(PBR로 하려면 추가적인 코드가 포함) 모델을 출력 해보자! 오우 정말 구리다... 어둡다... 생동감이 없다... Pong을 사용하는게 더 좋을것 같다. 이 문제들을 해결하는 방법은 주변광을 만들어 이 모델에 주는 것이다. IBL(Image Based Lighting)현실에서 생각을 해보자어두울땐, 밖의 건물이나 물건들이 어두워지고, 노을이 지면 붉어진다.이 느낌을 주면 어느정도 실감나는 모델을 구현 가능하다. 스카이 큐브를 활용해서 해당 값들을 미리 게임 전에 만들면 된다. 일단, 해당 IBL이 각각 어떤게 필요한지 어떤 값들이 필요한지 방법이 뭔지 알아보자 Irradiance (방사조도)이름부터 한국어로 해도 뭔지 모르겠다.하지만! 개념을 생각하면 어려운 정보는 아니다..
PBR - 2 기초 구현
코드Material일단, 기존에 사용하던 Material에 존재하는 값들을 PBR 에 맞게 수정을 해준다.#pragma once#include "ResourceBase.h"struct MaterialDesc{ // 색상 관련 Color albedo = { 1.0f, 1.0f, 1.0f, 1.0f }; Color emissive = { 0.0f, 0.0f, 0.0f, 1.0f }; // PBR float metallic = 0.0f; // 0.0(비금속) ~ 1.0(금속) float roughness = 0.f; // 0.0(매끄러움) ~ 1.0(거침) float ao = 1.f; // 1.0(차폐 안됨) ~ 0.0(완전 차폐됨) int padding0; // 텍스처 존재 여부 플래그 int..
PBR - 1 기초 이론
일단, 이 전까진 Phong방식으로 렌더링 했었다.하지만 요즘은 PBR(Physically Based Rendering 물리기반렌더링)으로 렌더링을 한다.이게 어떤 렌더링인지 우선알아보자 PBR 이란?쉽게 생각하면 지금까지 했던 방식인 Phong 렌더링은 물리 법칙을 무시하고 간단하게 구현해도 꾀나 괜찮게 보여서 사용했다. 하지만, 컴퓨터의 발전으로 인해 조금 더 현실적인 렌더링을 해도 괜찮아서 PBR을 사용하게 되었다.PBR을 사용하는 이유일관성 보장물리법칙을 기반으로 작동하기 때문에 어떤 조명 환경에 있어도 현실과 비슷할정도로 자연스럽게 반응직관적인 재질아티스트는 Phong에서 사용한 가짜 수치를 고민하지 않고, 금속(Metallic)인지, 거친지(Roughness)의 수치만 고민하면 됨퀄리티 상승위..
그림자 - 5 Point Shadow
마참내 Point Shadow다! Point Shadow저번 포스트에선 이렇게 적용을 한다고 했다.그러면 해당 텍스쳐 여섯개를 만들어 TextureCube로 만들어보자 class ShadowMapPoint : public ShadowMapBase{public: static const uint32 MAX_TEXTURE_COUNT = 6; static constexpr Vec3 UP_VECTOR[MAX_TEXTURE_COUNT]{ Vec3(0, 1, 0) , Vec3(0, 1, 0), Vec3(0, 0, -1), Vec3(0, 0, 1), Vec3(0, 1, 0), Vec3(0, 1, 0)}; static constexpr Vec3 LOOK_VECTOR[MAX_TEXTURE_COUNT]{ Vec3(1, 0..