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 full-size slide

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

    ͷ$(ͷݚڀࣨ
    UISFFKTྺ೥໨

    ஍ຯʹίϯτϦϏϡʔλ

    2
    !HBNʢ͕Ήʣ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size 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 full-size 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 full-size 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 full-size slide

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

    NJO CSJHIU TIBEPX4IBSQOFTTEJTUEFQUI

    JR
    SFTNJO SFT IU

    EPYBT
    SNJO S ID

    32

    View full-size slide

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

    View full-size slide