$30 off During Our Annual Pro Sale. View Details »

좌충우돌 애니모지 개발기

kakao
December 09, 2022

좌충우돌 애니모지 개발기

#Graphics #OpenSource

애니모지를 위해 필요한 기술 설명 및 구현 과정 공유

발표자 : danny.jang
카카오브레인 Digital Human Studio의 Danny입니다. 그래픽스와 병렬 프로그래밍에 관심이 많은 GPU 개발자입니다.

kakao

December 09, 2022
Tweet

More Decks by kakao

Other Decks in Programming

Transcript

  1. ੢؀ݺ danny.jang
    ஠஠য়࠳ۨੋ
    Copyright 2022. Kakao Corp. All rights reserved. Redistribution or public display is not permitted without written permission from Kakao.
    ઝ୽਋ج গפݽ૑ ѐߊӝ
    if(kakao)2022

    View Slide

  2. গפݽ૑ۆ?
    ݽೝ੉ۆ?
    ҳഅ
    য়೑ࣗझ ӝৈ

    View Slide

  3. গפݽ૑ۆ?
    ݽೝ੉ۆ?
    ҳഅ
    য়೑ࣗझ ӝৈ

    View Slide

  4. গפݽ૑ۆ?

    View Slide

  5. গפݽ૑ܳ ױ҅߹۽ ࢓ಝࠁӝ

    View Slide

  6. গפݽ૑ܳ ױ҅߹۽ ࢓ಝࠁӝ
    ୶ۿ ݽ؛ ۪؊݂ ূ૓

    View Slide

  7. গפݽ૑ܳ ױ҅߹۽ ࢓ಝࠁӝ
    ୶ۿ ݽ؛ ۪؊݂ ূ૓

    View Slide

  8. গפݽ૑ۆ?
    ݽೝ੉ۆ?
    ҳഅ
    য়೑ࣗझ ӝৈ

    View Slide

  9. ݽೝ੉ۆ?

    View Slide

  10. ݽೝ੉ۆ
    FOR vertex_index = 0 TO vertex_count


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    END FOR

    View Slide

  11. ݽೝ੉ۆ
    FOR vertex_index = 0 TO vertex_count


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    END FOR

    View Slide

  12. ݽೝ੉ۆ
    FOR vertex_index = 0 TO vertex_count


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    END FOR

    View Slide

  13. গפݽ૑ۆ?
    ݽೝ੉ۆ?
    ҳഅ
    য়೑ࣗझ ӝৈ

    View Slide

  14. Filament
    ҳӖীࢲ ѐߊೠ ݽ߄ੌ ੹ਊ ۪؊݂ ূ૓

    View Slide

  15. Filament
    ৮߷ೠ ݽ೐ গפݫ੉࣌ ૑ਗ.

    View Slide

  16. Filament
    যࢸ೑ ݽೝ গפݫ੉࣌ ૑ਗ

    View Slide

  17. Filament
    যࢸ೑ ݽೝ গפݫ੉࣌ ૑ਗ

    View Slide

  18. Filament
    ҳഅ࢚੄ ޙઁ۽ ৮߷ೠ ݽ೐ গפݫ੉࣌ ࠛо
    Vertex Shader
    Input 00
    Uniforms
    SSBOs
    Samplers
    Input 01
    Input 16
    Input 09
    #ݽೝ
    #ݽೝ

    View Slide

  19. ੑ۱ਸ ؊ טܻݶ উؼө?
    GL_MAX_VERTEX_ATTRIBS
    params returns one value, the maximum number of 4-component generic vertex attributes accessible
    to a vertex shader. The value must be at least 16.
    https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glGet.xhtml

    View Slide

  20. CPUܳ ࢎਊ೧ࢲ ݽ೐ গפݫ੉࣌ ҅࢑
    Buffer 0
    Buffer 1
    Buffer 2
    Buffer 3
    ݽೝ ҅࢑
    #ॳۨ٘1
    ݽೝ ҅࢑
    #ॳۨ٘2
    ݽೝ ҅࢑
    #ॳۨ٘3
    ݽೝ ҅࢑
    #ॳۨ٘4
    Input 09 #ݽೝ
    Input 11 #ݽೝ
    Input 12 #ݽೝ
    Input 14 #ݽೝ

    View Slide

  21. CPUܳ ࢎਊ೧ࢲ ݽ೐ গפݫ੉࣌ ҅࢑
    ݒ਋ וܻ׮.

    View Slide

  22. ৵ CPUח וܾө?
    וܽѪ਷ ׼োೞ׮.
    ߡఫझо 4݅ѐ ӒܻҊ ఋѶ੉ 52ѐۄݶ दрࠂ੟ب O(NM)ী ੄೧ࢲ ড 2ߔ݅ߣ੄ ো࢑੉ ೙ਃೞ׮.
    FOR vertex_index = 0 TO vertex_count


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    END FOR

    View Slide

  23. GPUܳ ࢎਊೠ׮ݶ?
    ݽೝ੄ ҅࢑਷ ߡఫझ݃׮ ة݀੸੉ӝ ٸޙী ݽٚ ҅࢑੉ ߽۳੸ਵ۽ ࣻ೯ؼ ࣻ ੓׮.
    GPUܳ ࢎਊೠ׮ݶ दрࠂ੟بܳ O(M)ਵ۽ ઴ੌ ࣻ ੓׮.
    FOR vertex_index = 0 TO vertex_count


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    END FOR

    View Slide

  24. CPU৬ GPU੄ ର੉
    ݽೝ ҅࢑ ݽೝ ҅࢑
    CPU GPU

    View Slide

  25. SSBOܳ ੉ਊೠ GPU ݽೝ ҳഅ
    Vertex Shader
    Input 00
    Uniforms
    SSBOs
    Samplers
    Input 01
    Input 16
    Input 09

    View Slide

  26. SSBOܳ ੉ਊೠ GPU ݽೝ ҳഅ
    layout(std430, binding = 0) buffer morph_target_buffer {


    vec4 positions[][];


    } target_buffer;


    FOR target_index = 0 TO target_count


    position += target_weight[target_index]


    * target_buffer[target_index][vertex_index]


    END FOR


    // vertex_indexח thread_id৬ زੌ

    View Slide

  27. CPUܳ ࢎਊ೧ࢲ ݽ೐ গפݫ੉࣌ ҅࢑
    ࡅܰ׮! CPU ࢿמ 500ߓ(50.0msীࢲ 0.1ms۽ хࣗ) ੉࢚ ೱ࢚!

    View Slide

  28. ઁઑࢎী ٮۄ ߡఫझ ࣓੉؊ীࢲ SSBO ࢎਊ ࠛо
    GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS
    params returns one value, the maximum number of active shader storage blocks that may be
    accessed by a vertex shader.
    https://www.khronos.org/registry/OpenGL-Refpages/es3.1

    View Slide

  29. Why?
    “э਷ ӝӝীࢲ ৵ Vulkan਷ ૑ਗೞҊ ৵ OpenGL਷ ૑ਗਸ উೞחѢ૑?”

    View Slide

  30. ઁઑࢎী ٮۄ ߡఫझ ࣓੉؊ীࢲ SSBO ࢎਊ ࠛо
    Vulkan਷ ੍ӝ ੹ਊ SSBOܳ ૑ਗೞ૑݅ OpenGL਷ ੍ӝ ੹ਊ SSBOܳ ਤೠ झಖ੉ ੿੄غয ੓૑ ঋ׮.
    typedef struct VkPhysicalDeviceFeatures {


    // …


    VkBool32 vertexPipelineStoresAndAtomics;


    // …


    };


    View Slide

  31. OpenGL ੊झబ࣌ ઁউ

    View Slide

  32. OpenGL ੊झబ࣌ ઁউ
    OpenGL ESী ੍ӝ ੹ਊ SSBOܳ ਤೠ ੊झబ࣌ਸ ઁউೞҊ र਷ؘ যڌѱ ࢤп೧?

    View Slide

  33. OpenGL ੊झబ࣌ ઁউ
    OpenGL ESী ੍ӝ ੹ਊ SSBOܳ ਤೠ ੊झబ࣌ਸ ઁউೞҊ र਷ؘ যڌѱ ࢤп೧?
    ҡଳ਷ؘ? ARMীࢲ Ӓ ӝמਸ ઁҕೞחѤ য۵૑ ঋই.
    1

    View Slide

  34. OpenGL ੊झబ࣌ ઁউ
    OpenGL ESী ੍ӝ ੹ਊ SSBOܳ ਤೠ ੊झబ࣌ਸ ઁউೞҊ र਷ؘ যڌѱ ࢤп೧?
    ҡଳ਷ؘ? ARMীࢲ Ӓ ӝמਸ ઁҕೞחѤ য۵૑ ঋই.
    જ૑~ ೞ૑݅ OpenGL ESী नӏ ӝמ਷ ୶оغ૑ ঋই. Vulkan ॳݶ غਗ਼ই.
    1
    2

    View Slide

  35. Samplerܳ ੉ਊೠ GPU ݽೝ ҳഅ
    Vertex Shader
    Input 00
    Uniforms
    SSBOs
    Samplers
    Input 01
    Input 16
    Input 09

    View Slide

  36. SSBO৬ Sampler੄ ର੉
    Samplerܳ ੉ਊ೧ࢲ ؘ੉ఠܳ ۽٘ೡ ҃਋ SSBOࠁ׮ ড 20% וܻ׮.
    #Sampler
    #SSBO

    View Slide

  37. Samplerܳ ੉ਊೠ GPU ݽೝ ҳഅ

    View Slide

  38. গפݽ૑ۆ?
    ݽೝ੉ۆ?
    ҳഅ
    য়೑ࣗझ ӝৈ

    View Slide

  39. Filamentী ҳഅ ߈৔

    View Slide

  40. য়೑ࣗझ ӝৈ
    2֙݅ী ޙઁо ೧Ѿع׮.

    View Slide

  41. য়೑ࣗझ ӝৈ
    ࢚ਤ ஶ౟ܻ࠭ఠ۽ ١ӓ.

    View Slide

  42. য়೑ࣗझ੄ ࢎ੉٘ ੉ಖ౟
    ߈৔ റ ੹ࣁ҅ীࢲ ৢۄৡ ߡӒ ܻನ౟ ӒܻҊ ࣻ੿ റ উ੿ࢿ ഛࠁ.

    View Slide

  43. গפݽ૑ ѐߊী ؊ ҙब੉ ੓ਵद׮ݶ

    Yaft ѐߊ۽ ࠁח Cross Platform SDK ѐߊӝ
    ب ݆਷ ҙब ࠗఌ٘۰ਃ.

    View Slide

  44. E.O.D

    View Slide