Chapter 16. Real-Time Approximations to Subsurface Scattering

반응형

GPU Gems1  :
Chapter 16. Real-Time Approximations to Subsurface Scattering
http://http.developer.nvidia.com/GPUGems/gpugems_ch16.html

16.2 간단한 Scattering 근사화.
- wrap lighting
- wrap texture 

 

- diffuse lighting에 wrap effect 추가.
   (wrap 관련 참고 : http://mgun.tistory.com/1562 )

 기본 lambert.  (Output.mDiffuse = NdotL;)

 lambert + wrap (wrap_diffuse = max(0, (NdotL + wrap) / (1 + wrap)))
 

어두운 부분에 붉은색 값을 살짝 넣어주는 방법.
Gpu Gems1. 16장의 GenerateSkinLUT() 함수 간략화.

원본식 복붙, wrap 0.7


아티스트가 그려준 텍스쳐를 입혀주는 방법.
이 결과 역시 Gpu Gems1. 16장의 ShadeSkin()함수를 간략화 해서 사용한 결과.

위 색깔 텍스처와 ShadeSkin함수 거의 그대로 사용한 결과.

원본 식은 아래와 같다.(전체 식은 책을 참조)
주의깊게 볼 부분은 NdotL 대신 NdotL_wrap를 사용했다는 점과
smoothstep 함수를 사용했다는 점 정도...
 
float scatter = smoothstep(0.0, scatterWidth, NdotL_wrap) *           smoothstep(scatterWidth * 2.0, scatterWidth,  NdotL_wrap); 

 

smoothstep link : http://chulin28ho.egloos.com/viewer/5324893
텍스처 사용 결과인 ShadeSkin은 텍스처에 따라 결과값이 많이 다름..




원본 식은 아래와 같다.(전체 식은 책을 참조)

half4
 light = tex2D(skinLUT, s * 0.5 + 0.5);

  returndiffuseColor * light.rgb + specularColor * light.a; 

16.3 깊이맵을 사용한 흡수 시뮬레이션.
- 피부처럼 반투명한 재질에서 중요한 요소는 흡수(absorption).
- 빛이 재질을 통해 산란한 거리를 측정해야 한다.
- 거리 계산을 위해 깊이 맵 사용.(shadow mapping과 흡사.)
   Shadow Mapping은 이곳을 참고.


   
책의 코드를 조금 수정해서 만들었는데 하얗게 타는 부분은 수치값을 적당히 조절하면 나아질 듯..
아래에 개념을 간단히 요약해서 정리했다.

Pass 1. Depth.
- view를 light 위치로 옮긴다.
   이 작업은 shadow mapping 관련 링크를 보면 lightmatrix를 만드는 함수가 포함되어 있다.
- light 위치에서의 거리를 계산해서 화면에 저장한다.
  일반적으로 length()함수를 사용해서 저장하는데 어느 코드를 보니 아래와 같이 되어 있더라.
   
   float shadDist = length(lightVec);
   float bias = .002;
   float scaledBias = max( ddy( shadDist ), ddx( shadDist ) ) * 8;
   return scaledBias;  

   ddxy와 ddy는 변화량 값일 거고. 이 값을 offset 느낌으로 해주는 거 같은데 *8이 
   매직넘버인지 아니면 의미가 있는 값인지 잘 모르겠다. 
   그리고 굳이 bias로 .002값을  주는 이유도 잘 모르겠다...

Pass 2. Light Model.
- 그냥 라이트 위치 알기 편하라고 넣어둔 것.

Pass 3. Depth Calc.
- view에서의 거리 구하기. 
   (pass에서는 light에서의 거리 구하기 였다. 실제 책 코드는 첫번째 패스에서 view에서의 거리를 
    구한 후 그걸 depth맵으로 쓰던데....머...개인의취향이지않을까..
    난 shadow mapping을 기준삼아 그냥 소스복붙이라...)
- depth texture(라이트에서의 거리값)를 가져와서 두 값을 비교하여 거리값을 구한다.
- 대략 색깔값좀 퐁퐁퐁 넣어주고 출력하면 끝!.

이 방식도 몇가지 문제가 있지만 나름 간단한 방법이라 갠춘할 듯.

16.3.1 구현 세부 사항   
지포스 FX 하드웨어에서 depth 텍스처를 읽을 때, 깊이값만 가장 중요한 8비트를 사용할 수 있는데
8비트가지고는 충분히 정밀하지가 않아서 부동소수점 텍스처나 
NVIDIA 단편 프로그램의 정점 압축, 압축풀기 명령어를 사용해서 32비트 부동소수점 
값을 8비트 RGBA 텍스처에 넣을 수 있다.
부동 소수점 텍스처는 현재 필터링을 지원하지 않아서 투영된 텍스처에서 결점등을 볼 수 있다.
이러한 부분을 완화시키고 싶으면 어느정도 비용을 지불하고 바이리니어 필터링을 수행하면 된다.

투영된 깊이맵의 또 다른 문제는 결점이 종종 투영의 가장자리 부분에 나타난다는 것이다.
shadow mapping에서 본 자체 그림자 결점과 흡사하다.
이는 object의 가장자리에 투영되는 배경의 픽셀들 에서 
대부분 텍스처맵의 한정된 해상도 때문에 발생한다.
샘플 코드는 depth-map pass에서 vertex normal을 따라 오브젝트를 살짝 크기변환해서
이 문제를 피하도록 한다.

16.3.2 더 세련된 산란 모델
더 세련된 산란 모델은 정확하게 산란 누적 효과를 시뮬레이션 하려고 한다.
한 모델은 빛이 한번만 반사된다고 가정하는 단일 산란 근사치을 사용한다.
재질에서 굴절 광선을 단계별로 따라가면 얼마나 많은 광자들이 카메라 쪽으로 
산란되는지 측정할 수 있다.

여기서 다룰 내용은 아니니 참고만..

16.4 텍스처 공간 확산
vertex의 화면좌표로 uv texture 좌표를 사용하는 vertex 프로그램으로 
object의 메시를 unwrap할 수 있다.
프로그램 자체는 간단한데, 0~1의 범위의 텍스처 좌표를 -1~1사이의
정규화된 장치 좌표계로 바꿔주는 것이다.
이렇게 unwrap되어진 mesh로 2d 이미지를 얻을 수 있다.
이 이미지를 법선 텍스처처럼 사용하면 된다.


1. 라이트 공간으로 normal을 옮긴다.
2. 라이트 공간으로 pos을 옮겨 light위치를 설정한다.
3. 위 1,2에서 구한 N과 L로 diffuse를 구한다.

// diffuse lighting
   float3 N = normalize(mul((float3x3) lightMatrix, normal));
   float3 L = normalize(mul(-lightMatrix, Pos).xyz);

실제 책에서 사용된 모델을 구할 수 있다면 맞는지 알 수 있을 텐데
비슷한 모델을 가져와서 적용해서 그런지 정확히 맞게 했는지는 확신할 수 없다.
혹시 틀린 부분이 있다면 말해주시길....ㅎㅎ


뒤로갈수록 소스가 조금씩 달라지는데...왜 그렇지???
의사코드인가.. 그대로 넣어주면 제대로 동작안해서 offset이랑 조금 수정했다.
blur정도는 취향이니까 원하는 만큼 먹여주면 된다.

기본 텍스처만 적용 시킨 모습.

텍스처 공간 확산(위 16.4 내용)으로 얻은 이미지에 blur를 적용해서 적용시킨 모습.


Reference Links

ddx(), ddy() 
- http://cagetu.egloos.com/viewer/5684814
- http://yuchi.dyndns.org:1888/xe/project_diary/15129

ShadowMapping
http://mgun.tistory.com/1568 

GPU Gems Chapter 16. Translated Link.
http://raypop.tistory.com/62

GPU Gems Chapter 21. Real Time Glow.
- http://http.developer.nvidia.com/GPUGems/gpugems_ch21.html

--------------------------------------------------------------
ps.
잘못된 부분이나 문제가 되는 부분이 있다면 삭제하겠습니다. 감사합니다. 

'Books > Gpu Gems 1' 카테고리의 다른 글

GPU Gems1 cd, book  (0) 2014.01.24
TAGS.

Comments