Upgrade to Pro — share decks privately, control downloads, hide ads and more …

レイマーチングでソフトシャドウ

がむ
April 06, 2016

 レイマーチングでソフトシャドウ

先日の社内のシェーダ勉強会#2で「レイマーチングでソフトシャドウ」を実装する手法について発表しました。その資料を共有します。

後半ではソフトシャドウの現実らしい半影の特徴などにも触れています。半影については、3DCGに関する前提知識なしに直感的に理解できる内容だと思います。

半影の特徴は、現実世界の光の振る舞いにより生じるため、レイマーチングに限った話ではありません。レイマーチングに興味が無い方でも、3DCGに少しでもご興味があれば、目を通していただければ幸いです。

ソフトシャドウは、3DCGの基礎的なテーマですが、実際にはとても奥が深いと思います。

がむ

April 06, 2016
Tweet

More Decks by がむ

Other Decks in Technology

Transcript

  1. ϨΠϚʔνϯάͰ
    ιϑτγϟυ΢
    2016/03/17
    KLabࣾ಺ γΣʔμษڧձ#2
    ࡉా ᠳ @gam0022

    View Slide

  2. ࣗݾ঺հ
    ࡉాᠳ
    ϥϒϥΠϒӡ༻ݟश͍
    ڈ೥·Ͱஜ೾େֶ

    ͷ$(ͷݚڀࣨ
    UISFFKTྺ೥໨

    ஍ຯʹίϯτϦϏϡʔλ

    2
    !HBNʢ͕Ήʣ

    View Slide

  3. ιϑτγϟυ΢ͷϨΠϚʔνϯά࣮૷ྫ
    IUUQHBNOFUXFCHMSBZNBSDIJOH@TIBEPX
    3

    View Slide

  4. ϨΠϚʔνϯάͱ͸
    ϨΠτϨʔγϯάͷछ
    ڑ཭ؔ਺ʢ෺ମ΁ͷ࠷୹ڑ཭Λฦؔ͢਺ʣʹΑͬͯিಥ൑ఆ
    ϨΠͱ෺ମͷڑ཭͕ᮢ஋ΑΓখ͘͞ͳΔ·ͰϨΠΛਐΊΔ
    IUUQXXXTMJEFTIBSFOFUTIPIPTPEB
    UISFFKT
    4

    View Slide

  5. ϥελϥΠζ VS ϨΠτϨʔγϯά
    5
    ʲը૾ग़యʳhttp://kagamin.net/hole/gallery.htm

    View Slide

  6. γϟυ΢΋
    ϨΠΛඈ͹ͯ͠
    ࣮ݱՄೳʂ

    View Slide

  7. γϟυ΢ͷख๏
    ϥελϥΠζʢγϟυ΢Ϛοϐϯάʣ
    ޫݯ͔Βͷਂ౓஋ϚοϓΛ࡞ͬͯؤுΔ
    ϨΠϚʔνϯά
    িಥͨ͠Βޫݯํ޲ʹϨΠΛඈ͹͢
    7

    View Slide

  8. γϟυ΢Ϛοϐϯάʢઌिͷ෮शʣ
    8
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf

    View Slide

  9. γϟυ΢Ϛοϐϯάʢઌिͷ෮शʣ
    9
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf

    View Slide

  10. ϨΠϚʔνϯάͰͷӨͷग़͠ํ
    10
    ʲը૾ग़యʳhttps://wgld.org/d/glsl/g020.html

    View Slide

  11. ϨΠϚʔνϯάͰͷӨͷग़͠ํ
    11
    ʲը૾ग़యʳhttps://wgld.org/d/glsl/g020.html

    View Slide

  12. ϨΠϚʔνϯάͰϋʔυγϟυ΢
    12
    float shadow =
    getShadow( p + nearest.normal * OFFSET, lightDir );
    vec3 color = vec3( 0.9 ) * diffuse * shadow;
    HFU4IBEPX
    ͸EJ⒎VTFʹ৐ࢉͯ͠࢖͏
    Ͱ׬શʹਅͬࠇͳӨ
    ͸Ө͕ແ͍
    চͷγΣʔσΟϯάॲཧ

    View Slide

  13. ϨΠϚʔνϯάͰϋʔυγϟυ΢
    িಥ͢ΔͳΒɺ͠ͳ͍ͳΒΛฦ͢
    13
    float getShadow( vec3 ro, vec3 rd ) {
    float dist;
    float depth = EPS;
    for ( int i = 0; i < 30; i++ ) {
    dist = sceneDist( ro + rd * depth );
    if ( dist < EPS ) return 0.5;
    depth += dist;
    }
    return 1.0;
    }

    View Slide

  14. িಥͨ͠ɾ͠ͳ͍ = ϋʔυγϟυ΢
    14

    View Slide

  15. িಥͨ͠ɾ͠ͳ͍ = ϋʔυγϟυ΢
    15

    View Slide

  16. িಥͨ͠ɾ͠ͳ͍ = ϋʔυγϟυ΢
    16

    View Slide

  17. ຊӨͱ൒Өʢઌिͷ෮शʣ
    17
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf

    View Slide

  18. ιϑτγϟυ΢ʹ͸
    ൒Өͷ൓ө͕ඞཁʂ

    View Slide

  19. ϋʔυɾιϑτγϟυ΢ൺֱ
    19
    ϋʔυγϟυ΢ʢ൒Өͳ͠ʣ ιϑτγϟυ΢ʢ൒Ө͋Γʣ

    View Slide

  20. ιϑτγϟυ΢
    20
    ϋʔυγϟυ΢ʢ൒Өͳ͠ʣ ιϑτγϟυ΢ʢ൒Ө͋Γʣ

    View Slide

  21. ຊӨͱ൒Өʢઌिͷ෮शʣ
    21
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf
    dist ͸
    ϨΠͱ෺ମͷִؒ
    dist

    View Slide

  22. ιϑτγϟυ΢
    22
    float shadowIntensity = 0.7;
    float shadowSharpness = 6.0;
    float getSoft1Shadow( vec3 ro, vec3 rd ) {
    float dist, depth = EPS;
    float bright = 1.0;
    for ( int i = 0; i < 30; i++ ) {
    dist = sceneDist( ro + rd * depth );
    if ( dist < EPS ) return 1.0 - shadowIntensity;
    bright = min( bright, shadowSharpness * dist );
    depth += dist;
    }
    return 1.0 - ( 1.0 - bright ) * shadowIntensity;
    }

    View Slide

  23. ൒Өͷܗ͕ۉ౳Ͱෆࣗવ
    ޫݯ͕ਅ্͡Όͳ͍ͷʹ
    ൒Ө͕ۉ౳ʹͳ͍ͬͯΔ
    23

    View Slide

  24. ޫݯ͕ͣΕΔͱɺ൒Ө΋ภΔ
    24
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf

    View Slide

  25. ෺ମ͕ԕ͔͟Δͱɺ൒Ө΋޿͕Δ
    25
    ʲը૾ग़యʳhttp://www.wakayama-u.ac.jp/~tokoi/lecture/gg/ggnote11.pdf

    View Slide

  26. ൒Өͷੑ࣭
    ޫݯͷ܏͖ʹΑͬͯɺ൒Өͷ໘ੵ΋ภΔ
    ෺ମͱচ͕ԕ͍΄Ͳɺ൒Өͷ໘ੵ͕޿͕Δ
    26

    View Slide

  27. ιϑτγϟυ΢վྑ
    27
    ιϑτγϟυ΢ ιϑτγϟυ΢վ

    View Slide

  28. ιϑτγϟυ΢ൺֱ
    28
    ιϑτγϟυ΢
    ൒Өͷ෯͕Ұ༷
    ιϑτγϟυ΢վ
    ࣗવͳ൒Өͷ෯

    View Slide

  29. ιϑτγϟυ΢վ
    29
    float shadowIntensity = 0.7;
    float shadowSharpness = 6.0;
    float getSoft2Shadow( vec3 ro, vec3 rd ) {
    float dist, depth = EPS;
    float bright = 1.0;
    for ( int i = 0; i < 30; i++ ) {
    dist = sceneDist( ro + rd * depth );
    if ( dist < EPS ) return 1.0 - shadowIntensity;
    bright = min( bright, shadowSharpness * dist / depth );
    depth += dist;
    }
    return 1.0 - ( 1.0 - bright ) * shadowIntensity;
    }

    View Slide

  30. iqͷιϑτγϟυ΢࣮૷
    IUUQTXXXTIBEFSUPZDPNWJFX9ET[/
    30
    float softshadow( in vec3 ro, in vec3 rd, in
    float mint, in float tmax )
    {
    ɹfloat res = 1.0;
    float t = mint;
    for( int i=0; i<16; i++ )
    {
    ɹɹfloat h = map( ro + rd*t ).x;
    res = min( res, 8.0*h/t );
    t += clamp( h, 0.02, 0.10 );
    if( h<0.001 || t>tmax ) break;
    }
    return clamp( res, 0.0, 1.0 );
    }

    View Slide

  31. doxasͷιϑτγϟυ΢࣮૷
    IUUQTXHMEPSHEHMTMHIUNM
    31
    float genShadow(vec3 ro, vec3 rd){
    float h = 0.0;
    float c = 0.0;
    float r = 1.0;
    float shadowCoef = 0.5;
    for(float t = 0.0; t < 50.0; t++){
    h = distFunc(ro + rd * c);
    if(h < 0.001){
    return shadowCoef;
    }
    r = min(r, h * 16.0 / c);
    c += h;
    }
    return 1.0 - shadowCoef + r *
    shadowCoef;
    }

    View Slide

  32. શ͘ಉ͡ʢม਺໊΍܎਺ͷࠩҟʣ
    ιϑτγϟυ΢վ
    CSJHIU

    NJO CSJHIU TIBEPX4IBSQOFTTEJTUEFQUI

    JR
    SFTNJO SFT IU

    EPYBT
    SNJO S ID

    32

    View Slide

  33. ·ͱΊ
    ϨΠϚʔνϯάͩͱ؆୯ʹιϑτγϟυ΢͕Ͱ͖Δ
    ޫݯʹϨΠΛඈ͹ͯ͠িಥ͢ΔͳΒӨ
    ιϑτγϟυ΢ͷ൒Ө͸ɺڑ཭ؔ਺ͷ࠷খ஋ͰܭࢉͰ͖Δ
    ൒Өͷੑ࣭΋γϯϓϧͳࣜͰදݱՄೳ
    33

    View Slide