본문 바로가기

프로그래밍/Shader

(13)
Bloom 구현 과정 이론에도 나와 있듯이 Bloom은 밝은 픽셀을 주변으로 흘리는 것이다. 쉽게 말하면 뽀샤시기능. 처음 해야 할 일은 Bright Pass를 통해서 주변으로 흘릴 픽셀들을 찾는 것이다. 평균 휘도 값과 HDR 처리된 이미지를 사용하기 때문에 HDR을 먼저 구현해야한다. // Bloom Compute Shader Texture2D HDRDownScaleTex : register(t0); StructuredBuffer AvgLum : register(t1); RWTexture2D Bloom : register(u1); [numthreads(1024, 1, 1)] void BloomReveal(uint3 dispatchThreadID : SV_DispatchThreadID) { uint2 vCurPixel = ..
HDR 구현과정 2부 1부에서는 Compute Shader로 평균 휘도 값을 구하였다. 이제 이것을 ToneMapping 공식에 넣어서 사용하는 일만 남았다. ToneMapping 공식은 MG = Middle Grey, A = AverageLum, LS = LScale, W = White CLS = LDR로 변환하기 위한 HDR 색상 휘도 스케일 다음과 같은데 이를 코드로 표현하게 되면 float3 ToneMapping(float3 vHDRColor) { // 현재 픽셀에 대한 휘도 스케일 계산 float fLScale = dot(vHDRColor, LUM_FACTOR); fLScale *= g_fMiddleGrey / AvgLum[0]; fLScale = (fLScale + fLScale * fLScale / g_fLumW..
HDR 구현 과정 1부 HDR은 이론에서 나와있듯이 화면의 픽셀들의 평균 휘도 값을 구해서 ToneMapping 공식으로 LDR로는 표현할 수 없는 밝기를 밝게 해주거나 어둡게 해주는 기능이다. HDR을 구현하기 위해서는 ShaderResourceView와 UnorderedAccessView를 만들어주기 위한 버퍼2개, Input용인 Shader Resource View 2개, Output용으로 사용하는 UnorderedAccessView 2개, ToneMapping에 평균 휘도 값을 넣어줄 ShaderResourceView 1개가 필요하다 (이하 Shader Resource View 를 SRV, UnorderedAccessView를 UAV라 하겠다) 버퍼에 들어가는 옵션은 D3D11_BUFFER_DESCtDesc = {}; ..
Rim Light 이론과 구현 Rim Light = 역광 (Back Lighting) : 오브젝트 뒷면의 조명이 비춰서 오브젝트의 외각이 빛나는 듯이 보이는 현상(엣지 라이팅) 장점 1. 캐릭터와 배경의 구별을 명확히 한다 2. 물체의 외곽선을 살려준다 3. 빛을 받지 않는 부분의 디테일을 높여준다 4. 구현이 아주 간단하다' Fresnel (프레넬)공식을 사용한다. ViewDir을 이용하는데 이것은 버텍스에서 바라보는 카메라의 방향이다. Normal과 ViewDir을 dot 연산하게 되면 카메라가 조명처럼 인식되서 내가 바라보는 방향이 계속 밝아진다. 카메라가 조명인 것처럼 연산되었기 때문에 카메라를 회전해도 빛의 각도는 변하지 않는다. 이 결과를 뒤집어준다. Emissive = 1- fRIm 이렇게 하면 각도를 바꾸어도 외각이 밝..
Adaptation 구현 과정 Adaptation은 이론에도 나와있듯이 사람이 어두운 곳에 있다가 밝은 곳으로 나오면서 눈이 서서히 적응하게 되는 효과를 말한다. Adaptation을 구현하려면 먼저 HDR이 구현되어야 한다. Adaptation을 구현하기 위해서는 리소스를 저장할 Buffer 3개, Input을 위한 ShaderResourceView 3개, Output을 위한UnorderedAccessView 3개가 필요하다 픽셀을 DownScale 하기 위해 다음과 같은 Description을 가진 Buffer, ShaderResourceView, UnorderedAccessView를 만들어준다. 그리고 DownScale에서 구한 현재 프레임의 평균 휘도를 가지고 Adaptation을 해주기 위해 다음과 같은 Description..
기하 셰이더 (Geometry Shader) 기하 셰이더 (Geometry Shader) : 기하구조를 동적으로 파이프라인에 추가하거나 제거하는 능력, 기하 정보를 스트림 출력 단계를 통해서 정점 버퍼로 넘겨주는 능력 그리고 입력된 기본도형과는 다른 종류의 기본도형을 출력하는 능력 등의 기능을 가지고 있다. 처리된 기하구조 자료를 파일로 저장하거나, 파이프라인 연산을 디버깅하는등의 용도로도 활용할 수 있다. 입력 기본도형들을 형성하는 일련의 정점들을 받는다. 이 정점들을 자신의 목적에 맞게 기본도형들로 재해석해서 출력 스트림 객체를 통해 파이프라인의 다른 단계로 전달한다. triangleadj : 이 배열이 인접 정보(adjacency)를 가진 삼각형을 나타낸다는 뜻이다. Hull Shader와 Domain Shader를 NULL로 설정해서 테셀레..
Tessellation 테셀레이션 (Tessellation) : 작은 조각들을 틈이 없게, 그리고 겹치지 않게 이어 붙여서 하나의 surface를 형성하는 것 -> 여러 개의 작은 기하구조들을 틈 없이 겹치지 않게 붙여서 하나의 표면을 만들어 내는 것 래스터 기반 컴퓨터 그래픽에서는 일반적으로 표면을 주로 삼각형들로 표현했다.삼각형이 항상 블록꼴이고 세 정점이 항상 같은 평면에 있다는 성질 때문이었다.하지만 삼각형으로는 평평한 기하학적 표면만을 표현할 수 있다는 제약이 있다.많은 수의 작은 삼각형들로 매끄러운 곡면을 근사하는 것이 가능하지만, 기본 단위인 삼각형은 여전히 평평하다. 곡면을 표현하는 기법NURBS (Non-Uniform Rational Basis Splines) : 매끄러운 곡면에 대한 일반화된 수학 형식세분 표..
Adaptation Adaptation : 눈이 밝기에 적응하는 것처럼 만들어주는 것 HDR은 카메라의 움직임이나 씬의 변화에 의해 이미지의 내용이 바뀌므로 평균 휘도 값이 매우 불안정하다이 불안정성에 의해 LDR 이미지의 밝기가 변함에 따라 Tone Mapping 범위가 두드러지게 출렁거린다 현재 프레임의 평균 휘도를 저장하는 대신, 직전 프레임의 평균 휘도를 Adaptation에 필요한 정도만큼 점진적으로 변화시킨다. 눈의 적응 시간은 상대적으로 기므로 Adaptation 값을 매우 적은 값으로 정하는 것은 적절하지 않다일반적으로 1 ~ 5초 범위 내에서 설정하는 것이 좋다. Δt : 마지막으로 렌더링된 프레임에서부터 흐른 시간% Per Second : 직전 평균 휘도에 현재 평균 휘도가 섞이는 초당 비율% 값이 0에 ..