Game Dev/Article 59

Tiled Rendering

개요사실 SW Render Technique라기 보다는 GPU Render Technique화면 공간을 여러 Tile(or Grid)로 나누어 렌더링 하는 방식Tile-based Rendering(=TBR), Sort-middle Architecture라고도 불린다.중간에 어떤 Tile에 어떤 Geometry가 그려질지 결정하기 때문기존의 Immediate Rendering(=IM)은 Sort-Last이렇게 나누면 동일한 (빈 공간이나 동일한 배경) 타일을 활용할 수도 있고 HW의 성능이 떨어질 경우 적은 리소스만 가지고도 렌더링이 가능하다. 순서Rendering 하기 전에 Geometry가 어느 Tile에 그려질지 결정해야 한다.Modern GPU에서는 CPU가 아닌 GPU에서 수행 가능보통 Tile은..

Game Dev/Article 2016.10.21

Forward+ Rendering

개요전통적인 Forward Rendering의 확장!최종 Shading 전에 Light Culling 하나만 추가되었다.많은 수의 Light를 Culling하고 Pixel에 영향을 주는 것만 저장한다.Light List를 구축하고 이를 Shader에서 사용하지만 메모리는 적게 쓴다. Standard Forward, Standard Deferred식상한 얘기들ForwardDeferred에 비해서 Material 수는 큰 문제가 되지 않는다.다만 Light 개수가 많아지면 성능에 문제가 된다.또 Shader 조합이 폭발적으로 늘어날 수 있고 Light와 Geometry의 CPU 관리가 필요하다.DeferredGeometry 복잡도와 Light 복잡도를 분리하여 많은 Light를 그릴 수 있다.Shader 조..

Game Dev/Article 2016.10.19

Premultiplied alpha

Post Multiplied Alpha우리가 익히 많이 사용하고 있었던 Blending 공식Dest.rgb = (Src.rgb * Src.a) + (1 - Src.a) * (Dest.rgb) Src : SRC_ALPHADest : INV_SRC_ALPHA 하지만 이 공식은 많은 경우에 잘못된 Artifact가 발생한다. 다음의 이미지를 보면 왼쪽은 (R:1.0, G:0.0, B:0.0, A:1.0) 컬러이고, 오른쪽은 (R:0.0, G:1.0, B:0.0, A:0.1) 색이다. 이 둘을 혼합한다면 아주 연한 녹색 빛을 띄는 붉은색이 되어야 할 것이다. 그런데 저 둘을 가지고 1x1 Mipmap을 만들어보면 다음과 같은 결과가 나타난다!?이 컬러는 (R:0.5, G:0.5, B.0.0, A:0.55)로 단..

Game Dev/Article 2016.10.14

Inferred Lighting

개요infer : 추론하다, 추측하다, 언급하다.낮은 해상도에서 Lighting을 수행한다.따라서 Material Shader가 낮은 해상도에서도 정확한 Lighting 값을 "추론"할 수 있는 Filtering Algorithm이 중요함총 3번의 Rendering Pass가 필요하다. 하지만 투명한 오브젝트에 대해서 별도의 렌더링이 필요하지 않다.최종 결과물은 HW Anti-Aliasing이 적용되도록 한다. Light Pre-pass Rendering과 다른점Light Pre-pass는 투명한 오브젝트를 그릴 때 Forward Rendering이 필요함Light Pre-pass는 Light Buffer의 해상도가 커야 함 (=Full resolution)Light Pre-pass나 Standard D..

Game Dev/Article 2016.10.13

Light Pre-Pass Renderering (=Deferred Lighting)

개요총 3번의 Rendering Pass가 필요하다.하지만 Standard Deferred Rendering에 비해서 Render Target이 많이 필요하지 않다.가장 중요한 아이디어는 머트리얼과 빛의 속성을 분리해서 그리는 것! 구현Z-Buffer에는 Depth, Render Target에는 Normal(+Specualr Factor)만 그린다.MRT 필요하지 않음Light Buffer에 Light 속성을 그린다. (하단의 Light Buffer 참고)Forward Rendering으로 Geometry를 그리면서 Lighting을 수행한다. Light Buffer다음은 일반적인 LightingColor = Ambient + Shadow * Att * (N.L * DiffColor * DiffInten..

Game Dev/Article 2016.10.09

Light Indexed Deferred Rendering

개요현재의 렌더링 방식은 크게 2가지인데 각각 단점이 있다.Forward : Light가 많을 때 문제Deferred : Bandwidth 사용량, 반투명, MSAA각각의 장점만 취할 수 없을까?Light Volume의 Index를 저장해서 해결해보자.결론부터 말하자면 Lighting은 Deferred, Geometry는 Forward 구현Render depth only pre-passLight Index Texture에 Light Volume을 그림이 때 Light Index만 기록하면 됨Depth Write Off, Depth Test OnForward Rendering으로 Geometry를 그림2에서 기록한 Light Index Texture를 참고하면서 Lighting 문제점한 Fragment에 ..

Game Dev/Article 2016.10.08

CppCon2014 : C++ in Huge AAA Games

발표자유비소프트 몬트리얼 개발자, 아마도 Rainbow Six 프로젝트에서 일하는 듯 Code Structure 하지 않는 것RTTI : 별도의 Type 추론 구현Exception Handling : 느리니까STL Container : STL Algorithm은 사용하지만 Container는 사용하지 않음Boost in Engine Iteration-TimeFastBuild 사용http://fastbuild.org/docs/home.html무려 OpenSourceDistribution, Caching 지원 (Caching이 잘 되어있으면 3분, 아니면 5분의 Rebuild)Unity Build와 연동Debug 환경에서 /Ob1 사용/Ob : Inline 함수 최적화 여부 (기본값 2)https://msd..

Game Dev/Article 2016.10.08

C4265 Warning을 켜자!

경험적으로 현재 프로젝트에서 메모리 릭이 발생한 경우는 크게 3가지이다. 메모리를 할당하고 해제하지 않았다.array 버전인 new [ ]로 할당하고 delete로 해제했다.다른 클래스를 상속하였는데 super class가 가상 소멸자를 갖지 않았다. 1번과 2번의 경우는 std::unique_ptr을 사용하면 편해지지만 3번의 경우는 정말 어디서 발생했는지 알지 못하는 경우가 많다. cppcheck 같은 정적 분석기도 못 찾아줬고, Visual Leak Detector나 Dr.Memory 같은 별도의 메모리 분석 도구를 연동한 상태로 실행해야 찾을 수 있는데 이것도 단점이 있다. 메모리 릭을 발생한 지점이 실행되지 않으면 찾을 수 없다. 대부분의 경우 추가 메모리가 많이 필요하다.결정적으로 매우 느리다..

Game Dev/Article 2016.09.22

x64와 x86에서의 float 연산

간단하게... QA에서만 재현되는 버그가 있었음Debug/Release 모드 차이인 줄 알았었는데 아님확인 결과 x64(=개발환경), x86(=배포환경) 차이문제가 된 부분의 로직은 페이지를 계산하는 것int page = std::ceil(input / (float)10);다음과 같은 시도 중 하나를 통해서 해결 가능ceil을 사용하지 않는 로직으로 변경#pragma optimize("", off)로 로직을 감쌈 (이유는 모르겠음)로직 전후로 Log를 찍음 (이유는 모르겠음)(float)10을 (double)10으로 변경하지만 문제는 4-1이었음http://stackoverflow.com/questions/22710272/difference-in-floating-point-arithmetics-betwe..

Game Dev/Article 2014.10.30