티스토리 뷰
우선 소스가 있는데 부드럽게 빌드 된다
소스로 부터 얻을 수 있는건 AO 연습용 환경 + 모델 셋 등 추가 실험하기 좋것다
https://www.comp.nus.edu.sg/~lowkl/publications/mssao_cgi2011.pdf
Temporal Filtering 등 약간 변화가 있는 것
https://www.comp.nus.edu.sg/~lowkl/publications/mssao_visual_computer_2012.pdf
slide는 2012년판의 내용을 포함. 2011 paper 가 읽기 쉽다
https://www.comp.nus.edu.sg/~lowkl/publications/mssao_cgi2011_slides.pdf
우선 핵심은, 예전 구현들은 속도 때문에 ramdom sparse sampling을 했기 때문에 blur 라던가 noise가 발생.
하지만 우리 구현은 resolution을 여러번 변경해가면서 일정크기를 전수조사하기 때문에 해당 문제가 없다.
그리고 paper 에서 언급된 문제는
Using median helps our method achieve better temporal coherence.
Consequently, our results suffer very little popping or shimmering artifacts between frames.
가 있고 왠 median 이냐 하면 줄일때 필터링 안쓰고 median 에 가까운 값을 쓴다.
결국 속도 때문에 최상위 detail 에서는 kernel size를 max 2로 둔다.
각 resolution 은 bluring 된 다음 bilateral filter를 거쳐 upsamping 되고 (순서 맞나?) max로 현 resolution과 합치는데 중복된걸 제거하니 이게 합당하다고 설명 되어있다.
논문가면 설명되어있다
이게 tolerance 항인데
We use tn = 8 and tz = 16
화면이 작을 때 주변 픽셀의 급격한 변화를 줄여주기 위해 높은 계수를 설정한다고 한다.
blur 과정에서 weight는 따로 더해져 최종에 나눠진다.
s += t * normWeight * depthWeight * gaussianWeight
또 히한한 것은 각 픽셀별로 이런 식으로 각 픽셀별 radius를 설정해둔다.
(s*dmax)/(2*z*tan(α/2))
resolution이 내려갈수록 0.5 배 해서 쓰는데 최대 값은 5로 정해져 있다.
그리고,
It is important to note that the normals used here
are the polygons’ normals, not interpolated vertex normals,
as the latter would cause self-occlusion artifacts with lowtessellation
scene models.
G-buffer에는 vertex normal 인것을;
소스에는,
glmFacetNormals(model);
// glmVertexNormals(model, 90.0f);
modelList = glmList(model, GLM_SMOOTH);
glmDelete(model);
GLM_FLAT - render with facet normals
GLM_SMOOTH - render with vertex normals
머냐 이건;
half scale 만 bilinear로 upsampling 한 결과
float3 samplePositionV = ViewPositionFromCoordinate(st);
float3 sampleNormalV = texNormal.Load(uint3(st, 0)) * 2 -1;
float d = distance(positionV, samplePositionV);
float t = min(1.0, (d * d) / (dMax * dMax));
t = 1.0 - t;
float3 diff = normalize(samplePositionV - positionV);
float cosTheta = max(dot(normalV, diff), 0.0);
return t * cosTheta;
position을 안쪽 loop는 새로 생성하는 방법 밖에 없어고 depth도 없어서
depth를 hiRes를 썻더니 빈공간에서도 distance가 0.6 정도로 나온다. far plane에 있는거라. 차이가 크다.
또한 normal 역시 0*2-1 로 decoding 해서 (-1, -1, -1) 로 나온다.
그걸 고쳐도 여전히 느리고
그렇길레 position buffer를 받도록 바꿨다.
Position downsampling 하는 부분인 Generate SSAO 와 SSAO 부분이 통채로 느려졌다.
linear depth 버리고 reconstruction 하기로 했다. 차이는 거의 없다.
normal을 reconstruct 한 position 을 가지고 cross(ddy, ddx) 취한건 차기가 꽤 난다.
- Total
- Today
- Yesterday