<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lhh3520's 공간박스</title>
    <link>https://lhh3520.tistory.com/</link>
    <description>모바일 게임을 개발 하면서 익히게된 지식들, 
노하우들을 적어 놓은 개인 블로그 입니다.

방문해 주셔서 감사합니다 ^^</description>
    <language>ko</language>
    <pubDate>Thu, 16 Apr 2026 15:07:25 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lhh3520</managingEditor>
    <image>
      <title>lhh3520's 공간박스</title>
      <url>https://t1.daumcdn.net/cfile/tistory/242C2E4E5704D74F07</url>
      <link>https://lhh3520.tistory.com</link>
    </image>
    <item>
      <title>[MLAgents][Unity] 퍼포 더 코기 최신화</title>
      <link>https://lhh3520.tistory.com/387</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2018년인가..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ML-Agent 기능이 처음 나오고 나서 써보다가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일이 바빠서 잊고 있었는데 최근에 관심이 다시 생겨서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최신 버전으로 테스트를 좀 해보고 싶어졌습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2018년 당시에 샘플 프로젝트였던 &lt;br /&gt;퍼포 더 코기 라는게 있었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1659588084302&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;퍼포 더 코기 : Unity ML-에이전트 툴킷으로 탄생한 재롱둥이 | Unity Blog&quot; data-og-description=&quot;게임 제작은 게임 컨셉 및 로직 정의, 에셋 및 애니메이션 제작, NPC 동작 지정, 난이도 및 밸런스 조정, 출시 전 실제 플레이어를 통한 게임 테스트 등 여러 까다로운 작업이 수반되는 창조적 과&quot; data-og-host=&quot;blog.unity.com&quot; data-og-source-url=&quot;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&quot; data-og-url=&quot;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dgRqR8/hyPjeBom3l/HIx3BhIdGyaIxys3RKBR90/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675&quot;&gt;&lt;a href=&quot;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://blog.unity.com/kr/technology/puppo-the-corgi-cuteness-overload-with-the-unity-ml-agents-toolkit&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dgRqR8/hyPjeBom3l/HIx3BhIdGyaIxys3RKBR90/img.jpg?width=1200&amp;amp;height=675&amp;amp;face=0_0_1200_675');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;퍼포 더 코기 : Unity ML-에이전트 툴킷으로 탄생한 재롱둥이 | Unity Blog&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;게임 제작은 게임 컨셉 및 로직 정의, 에셋 및 애니메이션 제작, NPC 동작 지정, 난이도 및 밸런스 조정, 출시 전 실제 플레이어를 통한 게임 테스트 등 여러 까다로운 작업이 수반되는 창조적 과&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;blog.unity.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아직 프로젝트 코드가 남아 있었고 (4년 가까이 지났는데..)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어차피 테스트용 3D 모델을 구해야 했는데 잘 됐다 싶어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 프로젝트를 최신화해서 머신러닝을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;테스트해보는 것으로 가닥을 잡았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 기본적인 프로젝트를 생성합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(유니티 2021.2.5f1 기준)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;1424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bC5g5v/btrIToRwdhL/Ikjf2F8HcWnqPyhc3hQkB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bC5g5v/btrIToRwdhL/Ikjf2F8HcWnqPyhc3hQkB1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bC5g5v/btrIToRwdhL/Ikjf2F8HcWnqPyhc3hQkB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbC5g5v%2FbtrIToRwdhL%2FIkjf2F8HcWnqPyhc3hQkB1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2184&quot; height=&quot;1424&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;2184&quot; data-origin-height=&quot;1424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음 이전에 있던 프로젝트에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;필요한 리소스들을 (씬, 프리펩, 소스코드 같은 것들..)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가져옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;614&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy9qrA/btrIO22Xp4r/jrwXDNCEfJak9VLD8FKfsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy9qrA/btrIO22Xp4r/jrwXDNCEfJak9VLD8FKfsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy9qrA/btrIO22Xp4r/jrwXDNCEfJak9VLD8FKfsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy9qrA%2FbtrIO22Xp4r%2FjrwXDNCEfJak9VLD8FKfsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;462&quot; height=&quot;614&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;462&quot; data-origin-height=&quot;614&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물론 컴파일 에러가 바로 쏟아집니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;1234&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4wkI6/btrIToDYN4B/LGf4gIrk1AtRCq0zduuY2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4wkI6/btrIToDYN4B/LGf4gIrk1AtRCq0zduuY2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4wkI6/btrIToDYN4B/LGf4gIrk1AtRCq0zduuY2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4wkI6%2FbtrIToDYN4B%2FLGf4gIrk1AtRCq0zduuY2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;644&quot; height=&quot;1234&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;1234&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;예전에는 이런 아카데미와 브레인 개념이 있어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아카데미를 만들고 브레인들을 세팅해서 학습 시켜주는 구조였는데&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/N9EVw/btrIXxtd5cw/TI1a0xoZYqTMnOQ5brHEjk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/N9EVw/btrIXxtd5cw/TI1a0xoZYqTMnOQ5brHEjk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/N9EVw/btrIXxtd5cw/TI1a0xoZYqTMnOQ5brHEjk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FN9EVw%2FbtrIXxtd5cw%2FTI1a0xoZYqTMnOQ5brHEjk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1194&quot; height=&quot;498&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최신 버전에서는 이 구조가 바뀌고 그냥&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Agent 정도만 구현해서 세팅해 주면 되는듯합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(아주 간편해 졌습니다.)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그래서 일단 컴파일 에러가 나는 아카데미나 브레인 관련된&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;GameObject나 코드들은 지워 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Window -&amp;gt; Package Manager 에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;필요한 패키지들을 추가해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;ML Agents 추가.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;200&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVEH51/btrIK8WwNs7/uRzYghnKsbJQftB7h8Mznk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVEH51/btrIK8WwNs7/uRzYghnKsbJQftB7h8Mznk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVEH51/btrIK8WwNs7/uRzYghnKsbJQftB7h8Mznk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVEH51%2FbtrIK8WwNs7%2FuRzYghnKsbJQftB7h8Mznk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;200&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;200&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;TextMeshPro 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;66.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Jskhv/btrIPXNWJA1/0pN9ktSe6K27rfGwDPlQKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Jskhv/btrIPXNWJA1/0pN9ktSe6K27rfGwDPlQKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Jskhv/btrIPXNWJA1/0pN9ktSe6K27rfGwDPlQKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJskhv%2FbtrIPXNWJA1%2F0pN9ktSe6K27rfGwDPlQKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;188&quot; data-filename=&quot;66.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Cinemachine 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;77.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DSIda/btrITnriCxy/dS8rX9aAWJiOTTpV0AE7gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DSIda/btrITnriCxy/dS8rX9aAWJiOTTpV0AE7gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DSIda/btrITnriCxy/dS8rX9aAWJiOTTpV0AE7gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDSIda%2FbtrITnriCxy%2FdS8rX9aAWJiOTTpV0AE7gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;306&quot; data-filename=&quot;77.png&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Post Processing 추가&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;88.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUWBXE/btrIPYeZrsC/Kok4JmkzbeSo2m4m8NPlg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUWBXE/btrIPYeZrsC/Kok4JmkzbeSo2m4m8NPlg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUWBXE/btrIPYeZrsC/Kok4JmkzbeSo2m4m8NPlg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUWBXE%2FbtrIPYeZrsC%2FKok4JmkzbeSo2m4m8NPlg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;728&quot; height=&quot;192&quot; data-filename=&quot;88.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음 아래와 같이 새로운 MLAgent을 임포트 해줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;99.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mqPL0/btrIToqv3HG/x21TAWVpxZRV2rGBNvWcgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mqPL0/btrIToqv3HG/x21TAWVpxZRV2rGBNvWcgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mqPL0/btrIToqv3HG/x21TAWVpxZRV2rGBNvWcgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmqPL0%2FbtrIToqv3HG%2Fx21TAWVpxZRV2rGBNvWcgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;118&quot; data-filename=&quot;99.png&quot; data-origin-width=&quot;474&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 나머지 컴파일 에러 나는 것들을 최신화해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;요런거.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1010.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QHFbZ/btrIOwJ1XE1/p1Z2pskHulHSkd1MbIWz61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QHFbZ/btrIOwJ1XE1/p1Z2pskHulHSkd1MbIWz61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QHFbZ/btrIOwJ1XE1/p1Z2pskHulHSkd1MbIWz61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQHFbZ%2FbtrIOwJ1XE1%2Fp1Z2pskHulHSkd1MbIWz61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;412&quot; data-filename=&quot;1010.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또 요런거.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1111.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;50&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUupHH/btrIT81ZOcp/qm9Lj7bNxpB35mgQDOfZu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUupHH/btrIT81ZOcp/qm9Lj7bNxpB35mgQDOfZu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUupHH/btrIT81ZOcp/qm9Lj7bNxpB35mgQDOfZu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUupHH%2FbtrIT81ZOcp%2Fqm9Lj7bNxpB35mgQDOfZu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1106&quot; height=&quot;50&quot; data-filename=&quot;1111.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;50&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최신화된 DogAgent.cs의 코드&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(에러의 거의 대부분이 DogAgent.cs여서 이것만 첨부합니다.)&lt;/p&gt;
&lt;pre id=&quot;code_1659589419003&quot; class=&quot;csharp&quot; data-ke-language=&quot;csharp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using UnityEngine;

using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
using Unity.MLAgentsExamples;

public class DogAgent : Agent
{
    [HideInInspector]
    // The target the dog will run towards.
    public Transform target; 

    // These items should be set in the inspector
    [Header(&quot;Body Parts&quot;)] 
    public Transform mouthPosition;
    public Transform body;
    public Transform leg0_upper;
    public Transform leg1_upper;
    public Transform leg2_upper;
    public Transform leg3_upper;
    public Transform leg0_lower;
    public Transform leg1_lower;
    public Transform leg2_lower;
    public Transform leg3_lower;

    // These determine how the dog should be able to rotate around the y axis
    [Header(&quot;Body Rotation&quot;)] 
    public float maxTurnSpeed;
    public ForceMode turningForceMode;

    [Header(&quot;Sounds&quot;)]
    // If true, the dog will bark. 
    // Note : This should be turned off during training...unless you want to hear a dozen dogs barking for hours
    public bool canBark;
    // The clips to use for the barks of the dog
    public List&amp;lt;AudioClip&amp;gt; barkSounds = new List &amp;lt;AudioClip&amp;gt;();
	AudioSource audioSourceSFX;

    JointDriveController jdController;
    
    [HideInInspector]
    // This vector gives the position of the target relative to the position of the dog
	public Vector3 dirToTarget;
    // This float determines how much the dog will be rotating around the y axis
    float rotateBodyActionValue; 
    // Counts the number of steps until the next agent's decision will be made
    int decisionCounter;

    // [HideInInspector]
    public bool runningToItem;
    // [HideInInspector]
    public bool returningItem;

    void Awake()
    {
        // Audio Setup
        audioSourceSFX = body.gameObject.AddComponent&amp;lt;AudioSource&amp;gt;();
        audioSourceSFX.spatialBlend = .75f;
        audioSourceSFX.minDistance = .7f;
        audioSourceSFX.maxDistance = 5;
        if(canBark)
        {
            StartCoroutine(BarkBarkGame());
        }

        //Joint Drive Setup
        jdController = GetComponent&amp;lt;JointDriveController&amp;gt;();
        jdController.SetupBodyPart(body);
        jdController.SetupBodyPart(leg0_upper);
        jdController.SetupBodyPart(leg0_lower);
        jdController.SetupBodyPart(leg1_upper);
        jdController.SetupBodyPart(leg1_lower);
        jdController.SetupBodyPart(leg2_upper);
        jdController.SetupBodyPart(leg2_lower);
        jdController.SetupBodyPart(leg3_upper);
        jdController.SetupBodyPart(leg3_lower);

    }

    public override void OnEpisodeBegin()
    {
        foreach(var bodyPart in jdController.bodyPartsDict.Values)
        {
            bodyPart.Reset(bodyPart);
        }

        body.rotation = Quaternion.Euler(0, Random.Range(0f, 360f), 0f);
    }

    public override void Heuristic(in ActionBuffers actionsOut)
    {

    }

    /// &amp;lt;summary&amp;gt;
    /// Add relevant information on each body part to observations.
    /// &amp;lt;/summary&amp;gt;
    public void CollectObservationBodyPart(VectorSensor sensor, BodyPart bp)
    {
        sensor.AddObservation(bp.groundContact.touchingGround ? 1 : 0); // Is this bp touching the ground
                                                                        // 
        if(bp.rb.transform != body)
        {
            sensor.AddObservation(bp.currentXNormalizedRot);
            sensor.AddObservation(bp.currentYNormalizedRot);
            sensor.AddObservation(bp.currentZNormalizedRot);
            sensor.AddObservation(bp.currentStrength/jdController.maxJointForceLimit);
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// The method the agent uses to collect information about the environment
    /// &amp;lt;/summary&amp;gt;
    public override void CollectObservations(VectorSensor sensor)
    {
        sensor.AddObservation(dirToTarget.normalized);
        sensor.AddObservation(body.localPosition);
        sensor.AddObservation(jdController.bodyPartsDict[body].rb.velocity);
        sensor.AddObservation(jdController.bodyPartsDict[body].rb.angularVelocity);
        sensor.AddObservation(body.forward); //the capsule is rotated so this is local forward
        sensor.AddObservation(body.up); //the capsule is rotated so this is local forward

        foreach (var bodyPart in jdController.bodyPartsDict.Values)
        {
            CollectObservationBodyPart(sensor, bodyPart);
        }
    }


    /// &amp;lt;summary&amp;gt;
    /// Rotates the body of the agent around the y axis
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&quot;act&quot;&amp;gt; The amount by which the agent must rotate&amp;lt;/param&amp;gt;
    void RotateBody(float act)
    {
        float speed = Mathf.Lerp(0, maxTurnSpeed, Mathf.Clamp(act, 0, 1));
        Vector3 rotDir = dirToTarget; 
        rotDir.y = 0;
        // Adds a force on the front of the body
        jdController.bodyPartsDict[body].rb.AddForceAtPosition(
            rotDir.normalized * speed * Time.deltaTime, body.forward, turningForceMode); 
        // Adds a force on the back od the body
        jdController.bodyPartsDict[body].rb.AddForceAtPosition(
            -rotDir.normalized * speed * Time.deltaTime, -body.forward, turningForceMode); 
    }

    /// &amp;lt;summary&amp;gt;
    /// Allows the dog to bark
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;
    public IEnumerator BarkBarkGame()
    {   

        while(true)
        {
            //When we're returning the stick we should not bark because we have
            //a stick in our mouth :|&amp;gt;
            if(!returningItem)
            {
                //Choose one of the barking clips at random and play it.
                audioSourceSFX.PlayOneShot(barkSounds[Random.Range( 0, barkSounds.Count)], 1);
            }
            //Wait for a random amount of time (between 1 &amp;amp; 10 sec) until we bark again.
            yield return new WaitForSeconds(Random.Range(1, 10)); 
        }
    }

    /// &amp;lt;summary&amp;gt;
    /// The agent's action method. Is called at each decision and allows the agent to move
    /// &amp;lt;/summary&amp;gt;
    /// &amp;lt;param name=&quot;vectorAction&quot;&amp;gt; The actions that were determined by the policy&amp;lt;/param&amp;gt;
    /// &amp;lt;param name=&quot;textAction&quot;&amp;gt; The text action given by the policy&amp;lt;/param&amp;gt;
    public override void OnActionReceived(ActionBuffers actions)
    {
        var bpDict = jdController.bodyPartsDict;
        var vectorAction = actions.ContinuousActions;

        // Update joint drive target rotation
        bpDict[leg0_upper].SetJointTargetRotation(vectorAction[0], vectorAction[1], 0);
        bpDict[leg1_upper].SetJointTargetRotation(vectorAction[2], vectorAction[3], 0);
        bpDict[leg2_upper].SetJointTargetRotation(vectorAction[4], vectorAction[5], 0);
        bpDict[leg3_upper].SetJointTargetRotation(vectorAction[6], vectorAction[7], 0);
        bpDict[leg0_lower].SetJointTargetRotation(vectorAction[8], 0, 0);
        bpDict[leg1_lower].SetJointTargetRotation(vectorAction[9], 0, 0);
        bpDict[leg2_lower].SetJointTargetRotation(vectorAction[10], 0, 0);
        bpDict[leg3_lower].SetJointTargetRotation(vectorAction[11], 0, 0);

        // Update joint drive strength
        bpDict[leg0_upper].SetJointStrength(vectorAction[12]);
        bpDict[leg1_upper].SetJointStrength(vectorAction[13]);
        bpDict[leg2_upper].SetJointStrength(vectorAction[14]);
        bpDict[leg3_upper].SetJointStrength(vectorAction[15]);
        bpDict[leg0_lower].SetJointStrength(vectorAction[16]);
        bpDict[leg1_lower].SetJointStrength(vectorAction[17]);
        bpDict[leg2_lower].SetJointStrength(vectorAction[18]);
        bpDict[leg3_lower].SetJointStrength(vectorAction[19]);

        rotateBodyActionValue = vectorAction[20];
    }    

    /// &amp;lt;summary&amp;gt;
    /// Update the direction vector to the current target;
    /// &amp;lt;/summary&amp;gt;
    public void UpdateDirToTarget()
    {
        dirToTarget = target.position - jdController.bodyPartsDict[body].rb.position;

    }

    void FixedUpdate()
    {
        UpdateDirToTarget();

        if (decisionCounter == 0)
        {
            decisionCounter = 3;
            RequestDecision();
        }
        else
        {
            decisionCounter--;
        }

        RotateBody(rotateBodyActionValue); 

        // Energy Conservation
        // The dog is penalized by how strongly it rotates towards the target.
        // Without this penalty the dog tries to rotate as fast as it can at all times.
        var bodyRotationPenalty = -0.001f * rotateBodyActionValue;
        AddReward(bodyRotationPenalty);

        // Reward for moving towards the target
        RewardFunctionMovingTowards();
        // Penalty for time
        RewardFunctionTimePenalty();
    }
	
    /// &amp;lt;summary&amp;gt;
    /// Reward moving towards target &amp;amp; Penalize moving away from target.
    /// This reward incentivizes the dog to run as fast as it can towards the target,
    /// and decentivizes running away from the target.
    /// &amp;lt;/summary&amp;gt;
    void RewardFunctionMovingTowards()
    {

		float movingTowardsDot = Vector3.Dot(
		    jdController.bodyPartsDict[body].rb.velocity, dirToTarget.normalized); 
        AddReward(0.01f * movingTowardsDot);
    }


    /// &amp;lt;summary&amp;gt;
    /// Time penalty
    /// The dog gets a pentalty each step so that it tries to finish 
    /// as quickly as possible.
    /// &amp;lt;/summary&amp;gt;
    void RewardFunctionTimePenalty()
    {
        AddReward(- 0.001f);  //-0.001f chosen by experimentation.
    }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;컴파일 에러를 없애고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;FetchTrainingScene 씬을 열어 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1212.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;184&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIg9r8/btrIPXNYnLS/LEIeJnTFsSp3gLBilBHVZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIg9r8/btrIPXNYnLS/LEIeJnTFsSp3gLBilBHVZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIg9r8/btrIPXNYnLS/LEIeJnTFsSp3gLBilBHVZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIg9r8%2FbtrIPXNYnLS%2FLEIeJnTFsSp3gLBilBHVZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;184&quot; data-filename=&quot;1212.png&quot; data-origin-width=&quot;412&quot; data-origin-height=&quot;184&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 트레이닝 그룹 1개만 남기고&lt;br /&gt;기존에 있던 그룹들은 다 지워줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1313.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1290&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldEpQ/btrIWMEb7Eu/WjGzpferylJDutb1OJYAw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldEpQ/btrIWMEb7Eu/WjGzpferylJDutb1OJYAw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldEpQ/btrIWMEb7Eu/WjGzpferylJDutb1OJYAw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FldEpQ%2FbtrIWMEb7Eu%2FWjGzpferylJDutb1OJYAw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;1290&quot; data-filename=&quot;1313.png&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;1290&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;트레이닝 그룹 아래에 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;CORGI 가 있는데 이걸 선택해 주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1414.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;164&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMPWvx/btrIRGLUvS3/gOxEGXyVBrAPubo2jlTjEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMPWvx/btrIRGLUvS3/gOxEGXyVBrAPubo2jlTjEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMPWvx/btrIRGLUvS3/gOxEGXyVBrAPubo2jlTjEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMPWvx%2FbtrIRGLUvS3%2FgOxEGXyVBrAPubo2jlTjEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;164&quot; data-filename=&quot;1414.png&quot; data-origin-width=&quot;300&quot; data-origin-height=&quot;164&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;인스펙터로 가서 끊어진 데이터들을 새로 연결해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1515.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;2514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tkRDf/btrIVhqUkHo/UtpKH0qeShW96gEdTOCjN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tkRDf/btrIVhqUkHo/UtpKH0qeShW96gEdTOCjN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tkRDf/btrIVhqUkHo/UtpKH0qeShW96gEdTOCjN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtkRDf%2FbtrIVhqUkHo%2FUtpKH0qeShW96gEdTOCjN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;2514&quot; data-filename=&quot;1515.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;2514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 실행을 해보면 코기가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;움찔움찔 움직이는 걸 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(아직 학습이 안되서 거의 가만히 있음..)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1616.gif&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djGyCf/btrIPWIhYY1/JpuxSPj9Vyw3MCWVMvOCrk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djGyCf/btrIPWIhYY1/JpuxSPj9Vyw3MCWVMvOCrk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djGyCf/btrIPWIhYY1/JpuxSPj9Vyw3MCWVMvOCrk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/djGyCf/btrIPWIhYY1/JpuxSPj9Vyw3MCWVMvOCrk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;900&quot; height=&quot;810&quot; data-filename=&quot;1616.gif&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 학습을 위해서 위의 트레이닝 그룹을 여러 개 복사해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1717.png&quot; data-origin-width=&quot;1984&quot; data-origin-height=&quot;1296&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rhDZ1/btrIWNQFwaB/pHd4mnWO62k3WOKdH2uvo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rhDZ1/btrIWNQFwaB/pHd4mnWO62k3WOKdH2uvo0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rhDZ1/btrIWNQFwaB/pHd4mnWO62k3WOKdH2uvo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrhDZ1%2FbtrIWNQFwaB%2FpHd4mnWO62k3WOKdH2uvo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1984&quot; height=&quot;1296&quot; data-filename=&quot;1717.png&quot; data-origin-width=&quot;1984&quot; data-origin-height=&quot;1296&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 샘플이나 기존에 있던 프로젝트에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;yaml 파일을 복사해 와서 이름을 바꿔주고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습 항목 설정을 적절히 맞춰 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1818.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;756&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ceUDrS/btrITnLEGC6/927ZX2MTsVKPbFNI54vnM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ceUDrS/btrITnLEGC6/927ZX2MTsVKPbFNI54vnM0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ceUDrS/btrITnLEGC6/927ZX2MTsVKPbFNI54vnM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FceUDrS%2FbtrITnLEGC6%2F927ZX2MTsVKPbFNI54vnM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;554&quot; height=&quot;756&quot; data-filename=&quot;1818.png&quot; data-origin-width=&quot;554&quot; data-origin-height=&quot;756&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음 아나콘다를 실행해서 mlagents&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실행 환경을 적용시켜 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/369?category=839963&quot;&gt;https://lhh3520.tistory.com/369?category=839963&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1659590988107&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Mac] Mac에서 아나콘다 설치하는 방법&quot; data-og-description=&quot;머신 러닝을 배우고 테스트하는데 파이썬과 텐서 플로가 최소한으로 필요한데 이러한 것들을 좀 더 쉽게 관리할 수 있도록 도와주는 프로그램입니다. 일단 아래에 아나콘다 홈페이지로 갑니다.&quot; data-og-host=&quot;lhh3520.tistory.com&quot; data-og-source-url=&quot;https://lhh3520.tistory.com/369?category=839963&quot; data-og-url=&quot;https://lhh3520.tistory.com/369&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dRD2F3/hyPjeOV7KY/8GvBOpHX26XBUCkLgdKGf0/img.png?width=530&amp;amp;height=520&amp;amp;face=0_0_530_520,https://scrap.kakaocdn.net/dn/cqF5S5/hyPjnZpmTJ/pr7Gvo1munTWtjdOwCG2W0/img.png?width=530&amp;amp;height=520&amp;amp;face=0_0_530_520,https://scrap.kakaocdn.net/dn/cpqPNp/hyPjm0t9MH/noY4vtDdEqFUiHB1iJP6A1/img.png?width=1520&amp;amp;height=1346&amp;amp;face=0_0_1520_1346&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/369?category=839963&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lhh3520.tistory.com/369?category=839963&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dRD2F3/hyPjeOV7KY/8GvBOpHX26XBUCkLgdKGf0/img.png?width=530&amp;amp;height=520&amp;amp;face=0_0_530_520,https://scrap.kakaocdn.net/dn/cqF5S5/hyPjnZpmTJ/pr7Gvo1munTWtjdOwCG2W0/img.png?width=530&amp;amp;height=520&amp;amp;face=0_0_530_520,https://scrap.kakaocdn.net/dn/cpqPNp/hyPjm0t9MH/noY4vtDdEqFUiHB1iJP6A1/img.png?width=1520&amp;amp;height=1346&amp;amp;face=0_0_1520_1346');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Mac] Mac에서 아나콘다 설치하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;머신 러닝을 배우고 테스트하는데 파이썬과 텐서 플로가 최소한으로 필요한데 이러한 것들을 좀 더 쉽게 관리할 수 있도록 도와주는 프로그램입니다. 일단 아래에 아나콘다 홈페이지로 갑니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lhh3520.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 위에서 만들었던 yaml 파일을 가지고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;mlagents-learn 명령어를 실행해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1659590736086&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;mlagents-learn config/Corgi.yaml --run-id=Corgi01&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실행하면 아래와 같이 유니티 로고가 그려지고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습을 위한 연결이 완료 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1919.png&quot; data-origin-width=&quot;2108&quot; data-origin-height=&quot;994&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8Mh14/btrIToqA8mG/gsjhMn7thd2Bldf3NEuZtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8Mh14/btrIToqA8mG/gsjhMn7thd2Bldf3NEuZtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8Mh14/btrIToqA8mG/gsjhMn7thd2Bldf3NEuZtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8Mh14%2FbtrIToqA8mG%2FgsjhMn7thd2Bldf3NEuZtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2108&quot; height=&quot;994&quot; data-filename=&quot;1919.png&quot; data-origin-width=&quot;2108&quot; data-origin-height=&quot;994&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 이 상태로 에디터로 돌아가서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;플레이를 시켜 학습을 진행해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;꼬물꼬물 하면서 뭔가 학습하는 모습.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2020.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAgLwJ/btrIXQ7erfX/YE6vbrf1kwAYJ2VdK0WHKK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAgLwJ/btrIXQ7erfX/YE6vbrf1kwAYJ2VdK0WHKK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAgLwJ/btrIXQ7erfX/YE6vbrf1kwAYJ2VdK0WHKK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bAgLwJ/btrIXQ7erfX/YE6vbrf1kwAYJ2VdK0WHKK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;720&quot; data-filename=&quot;2020.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습이 완료되고 나면 프로젝트 폴더 안 results 폴더에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;.onnx 파일이 생성됩니다. (이전엔 .nn 이었는데 바뀌었네요)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2121.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emnA0F/btrIUl7ZJu1/rG2VyxQj9awwdVHrKfmwak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emnA0F/btrIUl7ZJu1/rG2VyxQj9awwdVHrKfmwak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emnA0F/btrIUl7ZJu1/rG2VyxQj9awwdVHrKfmwak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FemnA0F%2FbtrIUl7ZJu1%2FrG2VyxQj9awwdVHrKfmwak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1474&quot; height=&quot;152&quot; data-filename=&quot;2121.png&quot; data-origin-width=&quot;1474&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습이 어떻게 이루어졌는지 그래프로 볼 수도 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;콘솔에서 아래와 같이 실행하고&lt;/p&gt;
&lt;pre id=&quot;code_1659593473579&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;tensorboard --logdir results --port 6006&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;웹 브라우저에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;http://localhost:6006/&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로 접속하면 텐서 보드를 보여줍니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2222.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfKViO/btrIK7XHjpf/5dhePrsgkP1c5TVJ2vvPsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfKViO/btrIK7XHjpf/5dhePrsgkP1c5TVJ2vvPsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfKViO/btrIK7XHjpf/5dhePrsgkP1c5TVJ2vvPsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfKViO%2FbtrIK7XHjpf%2F5dhePrsgkP1c5TVJ2vvPsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1434&quot; height=&quot;1446&quot; data-filename=&quot;2222.png&quot; data-origin-width=&quot;1434&quot; data-origin-height=&quot;1446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습이 다 완료되었으니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 다시 유니티로 돌아와서 아까 생성된 .onnx 파일을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트 폴더 안으로 옮겨 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2323.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;1972&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCyw6B/btrIWMqK1NK/0Fjhbdbokcy4KsOXi6LJW0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCyw6B/btrIWMqK1NK/0Fjhbdbokcy4KsOXi6LJW0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCyw6B/btrIWMqK1NK/0Fjhbdbokcy4KsOXi6LJW0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCyw6B%2FbtrIWMqK1NK%2F0Fjhbdbokcy4KsOXi6LJW0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;902&quot; height=&quot;1972&quot; data-filename=&quot;2323.png&quot; data-origin-width=&quot;902&quot; data-origin-height=&quot;1972&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그다음 DogAgent에게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;학습된 모델을 적용시켜 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2424.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1810&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZfMc/btrIXwOJvhF/WUlkkqPQ78ButgwwKZAaM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZfMc/btrIXwOJvhF/WUlkkqPQ78ButgwwKZAaM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZfMc/btrIXwOJvhF/WUlkkqPQ78ButgwwKZAaM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZfMc%2FbtrIXwOJvhF%2FWUlkkqPQ78ButgwwKZAaM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1228&quot; height=&quot;1810&quot; data-filename=&quot;2424.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;1810&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 이제 실행을 시켜 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;약간 어리숙(?) 하긴 하지만 잘 가져오는 걸 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(학습량이나 시간을 늘려주면 훨씬 좋아지겠네요)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2525.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;451&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bW4sfD/btrIXPN66Ch/qwM6EEvzDAHywhAkq9WFFK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bW4sfD/btrIXPN66Ch/qwM6EEvzDAHywhAkq9WFFK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bW4sfD/btrIXPN66Ch/qwM6EEvzDAHywhAkq9WFFK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bW4sfD/btrIXPN66Ch/qwM6EEvzDAHywhAkq9WFFK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;451&quot; data-filename=&quot;2525.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;451&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/머신 러닝</category>
      <category>c#</category>
      <category>ML Agents</category>
      <category>Unity</category>
      <category>딥러닝</category>
      <category>머신러닝</category>
      <category>유니티</category>
      <category>최신화</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/387</guid>
      <comments>https://lhh3520.tistory.com/387#entry387comment</comments>
      <pubDate>Thu, 4 Aug 2022 15:00:57 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] 유니티 Job System 간단 테스트</title>
      <link>https://lhh3520.tistory.com/386</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 2018.1 버전에서 공개된&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;잡 시스템 (Job System)에 대해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;공부도 할 겸 테스트 진행해 보았습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;간단하게 말하면 멀티 스레드를 쉽게 이용할 수 있게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;만들어 놓은 시스템 정도로 생각하면 될 것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스레드를 사용하려고 하면 Race Condition이나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Context Switching 등등 신경 써야 될 것들이 많은데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그런 것 신경 안 쓰고 멀티 스레드 기능을 활용할 수 있으면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;훨씬 편하고 좋을 것 같긴 하네요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 아래 사이트를 참조해서 테스트했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(샘플용 메시도 제공해 주고 설명도 아주 잘 되어 있습니다)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650781172244&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Unity Job System and Burst Compiler: Getting Started&quot; data-og-description=&quot;In this tutorial, you&amp;rsquo;ll learn how to use Unity&amp;rsquo;s Job System and Burst compiler to create efficient code to simulate water filled with swimming fish.&quot; data-og-host=&quot;www.raywenderlich.com&quot; data-og-source-url=&quot;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&quot; data-og-url=&quot;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/nNx2P/hyN8wczbGw/TNbuAFB1IvQqKnsod3rZZk/img.png?width=1800&amp;amp;height=900&amp;amp;face=0_0_1800_900,https://scrap.kakaocdn.net/dn/cTTbvO/hyN9UCSwDg/03j7cU52LiWt9Q9FapSB6k/img.png?width=1800&amp;amp;height=900&amp;amp;face=0_0_1800_900&quot;&gt;&lt;a href=&quot;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.raywenderlich.com/7880445-unity-job-system-and-burst-compiler-getting-started&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/nNx2P/hyN8wczbGw/TNbuAFB1IvQqKnsod3rZZk/img.png?width=1800&amp;amp;height=900&amp;amp;face=0_0_1800_900,https://scrap.kakaocdn.net/dn/cTTbvO/hyN9UCSwDg/03j7cU52LiWt9Q9FapSB6k/img.png?width=1800&amp;amp;height=900&amp;amp;face=0_0_1800_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Unity Job System and Burst Compiler: Getting Started&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;In this tutorial, you&amp;rsquo;ll learn how to use Unity&amp;rsquo;s Job System and Burst compiler to create efficient code to simulate water filled with swimming fish.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.raywenderlich.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 2021.2.5f1 버전&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기준 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단.. 기본 프로젝트 세팅을 해주고&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;00.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/W7uWk/btrAgqwYetQ/6SvgIvoxwUqgvcvTLXKZsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/W7uWk/btrAgqwYetQ/6SvgIvoxwUqgvcvTLXKZsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/W7uWk/btrAgqwYetQ/6SvgIvoxwUqgvcvTLXKZsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FW7uWk%2FbtrAgqwYetQ%2F6SvgIvoxwUqgvcvTLXKZsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;224&quot; height=&quot;218&quot; data-filename=&quot;00.png&quot; data-origin-width=&quot;224&quot; data-origin-height=&quot;218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파도 느낌을 만들 샘플 메시를 불러옵니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;1220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pegpa/btrAdwZdTB0/A7veIOhOcHeK1nOnGwZzBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pegpa/btrAdwZdTB0/A7veIOhOcHeK1nOnGwZzBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pegpa/btrAdwZdTB0/A7veIOhOcHeK1nOnGwZzBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPegpa%2FbtrAdwZdTB0%2FA7veIOhOcHeK1nOnGwZzBK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;750&quot; height=&quot;768&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;1220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그 다음.. 잡 시스템을 사용하기 위해서는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래의 3가지 패키지가 필요합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Burst&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Jobs&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Mathematics&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Window -&amp;gt; Package Manager&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;로 가서 추가해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rXsAh/btrAjp49ZK5/U3d8DiWXKybSRZOhJd525k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rXsAh/btrAjp49ZK5/U3d8DiWXKybSRZOhJd525k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rXsAh/btrAjp49ZK5/U3d8DiWXKybSRZOhJd525k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrXsAh%2FbtrAjp49ZK5%2FU3d8DiWXKybSRZOhJd525k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;1426&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0mbBD/btrAb8D08sm/cvGxGCTfYYi065850km7b1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0mbBD/btrAb8D08sm/cvGxGCTfYYi065850km7b1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0mbBD/btrAb8D08sm/cvGxGCTfYYi065850km7b1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0mbBD%2FbtrAb8D08sm%2FcvGxGCTfYYi065850km7b1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1824&quot; height=&quot;1426&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;1824&quot; data-origin-height=&quot;1426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Burst, Mathematics 추가했고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;현재 테스트 중인데 2021 기준으로 Jobs는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이미 포함되어 있어서 건너뜁니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 다시 돌아와서 처음 추가한 메시의 와이어 프레임을 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;엄청 많은 버텍스들이 있는 걸 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1284&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhxhWO/btrAddExXOT/n1RooDqAKvCYgcB7uiN08K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhxhWO/btrAddExXOT/n1RooDqAKvCYgcB7uiN08K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhxhWO/btrAddExXOT/n1RooDqAKvCYgcB7uiN08K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhxhWO%2FbtrAddExXOT%2Fn1RooDqAKvCYgcB7uiN08K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;780&quot; height=&quot;761&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;1284&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;요 버텍스 들의 위치들을 변경해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파도 느낌을 줄 수 있게 해줄 예정입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;처음으로 잡 시스템을 쓰지 않고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 Update에서 계산해서 돌려 보도록 코드를 짜봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1650782130321&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;using System.Collections;
using System.Collections.Generic;
using Unity.Mathematics;
using UnityEngine;

public class WaveGeneratorUpdate : MonoBehaviour
{
    [Header(&quot;Wave Parameters&quot;)]
    public float waveScale;
    public float waveOffsetSpeed;
    public float waveHeight;

    [Header(&quot;References and Prefabs&quot;)]
    public MeshFilter waterMeshFilter;
    private Mesh waterMesh;

    private List&amp;lt;Vector3&amp;gt; waterVertices;
    private List&amp;lt;Vector3&amp;gt; waterNormals;

    private void Start()
    {
        waterMesh = waterMeshFilter.mesh;
        waterMesh.MarkDynamic();

        waterVertices = new List&amp;lt;Vector3&amp;gt;(waterMesh.vertices);
        waterNormals = new List&amp;lt;Vector3&amp;gt;(waterMesh.normals);
    }

    private void Update()
    {
        MakeNoise();

        waterMesh.SetVertices(waterVertices);

        waterMesh.RecalculateNormals();
    }

    private void MakeNoise()
    {
        for (int ii = 0; ii &amp;lt; waterVertices.Count; ii++)
        {
            if (waterNormals[ii].z &amp;lt;= 0f)
                continue;

            var vertex = waterVertices[ii];

            var x = vertex.x * waveScale + waveOffsetSpeed * Time.time;
            var y = vertex.y * waveScale + waveOffsetSpeed * Time.time;
            float2 pos = math.float2(x, y);
            float noiseValue = noise.snoise(pos);

            waterVertices[ii] = new Vector3(vertex.x, vertex.y, noiseValue * waveHeight + 0.3f);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;파도의 운동은 여러 입자들이 순차적으로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;x좌표는 Sin값, y좌표는 Cos값 정도 넣어서 원운동을 연속적으로 하면서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;느낌을 내줄 수 있는데 위 예제에서는 간단히 z 값만 바꿔줬네요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;하여튼.. 이렇게 하고 실행해 보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Update.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZCX9W/btrAhdjQ9oI/aMgfrGLgZaLPhH0lWXGpNk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZCX9W/btrAhdjQ9oI/aMgfrGLgZaLPhH0lWXGpNk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZCX9W/btrAhdjQ9oI/aMgfrGLgZaLPhH0lWXGpNk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/ZCX9W/btrAhdjQ9oI/aMgfrGLgZaLPhH0lWXGpNk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;477&quot; data-filename=&quot;Update.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대략 30~35 프레임 정도 나오는 걸 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 비교를 위해 잡 시스템을 사용한 코드로 변경해 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1650782495718&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * Copyright (c) 2020 Razeware LLC
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the &quot;Software&quot;), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * Notwithstanding the foregoing, you may not use, copy, modify, merge, publish, 
 * distribute, sublicense, create a derivative work, and/or sell copies of the 
 * Software in any work that is designed, intended, or marketed for pedagogical or 
 * instructional purposes related to programming, coding, application development, 
 * or information technology.  Permission for such use, copying, modification,
 * merger, publication, distribution, sublicensing, creation of derivative works, 
 * or sale is expressly withheld.
 *    
 * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Jobs;
using Unity.Collections;
using Unity.Jobs;
using Unity.Mathematics;

public class WaveGeneratorJobs : MonoBehaviour
{
    [Header(&quot;Wave Parameters&quot;)]
    public float waveScale;
    public float waveOffsetSpeed;
    public float waveHeight;

    [Header(&quot;References and Prefabs&quot;)]
    public MeshFilter waterMeshFilter;
    private Mesh waterMesh;

    private NativeArray&amp;lt;Vector3&amp;gt; waterVertices;
    private NativeArray&amp;lt;Vector3&amp;gt; waterNormals;

    private JobHandle meshModificationJobHandle;
    private UpdateMeshJob meshModificationJob;

    private void Start()
    {
        waterMesh = waterMeshFilter.mesh;
        waterMesh.MarkDynamic();

        waterVertices = new NativeArray&amp;lt;Vector3&amp;gt;(waterMesh.vertices, Allocator.Persistent);
        waterNormals = new NativeArray&amp;lt;Vector3&amp;gt;(waterMesh.normals, Allocator.Persistent);
    }

    private void Update()
    {
        meshModificationJob = new UpdateMeshJob()
        {
            vertices = waterVertices,
            normals = waterNormals,
            offsetSpeed = waveOffsetSpeed,
            time = Time.time,
            scale = waveScale,
            height = waveHeight
        };

        meshModificationJobHandle = meshModificationJob.Schedule(waterVertices.Length, 64);
    }

    private void LateUpdate()
    {
        meshModificationJobHandle.Complete();

        waterMesh.SetVertices(meshModificationJob.vertices);

        waterMesh.RecalculateNormals();
    }

    private void OnDestroy()
    {
        waterVertices.Dispose();
        waterNormals.Dispose();
    }

    // 실제 Job 이 실행되는 구조체
    private struct UpdateMeshJob : IJobParallelFor
    {
        public NativeArray&amp;lt;Vector3&amp;gt; vertices;

        [ReadOnly]
        public NativeArray&amp;lt;Vector3&amp;gt; normals;

        public float offsetSpeed;
        public float scale;
        public float height;

        public float time;

        private float Noise(float x, float y)
        {
            float2 pos = math.float2(x, y);
            return noise.snoise(pos);
        }

        public void Execute(int i)
        {
            if (normals[i].z &amp;gt; 0f)
            {
                var vertex = vertices[i];
                float noiseValue = Noise(vertex.x * scale + offsetSpeed * time, vertex.y * scale + offsetSpeed * time);
                vertices[i] = new Vector3(vertex.x, vertex.y, noiseValue * height + 0.3f);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 적용하고 실행해 보면..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;jobs.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wUnSV/btrAdZtkXcp/XnKC1HbOZHi9tQkTark7nK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wUnSV/btrAdZtkXcp/XnKC1HbOZHi9tQkTark7nK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wUnSV/btrAdZtkXcp/XnKC1HbOZHi9tQkTark7nK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/wUnSV/btrAdZtkXcp/XnKC1HbOZHi9tQkTark7nK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;477&quot; data-filename=&quot;jobs.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대략 80 정도의 프레임이 나오면서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확실히 성능 향상이 있는 걸 보여줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 메인 스레드 하나를 쓰면서 병목현상을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일으키는 것보다는 멀티 스레드로 분산해서 처리하니&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확실히 효율적이긴 한 듯합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;추가적으로 성능 향상을 시켜주는 기능이 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;버스트 컴파일러를 이용하는 것입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;LLVM 컴파일러 프레임워크를 바탕으로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;고급 최적화를 사용해서 성능을 효율적으로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;활용하게 해주는 기술입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그럼 이제 버스트 컴파일러를 사용하도록 코드를 짜줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1650783015918&quot; class=&quot;cs&quot; data-ke-language=&quot;cs&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/*
 * Copyright (c) 2020 Razeware LLC
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the &quot;Software&quot;), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * Notwithstanding the foregoing, you may not use, copy, modify, merge, publish, 
 * distribute, sublicense, create a derivative work, and/or sell copies of the 
 * Software in any work that is designed, intended, or marketed for pedagogical or 
 * instructional purposes related to programming, coding, application development, 
 * or information technology.  Permission for such use, copying, modification,
 * merger, publication, distribution, sublicensing, creation of derivative works, 
 * or sale is expressly withheld.
 *    
 * THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 */

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Jobs;
using Unity.Collections;
using Unity.Burst;
using Unity.Jobs;
using Unity.Mathematics;

public class WaveGeneratorBurst : MonoBehaviour
{
    [Header(&quot;Wave Parameters&quot;)]
    public float waveScale;
    public float waveOffsetSpeed;
    public float waveHeight;

    [Header(&quot;References and Prefabs&quot;)]
    public MeshFilter waterMeshFilter;
    private Mesh waterMesh;

    private NativeArray&amp;lt;Vector3&amp;gt; waterVertices;
    private NativeArray&amp;lt;Vector3&amp;gt; waterNormals;

    private JobHandle meshModificationJobHandle;
    private UpdateMeshJobWithBurst meshModificationJob;

    private void Start()
    {
        waterMesh = waterMeshFilter.mesh;
        waterMesh.MarkDynamic();

        waterVertices = new NativeArray&amp;lt;Vector3&amp;gt;(waterMesh.vertices, Allocator.Persistent);
        waterNormals = new NativeArray&amp;lt;Vector3&amp;gt;(waterMesh.normals, Allocator.Persistent);
    }

    private void Update()
    {
        meshModificationJob = new UpdateMeshJobWithBurst()
        {
            vertices = waterVertices,
            normals = waterNormals,
            offsetSpeed = waveOffsetSpeed,
            time = Time.time,
            scale = waveScale,
            height = waveHeight
        };

        meshModificationJobHandle = meshModificationJob.Schedule(waterVertices.Length, 64);
    }

    private void LateUpdate()
    {
        meshModificationJobHandle.Complete();

        waterMesh.SetVertices(meshModificationJob.vertices);

        waterMesh.RecalculateNormals();
    }

    private void OnDestroy()
    {
        waterVertices.Dispose();
        waterNormals.Dispose();
    }

    [BurstCompile]  // &amp;lt;-- 요 어트리뷰트만 추가해 주면 끝.
    private struct UpdateMeshJobWithBurst : IJobParallelFor
    {
        public NativeArray&amp;lt;Vector3&amp;gt; vertices;

        [ReadOnly]
        public NativeArray&amp;lt;Vector3&amp;gt; normals;

        public float offsetSpeed;
        public float scale;
        public float height;

        public float time;

        private float Noise(float x, float y)
        {
            float2 pos = math.float2(x, y);
            return noise.snoise(pos);
        }

        public void Execute(int i)
        {
            if (normals[i].z &amp;gt; 0f)
            {
                var vertex = vertices[i];
                float noiseValue = Noise(vertex.x * scale + offsetSpeed * time, vertex.y * scale + offsetSpeed * time);
                vertices[i] = new Vector3(vertex.x, vertex.y, noiseValue * height + 0.3f);
            }
        }
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;사용법이 정말 쉬운데..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그냥 기존에 만들어진 잡 구조체 위에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[BurstComplie] 어트리뷰트만 추가해 주면 끝입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 실행해 보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;burst compile.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;485&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/155MV/btrAeI46pNw/45sBKjcx8qLIrqNsrjbNfk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/155MV/btrAeI46pNw/45sBKjcx8qLIrqNsrjbNfk/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/155MV/btrAeI46pNw/45sBKjcx8qLIrqNsrjbNfk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/155MV/btrAeI46pNw/45sBKjcx8qLIrqNsrjbNfk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;800&quot; height=&quot;485&quot; data-filename=&quot;burst compile.gif&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;485&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대략 110 ~ 120 프레임을 왔다 갔다 하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확실히 성능 향상이 있네요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티의 잡 시스템 기능을 테스트해보면서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭔가 대량의 연산이 필요한 곳에 적절히 사용하면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;확실히 성능 면에서 효과를 볼 수 있을 것 같습니다.&lt;/p&gt;</description>
      <category>Programming/Unity3D</category>
      <category>Burst Compile</category>
      <category>dots</category>
      <category>Job System</category>
      <category>Unity</category>
      <category>버스트</category>
      <category>버스트컴파일러</category>
      <category>쉐이더</category>
      <category>유니티</category>
      <category>잡</category>
      <category>잡시스템</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/386</guid>
      <comments>https://lhh3520.tistory.com/386#entry386comment</comments>
      <pubDate>Sun, 24 Apr 2022 16:02:44 +0900</pubDate>
    </item>
    <item>
      <title>Neople</title>
      <link>https://lhh3520.tistory.com/385</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Neople&amp;nbsp;Career&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(참여 프로젝트)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모바일 던파&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.09.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOl4Rs/btrAcuMFKsE/CBNs20QIB8cxzOcfN30Yvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOl4Rs/btrAcuMFKsE/CBNs20QIB8cxzOcfN30Yvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOl4Rs/btrAcuMFKsE/CBNs20QIB8cxzOcfN30Yvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOl4Rs%2FbtrAcuMFKsE%2FCBNs20QIB8cxzOcfN30Yvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1906&quot; height=&quot;1072&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.09.png&quot; data-origin-width=&quot;1906&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.20.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1072&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bktZSo/btrAdX1qrW6/vzqD232qL2v3pU1Hq87KQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bktZSo/btrAdX1qrW6/vzqD232qL2v3pU1Hq87KQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bktZSo/btrAdX1qrW6/vzqD232qL2v3pU1Hq87KQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbktZSo%2FbtrAdX1qrW6%2FvzqD232qL2v3pU1Hq87KQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1912&quot; height=&quot;1072&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.20.png&quot; data-origin-width=&quot;1912&quot; data-origin-height=&quot;1072&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.27.png&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1070&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6r8U0/btrAc7i9nS0/2lJ2gSlINt48uDQFry1D51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6r8U0/btrAc7i9nS0/2lJ2gSlINt48uDQFry1D51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6r8U0/btrAc7i9nS0/2lJ2gSlINt48uDQFry1D51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6r8U0%2FbtrAc7i9nS0%2F2lJ2gSlINt48uDQFry1D51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1910&quot; height=&quot;1070&quot; data-filename=&quot;스크린샷 2022-04-22 오후 9.03.27.png&quot; data-origin-width=&quot;1910&quot; data-origin-height=&quot;1070&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다운로드 링크&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[ PC 버전 ]&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://dnfm.nexon.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://dnfm.nexon.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650629089777&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;던전앤파이터 모바일&quot; data-og-description=&quot;최초 레이드 '로터스 레이드' Update, coming soon&quot; data-og-host=&quot;dnfm.nexon.com&quot; data-og-source-url=&quot;https://dnfm.nexon.com/&quot; data-og-url=&quot;https://dnfm.nexon.com/event/Event/2022/0414/teaser1&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/sty7C/hyN8xVCv1u/ykSAnhXS44nkuXxZOqCnMK/img.jpg?width=560&amp;amp;height=292&amp;amp;face=0_0_560_292,https://scrap.kakaocdn.net/dn/4kYPM/hyN8F7hoMA/mZQerTkM6SUoyOHCw1H3c0/img.jpg?width=560&amp;amp;height=292&amp;amp;face=0_0_560_292&quot;&gt;&lt;a href=&quot;https://dnfm.nexon.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://dnfm.nexon.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/sty7C/hyN8xVCv1u/ykSAnhXS44nkuXxZOqCnMK/img.jpg?width=560&amp;amp;height=292&amp;amp;face=0_0_560_292,https://scrap.kakaocdn.net/dn/4kYPM/hyN8F7hoMA/mZQerTkM6SUoyOHCw1H3c0/img.jpg?width=560&amp;amp;height=292&amp;amp;face=0_0_560_292');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;던전앤파이터 모바일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;최초 레이드 '로터스 레이드' Update, coming soon&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;dnfm.nexon.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[ iOS 앱스토어 ]&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650629103844&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;&amp;lrm;던전앤파이터 모바일&quot; data-og-description=&quot;&amp;lrm;당신의 잠들어 있는 액션 본능을 일깨울 시간! 모두가 새롭게 시작하는 진짜 던전앤파이터! ▶ 게임 소개 ◀ ■ 오리지널 액션쾌감 던전앤파이터 모바일! 터치로 느끼는 원작의 강렬한 콤보 &quot; data-og-host=&quot;apps.apple.com&quot; data-og-source-url=&quot;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&quot; data-og-url=&quot;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c1OM65/hyN8w3rEcj/sXEx2LUf5Uy7sxTL05w7d0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bXOdPi/hyN8rnA7B0/mknrKK5XKitJ6LGsZ9Th10/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot;&gt;&lt;a href=&quot;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://apps.apple.com/kr/app/%EB%8D%98%EC%A0%84%EC%95%A4%ED%8C%8C%EC%9D%B4%ED%84%B0-%EB%AA%A8%EB%B0%94%EC%9D%BC/id1448979486&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c1OM65/hyN8w3rEcj/sXEx2LUf5Uy7sxTL05w7d0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/bXOdPi/hyN8rnA7B0/mknrKK5XKitJ6LGsZ9Th10/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lrm;던전앤파이터 모바일&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;lrm;당신의 잠들어 있는 액션 본능을 일깨울 시간! 모두가 새롭게 시작하는 진짜 던전앤파이터! ▶ 게임 소개 ◀ ■ 오리지널 액션쾌감 던전앤파이터 모바일! 터치로 느끼는 원작의 강렬한 콤보&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;apps.apple.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;[ 구글 플레이 ]&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&quot;&gt;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1650628949687&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;던전앤파이터 모바일 - Google Play 앱&quot; data-og-description=&quot;당신의 잠들어 있는 액션 본능을 일깨울 시간! 어디서나 액션쾌감! 던전앤파이터 모바일 정식 출시!&quot; data-og-host=&quot;play.google.com&quot; data-og-source-url=&quot;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&quot; data-og-url=&quot;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cyzl6S/hyN8wvC9xL/WIomskEbYazozLnOAGqPHK/img.jpg?width=512&amp;amp;height=250&amp;amp;face=184_34_206_58,https://scrap.kakaocdn.net/dn/dwlxgX/hyN8AY5YcN/dBjj9oShScXRYKQdi1fm71/img.jpg?width=600&amp;amp;height=300&amp;amp;face=215_46_243_77,https://scrap.kakaocdn.net/dn/byZiq3/hyN8Fe5fsg/YdudJJ1LWkZwLbTt9vam4k/img.jpg?width=635&amp;amp;height=310&amp;amp;face=0_0_635_310&quot;&gt;&lt;a href=&quot;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://play.google.com/store/apps/details?id=com.nexon.mdnf&amp;amp;hl=ko&amp;amp;gl=US&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cyzl6S/hyN8wvC9xL/WIomskEbYazozLnOAGqPHK/img.jpg?width=512&amp;amp;height=250&amp;amp;face=184_34_206_58,https://scrap.kakaocdn.net/dn/dwlxgX/hyN8AY5YcN/dBjj9oShScXRYKQdi1fm71/img.jpg?width=600&amp;amp;height=300&amp;amp;face=215_46_243_77,https://scrap.kakaocdn.net/dn/byZiq3/hyN8Fe5fsg/YdudJJ1LWkZwLbTt9vam4k/img.jpg?width=635&amp;amp;height=310&amp;amp;face=0_0_635_310');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;던전앤파이터 모바일 - Google Play 앱&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;당신의 잠들어 있는 액션 본능을 일깨울 시간! 어디서나 액션쾌감! 던전앤파이터 모바일 정식 출시!&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;play.google.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>About-Me</category>
      <category>Dungeon&amp;amp;Fighter</category>
      <category>MDNF</category>
      <category>NEOPLE</category>
      <category>NEXON</category>
      <category>넥슨</category>
      <category>던파</category>
      <category>던파 모바일</category>
      <category>모바일게임</category>
      <category>액션</category>
      <category>액션쾌감</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/385</guid>
      <comments>https://lhh3520.tistory.com/385#entry385comment</comments>
      <pubDate>Fri, 22 Apr 2022 21:06:06 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] URP 프로젝트에서 Camera Stacking 하는 방법</title>
      <link>https://lhh3520.tistory.com/384</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;말 그대로 카메라를 쌓아서 오버레이 하는 방법 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1650628044796&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Camera Stacking | Universal RP | 7.2.1&quot; data-og-description=&quot;Camera Stacking In the Universal Render Pipeline (URP), you use Camera Stacking to layer the output of multiple Cameras and create a single combined output. Camera Stacking allows you to create effects such as a 3D model in a 2D UI, or the cockpit of a veh&quot; data-og-host=&quot;docs.unity3d.com&quot; data-og-source-url=&quot;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&quot; data-og-url=&quot;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/UbJqi/hyN8v4xlpz/433RHvGpyvrKTFdzhIgyKk/img.png?width=1004&amp;amp;height=566&amp;amp;face=0_0_1004_566&quot;&gt;&lt;a href=&quot;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@7.2/manual/camera-stacking.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/UbJqi/hyN8v4xlpz/433RHvGpyvrKTFdzhIgyKk/img.png?width=1004&amp;amp;height=566&amp;amp;face=0_0_1004_566');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Camera Stacking | Universal RP | 7.2.1&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Camera Stacking In the Universal Render Pipeline (URP), you use Camera Stacking to layer the output of multiple Cameras and create a single combined output. Camera Stacking allows you to create effects such as a 3D model in a 2D UI, or the cockpit of a veh&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.unity3d.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 2021.2.5f1 버전&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기준 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 기본적으로 메인 카메라가 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;00.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ogVJv/btrAdIcaV4B/KZnc6y4ywZdk8QAJ9Ut9V0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ogVJv/btrAdIcaV4B/KZnc6y4ywZdk8QAJ9Ut9V0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ogVJv/btrAdIcaV4B/KZnc6y4ywZdk8QAJ9Ut9V0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FogVJv%2FbtrAdIcaV4B%2FKZnc6y4ywZdk8QAJ9Ut9V0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;316&quot; data-filename=&quot;00.png&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;요런 모양으로 비추고 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;1548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k05GI/btrAca1Yj3W/mlkaZCNKF5ThlnYSmstQgK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k05GI/btrAca1Yj3W/mlkaZCNKF5ThlnYSmstQgK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k05GI/btrAca1Yj3W/mlkaZCNKF5ThlnYSmstQgK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk05GI%2FbtrAca1Yj3W%2FmlkaZCNKF5ThlnYSmstQgK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;772&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;922&quot; data-origin-height=&quot;1548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제.. 메인 카메라 뒷부분에 깔릴 카메라를 만들 차례인데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 카메라에 보여질 공간을 꾸며 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;180&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JfQNa/btrAdH5pZh4/SOEAv4o5Q5nKtd53xUoM40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JfQNa/btrAdH5pZh4/SOEAv4o5Q5nKtd53xUoM40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JfQNa/btrAdH5pZh4/SOEAv4o5Q5nKtd53xUoM40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJfQNa%2FbtrAdH5pZh4%2FSOEAv4o5Q5nKtd53xUoM40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;302&quot; height=&quot;180&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;302&quot; data-origin-height=&quot;180&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대충 다른 카메라에 보여질 공간을 꾸며준 다음에&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;968&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTvCxz/btrAbHliBGx/9MBy7uYkGHJntaZlO9rJAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTvCxz/btrAbHliBGx/9MBy7uYkGHJntaZlO9rJAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTvCxz/btrAbHliBGx/9MBy7uYkGHJntaZlO9rJAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTvCxz%2FbtrAbHliBGx%2F9MBy7uYkGHJntaZlO9rJAK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;626&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;928&quot; data-origin-height=&quot;968&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카메라를 하나 생성해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;1440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eoTkbZ/btrAc56HoO1/GoFBSvGH39ruMj7MVpW1K0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eoTkbZ/btrAc56HoO1/GoFBSvGH39ruMj7MVpW1K0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eoTkbZ/btrAc56HoO1/GoFBSvGH39ruMj7MVpW1K0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeoTkbZ%2FbtrAc56HoO1%2FGoFBSvGH39ruMj7MVpW1K0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;970&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;668&quot; data-origin-height=&quot;1440&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카메라를 선택하고 인스펙터를 살펴보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래처럼 Camera -&amp;gt; Render Type 이라는게 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;적절한 조건에 맞게 세팅해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[ 1 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Base : 기본적으로 렌더할 타입 (뒤에 깔림)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;[ 2 ]&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Overlay : 앞쪽으로 오버레이 해서 렌더할 타입&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;66.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;2212&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C39wz/btrAa6fehcj/tYkhxDHcQCU3o1nWxdnKaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C39wz/btrAa6fehcj/tYkhxDHcQCU3o1nWxdnKaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C39wz/btrAa6fehcj/tYkhxDHcQCU3o1nWxdnKaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC39wz%2FbtrAa6fehcj%2FtYkhxDHcQCU3o1nWxdnKaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;940&quot; data-filename=&quot;66.png&quot; data-origin-width=&quot;1412&quot; data-origin-height=&quot;2212&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단.. 별들은 뒷쪽에 나와야 하니까&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Base 로 선택해 줬습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래처럼 일단 별들이 잘 나오고 있고요..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;77.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;1302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRjfaT/btrAa58pyBW/6AXqqsRd5WUbvWKSK4cmeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRjfaT/btrAa58pyBW/6AXqqsRd5WUbvWKSK4cmeK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRjfaT/btrAa58pyBW/6AXqqsRd5WUbvWKSK4cmeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRjfaT%2FbtrAa58pyBW%2F6AXqqsRd5WUbvWKSK4cmeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;803&quot; data-filename=&quot;77.png&quot; data-origin-width=&quot;730&quot; data-origin-height=&quot;1302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 메인 카메라로 가서 렌더 타입을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Overlay 로 설정해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;88.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;2188&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bciU3M/btrAbaO4uK2/Mwh0x3WIKpJYikdyKG2XcK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bciU3M/btrAbaO4uK2/Mwh0x3WIKpJYikdyKG2XcK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bciU3M/btrAbaO4uK2/Mwh0x3WIKpJYikdyKG2XcK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbciU3M%2FbtrAbaO4uK2%2FMwh0x3WIKpJYikdyKG2XcK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;1077&quot; data-filename=&quot;88.png&quot; data-origin-width=&quot;1138&quot; data-origin-height=&quot;2188&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;설정 후 다시 Base가 될 카메라로 돌아와서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Overlay로 설정했던 카메라를 Stack 항목 부분에 추가해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;99.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;1904&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rPths/btrAddDwpwO/Auyp0RrwpaiofVaRYmlkO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rPths/btrAddDwpwO/Auyp0RrwpaiofVaRYmlkO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rPths/btrAddDwpwO/Auyp0RrwpaiofVaRYmlkO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrPths%2FbtrAddDwpwO%2FAuyp0RrwpaiofVaRYmlkO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;981&quot; data-filename=&quot;99.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;1904&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래처럼 추가가 되는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원하는 만큼 스택해서 쌓을 수 있게 되어 있네요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1010.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;208&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZQhjJ/btrAccyIrrj/ajzv6gn60kkjpMD7MS2KJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZQhjJ/btrAccyIrrj/ajzv6gn60kkjpMD7MS2KJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZQhjJ/btrAccyIrrj/ajzv6gn60kkjpMD7MS2KJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZQhjJ%2FbtrAccyIrrj%2Fajzv6gn60kkjpMD7MS2KJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;560&quot; height=&quot;134&quot; data-filename=&quot;1010.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;208&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 Game 창으로 와서 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;카메라들이 제대로 스택되어 있는걸 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1111.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;1306&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo1Pxi/btrAdZSsQac/9BFaBbC1SlU6Wcem48WiRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo1Pxi/btrAdZSsQac/9BFaBbC1SlU6Wcem48WiRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo1Pxi/btrAdZSsQac/9BFaBbC1SlU6Wcem48WiRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo1Pxi%2FbtrAdZSsQac%2F9BFaBbC1SlU6Wcem48WiRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;480&quot; height=&quot;856&quot; data-filename=&quot;1111.png&quot; data-origin-width=&quot;732&quot; data-origin-height=&quot;1306&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Programming/Unity3D</category>
      <category>Camera</category>
      <category>Stacking</category>
      <category>Unity</category>
      <category>URP</category>
      <category>유니티</category>
      <category>카메라</category>
      <category>카메라 스택킹</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/384</guid>
      <comments>https://lhh3520.tistory.com/384#entry384comment</comments>
      <pubDate>Fri, 22 Apr 2022 20:59:03 +0900</pubDate>
    </item>
    <item>
      <title>[Unity] URP 프로젝트에서 SkyBox 변경하는 방법</title>
      <link>https://lhh3520.tistory.com/383</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Unity URP 프로젝트에서 기본으로 설정되어 있는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스카이 박스를 교체하는 방법 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 2021.2.5f1 버전&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기준 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;프로젝트를 생성하면 아래와 같이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기본적으로 스카이 박스가 설정되어 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;990&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BIYK0/btrz52Joxs8/mS1kh66wEgjX3OM9o5Ujk0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BIYK0/btrz52Joxs8/mS1kh66wEgjX3OM9o5Ujk0/img.png&quot; data-alt=&quot;기본 스카이박스&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BIYK0/btrz52Joxs8/mS1kh66wEgjX3OM9o5Ujk0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBIYK0%2Fbtrz52Joxs8%2FmS1kh66wEgjX3OM9o5Ujk0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1682&quot; height=&quot;990&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1682&quot; data-origin-height=&quot;990&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;기본 스카이박스&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Window -&amp;gt; Rendering -&amp;gt; Lighting&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;클릭해서 라이팅 팝업을 열어 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;1268&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVhDlE/btrz5NlF8Te/osGVeDkZRyVJcSD13MK6Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVhDlE/btrz5NlF8Te/osGVeDkZRyVJcSD13MK6Yk/img.png&quot; data-alt=&quot;Lighting 팝업 오픈&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVhDlE/btrz5NlF8Te/osGVeDkZRyVJcSD13MK6Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVhDlE%2Fbtrz5NlF8Te%2FosGVeDkZRyVJcSD13MK6Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;906&quot; height=&quot;1268&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;906&quot; data-origin-height=&quot;1268&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Lighting 팝업 오픈&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;라이팅 팝업을 열고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Environment 탭을 선택합니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1426&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n596a/btrz8DPDuVT/dZpdZsUDlVvSHa2Zs9aAWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n596a/btrz8DPDuVT/dZpdZsUDlVvSHa2Zs9aAWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n596a/btrz8DPDuVT/dZpdZsUDlVvSHa2Zs9aAWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn596a%2Fbtrz8DPDuVT%2FdZpdZsUDlVvSHa2Zs9aAWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1004&quot; height=&quot;1426&quot; data-filename=&quot;33.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;1426&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;교체하려고 하는 스카이박스 매터리얼을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래 화살표 영역에 넣어서 교체해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1170&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M7HBA/btrz4PYl9DI/GkAgpgxCpoeRFGd2jdQx91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M7HBA/btrz4PYl9DI/GkAgpgxCpoeRFGd2jdQx91/img.png&quot; data-alt=&quot;스카이박스 매터리얼 교체&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M7HBA/btrz4PYl9DI/GkAgpgxCpoeRFGd2jdQx91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM7HBA%2Fbtrz4PYl9DI%2FGkAgpgxCpoeRFGd2jdQx91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1402&quot; height=&quot;1170&quot; data-filename=&quot;44.png&quot; data-origin-width=&quot;1402&quot; data-origin-height=&quot;1170&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스카이박스 매터리얼 교체&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스카이박스 교체완료.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;2056&quot; data-origin-height=&quot;2510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIWpOG/btrz8DvkfXI/IzThwsAYr68yKJVslxnT40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIWpOG/btrz8DvkfXI/IzThwsAYr68yKJVslxnT40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIWpOG/btrz8DvkfXI/IzThwsAYr68yKJVslxnT40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIWpOG%2Fbtrz8DvkfXI%2FIzThwsAYr68yKJVslxnT40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2056&quot; height=&quot;2510&quot; data-filename=&quot;55.png&quot; data-origin-width=&quot;2056&quot; data-origin-height=&quot;2510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/Unity3D</category>
      <category>2021.2.5f1</category>
      <category>BASIC</category>
      <category>SkyBox</category>
      <category>Unity</category>
      <category>Unity URP</category>
      <category>스카이박스</category>
      <category>유니티</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/383</guid>
      <comments>https://lhh3520.tistory.com/383#entry383comment</comments>
      <pubDate>Fri, 22 Apr 2022 09:24:34 +0900</pubDate>
    </item>
    <item>
      <title>[Shader] 유니티 쉐이더를 이용한 미세면 분포 효과 구현</title>
      <link>https://lhh3520.tistory.com/382</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리 기반 렌더링(PBR)을 공부하다 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자주 사용되는 모델인&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Cook-Torrance BRDF 모델을 접하게 되는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$f(l,&amp;nbsp;v)&amp;nbsp;=&amp;nbsp;\frac{F(l,&amp;nbsp;h)}{4}\frac{D(h)G(l,v,h)}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전 포스팅에서는 기하학에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;관련된 항을 살펴 봤었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/381&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://lhh3520.tistory.com/381&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638703818576&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Shader] 유니티 쉐이더를 이용한 기하학 효과 구현&quot; data-og-description=&quot;물리 기반 렌더링(PBR)을 공부하다 보면 자주 사용되는 모델인 Cook-Torrance BRDF 모델을 접하게 되는데 $$f(l,&amp;nbsp;v)&amp;nbsp;=&amp;nbsp;\frac{F(l,&amp;nbsp;h)}{4}\frac{D(h)G(l,v,h)}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})..&quot; data-og-host=&quot;lhh3520.tistory.com&quot; data-og-source-url=&quot;https://lhh3520.tistory.com/381&quot; data-og-url=&quot;https://lhh3520.tistory.com/381&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/7rZd5/hyMB6xx1og/TkTPQvfaQaDhWNquYCF6kk/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638,https://scrap.kakaocdn.net/dn/ypKBE/hyMBZd7mxq/dHnSOcOktNyyUO5f0WkD4K/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638,https://scrap.kakaocdn.net/dn/1VEPY/hyMAmWlE17/Ml8Q9nZxzYxSWpWohjjEkk/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/381&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lhh3520.tistory.com/381&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/7rZd5/hyMB6xx1og/TkTPQvfaQaDhWNquYCF6kk/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638,https://scrap.kakaocdn.net/dn/ypKBE/hyMBZd7mxq/dHnSOcOktNyyUO5f0WkD4K/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638,https://scrap.kakaocdn.net/dn/1VEPY/hyMAmWlE17/Ml8Q9nZxzYxSWpWohjjEkk/img.png?width=714&amp;amp;height=638&amp;amp;face=0_0_714_638');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Shader] 유니티 쉐이더를 이용한 기하학 효과 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;물리 기반 렌더링(PBR)을 공부하다 보면 자주 사용되는 모델인 Cook-Torrance BRDF 모델을 접하게 되는데 $$f(l,&amp;nbsp;v)&amp;nbsp;=&amp;nbsp;\frac{F(l,&amp;nbsp;h)}{4}\frac{D(h)G(l,v,h)}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lhh3520.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$D(h)$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이부분에 해당하는 미세면 분포 항에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;대해 살펴 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;미세면 분포는 쉽게 말해&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빛이 입사하고 반사 되면서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;생기는 스펙큘러의 분포의 모양이라고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보면 될 것 같습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx00.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bocPuR/btrm7ML2kTH/mKe2A6gvCKJTXd5b4KAGwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bocPuR/btrm7ML2kTH/mKe2A6gvCKJTXd5b4KAGwk/img.png&quot; data-alt=&quot;사진출저:&amp;amp;nbsp;https://developer.nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems/gpugems_ch18.html&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bocPuR/btrm7ML2kTH/mKe2A6gvCKJTXd5b4KAGwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbocPuR%2Fbtrm7ML2kTH%2FmKe2A6gvCKJTXd5b4KAGwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;349&quot; data-filename=&quot;ggx00.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저:&amp;nbsp;https://developer.nvidia.com/sites/all/modules/custom/gpugems/books/GPUGems/gpugems_ch18.html&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 스펙큘러가 어떻게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 모양으로 분포되어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;형성이 되는지에 대한 부분 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;현재 가장 많이 사용되는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;근사식은 GGX라고 하는데 식은 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$D(h)&amp;nbsp;=&amp;nbsp;\frac{a^2}{\pi&amp;nbsp;(&amp;nbsp;(n\cdot&amp;nbsp;h)^2&amp;nbsp;(a^2-1)&amp;nbsp;+&amp;nbsp;1&amp;nbsp;)^2}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 사용되는 a의 값은&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Roughness의 제곱입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$a = Roughness^2$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 값들을 기준으로 유니티에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쉐이더 코드를 만들어 적용해 봅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 버전은 현재 최신기준&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2021.2.5f1&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;으로 테스트 했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 프로젝트를 만들고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 간단히 세팅해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx01.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DBPzt/btrm9FeNTr7/2uU1NfTpmKnHL83YDFbs0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DBPzt/btrm9FeNTr7/2uU1NfTpmKnHL83YDFbs0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DBPzt/btrm9FeNTr7/2uU1NfTpmKnHL83YDFbs0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDBPzt%2Fbtrm9FeNTr7%2F2uU1NfTpmKnHL83YDFbs0K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;543&quot; data-filename=&quot;ggx01.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쉐이더 파일과 매터리얼 파일을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;생성해 구에 입혀 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx02.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uhETm/btrm2nGgaXi/2vjCNr5SDkg0v4ELUJ72Gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uhETm/btrm2nGgaXi/2vjCNr5SDkg0v4ELUJ72Gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uhETm/btrm2nGgaXi/2vjCNr5SDkg0v4ELUJ72Gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuhETm%2Fbtrm2nGgaXi%2F2vjCNr5SDkg0v4ELUJ72Gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;256&quot; height=&quot;74&quot; data-filename=&quot;ggx02.png&quot; data-origin-width=&quot;256&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;필요 없는 항목들은 제거해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(Metalic,&amp;nbsp;&lt;span style=&quot;color: #222222;&quot;&gt;Glossiness 같은거..)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1638705517263&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Properties
{
   _Color (&quot;Color&quot;, Color) = (1,1,1,1)
   _MainTex (&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빛의 입사각을 알아야 하기 때문에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 라이트를 달고 스펙큘러는 잠시 제외하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;디퓨즈만 램버트로 넣어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638705546590&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CGPROGRAM
#define PI 3.14159265358979353846f
#pragma surface surf CustomLight fullforwardshadows        
#pragma target 3.0
        
inline void LightingCustomLight_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi)
{
    gi = UnityGlobalIllumination (data, 1.0, s.Normal);
}

inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
{
    UnityLight light = gi.light;

    float NoL = saturate( dot(s.Normal, light.dir) );
    float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;            
    finalColor.rgb = diffuseTerm.rgb;
 
    return finalColor;
}
       
void surf (Input IN, inout SurfaceOutput o)
{
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 쉐이더를 적용시킨 결과.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx03.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbNycp/btrmXVKOoxG/VNVUPVTqYeEGeaKTC0KrXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbNycp/btrmXVKOoxG/VNVUPVTqYeEGeaKTC0KrXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbNycp/btrmXVKOoxG/VNVUPVTqYeEGeaKTC0KrXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbNycp%2FbtrmXVKOoxG%2FVNVUPVTqYeEGeaKTC0KrXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;475&quot; data-filename=&quot;ggx03.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기에 아까 나왔었던&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;GGX 근사식을 코드로 옮겨 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638705932006&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;float sqr(float value)
{
   return value * value;
}
        
inline float3 GetGGX(float NoH)
{
     float alphasqr = sqr(_Roughness);
     float denominator = sqr(NoH) * (alphasqr - 1) + 1;
     return alphasqr / (PI * sqr(denominator));
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 식을 이용해&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 라이팅 함수내에 스펙큘러에 넣어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638706005596&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
{
    UnityLight light = gi.light;

    float3 halfV = normalize(light.dir + viewDir);
    float NoH = saturate( dot(s.Normal, halfV) );
    float NoL = saturate( dot(s.Normal, light.dir) );

    float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;
            
    float3 specular = GetGGX(NoH);

    fixed4 finalColor = fixed4(0, 0, 0, 1);
    finalColor.rgb = diffuseTerm.rgb + specular;
 
    return finalColor;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스펙큘러 주변에 분포가 생긴 것을 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx04.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s2Hdl/btrmYcsoXDF/kdVaBrWQ9t2V169KWTcuJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s2Hdl/btrmYcsoXDF/kdVaBrWQ9t2V169KWTcuJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s2Hdl/btrmYcsoXDF/kdVaBrWQ9t2V169KWTcuJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs2Hdl%2FbtrmYcsoXDF%2FkdVaBrWQ9t2V169KWTcuJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;526&quot; data-filename=&quot;ggx04.png&quot; data-origin-width=&quot;728&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거칠기에 따른 분포를 비교해보면..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ggx05.png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LHBGc/btrmY57qyK9/KYO6YxiRvvMVKJx97hIIDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LHBGc/btrmY57qyK9/KYO6YxiRvvMVKJx97hIIDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LHBGc/btrmY57qyK9/KYO6YxiRvvMVKJx97hIIDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLHBGc%2FbtrmY57qyK9%2FKYO6YxiRvvMVKJx97hIIDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;355&quot; data-filename=&quot;ggx05.png&quot; data-origin-width=&quot;1334&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거친 정도에 따라서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스펙큘러의 하이라이트 모양이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;달라지는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체 쉐이더 코드&lt;/p&gt;
&lt;pre id=&quot;code_1638706609298&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Shader &quot;Custom/GGXDistribution&quot;
{
    Properties
    {
        _Color (&quot;Color&quot;, Color) = (1,1,1,1)
        _MainTex (&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}
        _Roughness (&quot;Roughness&quot;, Range(0, 1)) = 1
    }
    SubShader
    {
        Tags { &quot;RenderType&quot;=&quot;Opaque&quot; }
        LOD 200

        CGPROGRAM
        #define PI 3.14159265358979353846f
        #pragma surface surf CustomLight fullforwardshadows        
        #pragma target 3.0
        
        struct Input
        {
            float2 uv_MainTex;
        };
        
        sampler2D _MainTex;
        fixed4 _Color;
        float _Roughness;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        float sqr(float value)
        {
            return value * value;
        }
        
        inline float3 GetGGX(float NoH)
        {
            float alphasqr = sqr(_Roughness);
            float denominator = sqr(NoH) * (alphasqr - 1) + 1;
            return alphasqr / (PI * sqr(denominator));
        }

        inline void LightingCustomLight_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi)
        {
            gi = UnityGlobalIllumination (data, 1.0, s.Normal);
        }

        inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
        {
            UnityLight light = gi.light;

            float3 halfV = normalize(light.dir + viewDir);
            float NoH = saturate( dot(s.Normal, halfV) );
            float NoL = saturate( dot(s.Normal, light.dir) );

            float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;
            
            float3 specular = GetGGX(NoH);

            fixed4 finalColor = fixed4(0, 0, 0, 1);
            finalColor.rgb = diffuseTerm.rgb + specular;
 
            return finalColor;
        }
        
        void surf (Input IN, inout SurfaceOutput o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack &quot;Diffuse&quot;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Shader</category>
      <category>BRDF</category>
      <category>distribution</category>
      <category>ggx</category>
      <category>라이트</category>
      <category>물리기반 쉐이딩</category>
      <category>미세면 분포</category>
      <category>셰이더</category>
      <category>쉐이더</category>
      <category>유니티</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/382</guid>
      <comments>https://lhh3520.tistory.com/382#entry382comment</comments>
      <pubDate>Sun, 5 Dec 2021 21:17:25 +0900</pubDate>
    </item>
    <item>
      <title>[Shader] 유니티 쉐이더를 이용한 기하학 효과 구현</title>
      <link>https://lhh3520.tistory.com/381</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리 기반 렌더링(PBR)을 공부하다 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자주 사용되는 모델인&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Cook-Torrance BRDF 모델을 접하게 되는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$f(l,&amp;nbsp;v)&amp;nbsp;=&amp;nbsp;\frac{F(l,&amp;nbsp;h)}{4}\frac{D(h)G(l,v,h)}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이전 포스팅에서는 프레넬에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;관련된 항을 살펴 봤었는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/380&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://lhh3520.tistory.com/380&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638670525862&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Shader] 유니티 쉐이더를 이용한 프레넬 효과 구현&quot; data-og-description=&quot;물리 기반 렌더링(PBR)을 공부하다 보면 자주 사용되는 모델인 Cook-Torrance BRDF 모델을 접하게 되는데 $$f_{s}&amp;nbsp;=&amp;nbsp;\frac{F}{\pi}\frac{DG}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$ 최근 모델은  ..&quot; data-og-host=&quot;lhh3520.tistory.com&quot; data-og-source-url=&quot;https://lhh3520.tistory.com/380&quot; data-og-url=&quot;https://lhh3520.tistory.com/380&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/qUF4q/hyMAxXnFTe/RKTFHyH7v454Gtmh1BlLh0/img.png?width=417&amp;amp;height=414&amp;amp;face=0_0_417_414,https://scrap.kakaocdn.net/dn/QfM7H/hyMAqqoBqD/GGTLZOseX112hx2rtRbkN0/img.png?width=417&amp;amp;height=414&amp;amp;face=0_0_417_414,https://scrap.kakaocdn.net/dn/rj03m/hyMArv6QEe/U8NIzKXwiYCGktjQ5aFwU1/img.jpg?width=1000&amp;amp;height=559&amp;amp;face=0_0_1000_559&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/380&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lhh3520.tistory.com/380&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/qUF4q/hyMAxXnFTe/RKTFHyH7v454Gtmh1BlLh0/img.png?width=417&amp;amp;height=414&amp;amp;face=0_0_417_414,https://scrap.kakaocdn.net/dn/QfM7H/hyMAqqoBqD/GGTLZOseX112hx2rtRbkN0/img.png?width=417&amp;amp;height=414&amp;amp;face=0_0_417_414,https://scrap.kakaocdn.net/dn/rj03m/hyMArv6QEe/U8NIzKXwiYCGktjQ5aFwU1/img.jpg?width=1000&amp;amp;height=559&amp;amp;face=0_0_1000_559');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Shader] 유니티 쉐이더를 이용한 프레넬 효과 구현&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;물리 기반 렌더링(PBR)을 공부하다 보면 자주 사용되는 모델인 Cook-Torrance BRDF 모델을 접하게 되는데 $$f_{s}&amp;nbsp;=&amp;nbsp;\frac{F}{\pi}\frac{DG}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$ 최근 모델은  ..&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lhh3520.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이번에는 기하학에 관련된&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;항을 살펴 봅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$G(l,v,h)$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 부분입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리기반 렌더링을 살펴보다보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;미세면&amp;nbsp;이론(Microfacet&amp;nbsp;Theory)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;을 접하게 되는데 우리가 보는 표면이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;미시적으로 들어가 보면 굴곡들이 있다는 이론이죠.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith00.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;316&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmoI0o/btrm0pDZ1x4/tFumRxrVkLcdnCkirnTNdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmoI0o/btrm0pDZ1x4/tFumRxrVkLcdnCkirnTNdK/img.png&quot; data-alt=&quot;사진출저: http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmoI0o/btrm0pDZ1x4/tFumRxrVkLcdnCkirnTNdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmoI0o%2Fbtrm0pDZ1x4%2FtFumRxrVkLcdnCkirnTNdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;267&quot; data-filename=&quot;smith00.png&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;316&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그렇다 보니 미세표면에서 같은 빛을 받아도&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특정 부분은 그림자가 생길수도 있다는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith01.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ci5gkY/btrm3PCcXr3/KGtmZmdj3njIpjMtYtBwE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ci5gkY/btrm3PCcXr3/KGtmZmdj3njIpjMtYtBwE1/img.png&quot; data-alt=&quot;사진출저: http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ci5gkY/btrm3PCcXr3/KGtmZmdj3njIpjMtYtBwE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fci5gkY%2Fbtrm3PCcXr3%2FKGtmZmdj3njIpjMtYtBwE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;205&quot; data-filename=&quot;smith01.png&quot; data-origin-width=&quot;716&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: http://www.cs.cornell.edu/~srm/publications/EGSR07-btdf.pdf&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리기반 렌더링에서는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이런 기하학적으로 생기는 그림자 마스킹&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;효과를 스펙큘러에 포함합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;현재 가장 많이 쓰이고 있는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;근사식은 스미스 기하항이고 식은 아래와 같다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$G(l,v,h)&amp;nbsp;=&amp;nbsp;G_{1}(l)G_{1}(v)$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$G_{1}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;부분은 아래의 값으로 구할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$G_{1}&amp;nbsp;=&amp;nbsp;\frac{n\cdot&amp;nbsp;v}{(n\cdot&amp;nbsp;v)(1-k)+k}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 변수 k는 아래와 같이 자주 쓰이는듯 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$k&amp;nbsp;=&amp;nbsp;\frac{(Roughness+1)^2}{8}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기까지 보면 물리기반 렌더링기준&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;기하학적인 관점에서 Roughness(거칠기)가&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;늘어나면 빛의 감쇠도 증가한다는걸 알 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 현상을 확인해 보기위해&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티에서 쉐이더 코드를 만들어 적용해 봅니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티 버전은 현재 최신기준&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;2021.2.5f1&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;으로 테스트 했습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;새로운 프로젝트를 만들고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같이 대충 세팅해 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith02.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;692&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c1lebZ/btrmZI4UhRg/UAjy2H7JgBsPbtj0V2pJe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c1lebZ/btrmZI4UhRg/UAjy2H7JgBsPbtj0V2pJe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c1lebZ/btrmZI4UhRg/UAjy2H7JgBsPbtj0V2pJe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc1lebZ%2FbtrmZI4UhRg%2FUAjy2H7JgBsPbtj0V2pJe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;465&quot; data-filename=&quot;smith02.png&quot; data-origin-width=&quot;892&quot; data-origin-height=&quot;692&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 쉐이더 만들고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;매터리얼에 씌워서 구에 입혀 줍니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith03.png&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;84&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dzIsji/btrmY48hlCS/KyzGjnkcfU1XxDOdNwAQB0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dzIsji/btrmY48hlCS/KyzGjnkcfU1XxDOdNwAQB0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dzIsji/btrmY48hlCS/KyzGjnkcfU1XxDOdNwAQB0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdzIsji%2FbtrmY48hlCS%2FKyzGjnkcfU1XxDOdNwAQB0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;242&quot; height=&quot;84&quot; data-filename=&quot;smith03.png&quot; data-origin-width=&quot;242&quot; data-origin-height=&quot;84&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;필요 없는 항목들은 제거합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(Metalic, &lt;span style=&quot;color: #222222;&quot;&gt;Glossiness 같은거..)&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1638673416762&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Properties
{
   _Color (&quot;Color&quot;, Color) = (1,1,1,1)
   _MainTex (&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빛의 입사각을 알아야 하기 때문에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 라이트를 달고 스펙큘러는 잠시 제외하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;디퓨즈만 램버트로 넣어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638673638822&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;CGPROGRAM
#pragma surface surf CustomLight fullforwardshadows        
#pragma target 3.0
        
inline void LightingCustomLight_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi)
{
    gi = UnityGlobalIllumination (data, 1.0, s.Normal);
}

inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
{
    UnityLight light = gi.light;

    float NoL = saturate( dot(s.Normal, light.dir) );
    float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;            
    finalColor.rgb = diffuseTerm.rgb;
 
    return finalColor;
}
       
void surf (Input IN, inout SurfaceOutput o)
{
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
    o.Albedo = c.rgb;
    o.Alpha = c.a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;위 쉐이더를 적용시킨 결과.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith04.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WHhPB/btrmZ2IK9Bx/0FLulGzhcJ4HjM2MNlbR5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WHhPB/btrmZ2IK9Bx/0FLulGzhcJ4HjM2MNlbR5k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WHhPB/btrmZ2IK9Bx/0FLulGzhcJ4HjM2MNlbR5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWHhPB%2FbtrmZ2IK9Bx%2F0FLulGzhcJ4HjM2MNlbR5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;475&quot; data-filename=&quot;smith04.png&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 스펙큘러에 스미스 기하학을&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;코드로 구현해서 넣어 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638673961566&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 제곱
float sqr(float value)
{
   return value * value;
}

// 스미스 기하학의 G1 구하는 함수
float G1 (float k, float x)
{
   return x / (x * (1 - k) + k);
}

// 스미스 기하항 식을 코드로 구현
inline float3 GetSmithGeometry(float NoL, float NoV)
{
    float r = _Roughness + 1;
    float k = sqr(r) / 8;
    float g1L = G1 (k, NoL);
    float g1V = G1 (k, NoV);
    return g1L * g1V;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이제 이걸 아까 만들었던&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;커스텀 라이팅 함수내에 스펙큘러로 넣어줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638674098761&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
{
    UnityLight light = gi.light;

    float NoL = saturate( dot(s.Normal, light.dir) );
    float NoV = saturate( dot(s.Normal, viewDir) );

    float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;
            
    float3 spec = GetSmithGeometry(NoL, NoV);

    fixed4 finalColor = fixed4(0, 0, 0, 1);
    finalColor.rgb = diffuseTerm.rgb + spec;
 
    return finalColor;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;스펙큘러도 생기고 주변부에는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빛이 감쇠가 되는 효과도 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith05.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qh4Nv/btrm5xVCF7P/HYl5pzHmIlMBMHCbBRLpF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qh4Nv/btrm5xVCF7P/HYl5pzHmIlMBMHCbBRLpF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qh4Nv/btrm5xVCF7P/HYl5pzHmIlMBMHCbBRLpF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fqh4Nv%2Fbtrm5xVCF7P%2FHYl5pzHmIlMBMHCbBRLpF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;536&quot; data-filename=&quot;smith05.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;빛이 너무 강해서 강도를 좀 줄이고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거칠기를 조절해서 비교해 보면..&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;smith06.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;742&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CeIUg/btrm5x89ZQo/zBXFPYiFwZwZ5ANGcbaDvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CeIUg/btrm5x89ZQo/zBXFPYiFwZwZ5ANGcbaDvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CeIUg/btrm5x89ZQo/zBXFPYiFwZwZ5ANGcbaDvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCeIUg%2Fbtrm5x89ZQo%2FzBXFPYiFwZwZ5ANGcbaDvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;326&quot; data-filename=&quot;smith06.png&quot; data-origin-width=&quot;1364&quot; data-origin-height=&quot;742&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;거칠기에 따라서 빛이 얼마나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;감쇠되는지를 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체 쉐이더 코드&lt;/p&gt;
&lt;pre id=&quot;code_1638674649875&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Shader &quot;Custom/SmithGeometry&quot;
{
    Properties
    {
        _Color (&quot;Color&quot;, Color) = (1,1,1,1)
        _MainTex (&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}
        _Roughness (&quot;Roughness&quot;, Range(0, 1)) = 1
    }
    SubShader
    {
        Tags { &quot;RenderType&quot;=&quot;Opaque&quot; }
        LOD 200

        CGPROGRAM
        #pragma surface surf CustomLight fullforwardshadows        
        #pragma target 3.0
        
        struct Input
        {
            float2 uv_MainTex;
        };
        
        sampler2D _MainTex;
        fixed4 _Color;
        float _Roughness;

        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)

        float sqr(float value)
        {
            return value * value;
        }

        float G1 (float k, float x)
        {
            return x / (x * (1 - k) + k);
        }

        inline float3 GetSmithGeometry(float NoL, float NoV)
        {
            float r = _Roughness + 1;
            float k = sqr(r) / 8;
            float g1L = G1 (k, NoL);
            float g1V = G1 (k, NoV);
            return g1L * g1V;
        }
        
        inline void LightingCustomLight_GI (SurfaceOutput s, UnityGIInput data, inout UnityGI gi)
        {
            gi = UnityGlobalIllumination (data, 1.0, s.Normal);
        }

        inline fixed4 LightingCustomLight (SurfaceOutput s, float3 viewDir, UnityGI gi)
        {
            UnityLight light = gi.light;

            float NoL = saturate( dot(s.Normal, light.dir) );
            float NoV = saturate( dot(s.Normal, viewDir) );

            float3 diffuseTerm = NoL * s.Albedo.rgb * light.color;
            
            float3 specular = GetSmithGeometry(NoL, NoV);

            fixed4 finalColor = fixed4(0, 0, 0, 1);
            finalColor.rgb = diffuseTerm.rgb + specular;
 
            return finalColor;
        }
        
        void surf (Input IN, inout SurfaceOutput o)
        {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack &quot;Diffuse&quot;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Shader</category>
      <category>BRDF</category>
      <category>Smith Geometry</category>
      <category>라이트</category>
      <category>물리기반쉐이딩</category>
      <category>셰이더</category>
      <category>쉐이더</category>
      <category>유니티</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/381</guid>
      <comments>https://lhh3520.tistory.com/381#entry381comment</comments>
      <pubDate>Sun, 5 Dec 2021 12:25:29 +0900</pubDate>
    </item>
    <item>
      <title>[Shader] 유니티 쉐이더를 이용한 프레넬 효과 구현</title>
      <link>https://lhh3520.tistory.com/380</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리 기반 렌더링(PBR)을 공부하다 보면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;자주 사용되는 모델인&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Cook-Torrance BRDF 모델을 접하게 되는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$f_{s}&amp;nbsp;=&amp;nbsp;\frac{F}{\pi}\frac{DG}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;최근 모델은  대신 4를 나눠준다고 합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$f(l,&amp;nbsp;v)&amp;nbsp;=&amp;nbsp;\frac{F(l,&amp;nbsp;h)}{4}\frac{D(h)G(l,v,h)}{(\vec{N}\cdot&amp;nbsp;\vec{L})(\vec{N}\cdot&amp;nbsp;\vec{V})}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭐.. 어쨌건..&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모델을 보게되면 프레넬 항이 존재합니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 프레넬에 대해서 조금 알아보자면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;모든 빛은 매질을 만났을때 반사되거나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;흡수 되거나 굴절이 되도록 되어있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;매질마다 가지는 반사률이나 굴절률이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;다르기 때문에 특정한 매질에서 얼마 만큼의 빛이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반사되는지를 알아내는 공식이 프레넬 공식입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel_b.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;559&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Vlows/btrmPRasOk7/j5wMl9QWtuuUbB2kAgHlkk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Vlows/btrmPRasOk7/j5wMl9QWtuuUbB2kAgHlkk/img.jpg&quot; data-alt=&quot;사진출저: Real-Time Rendering, 3rd Edition.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Vlows/btrmPRasOk7/j5wMl9QWtuuUbB2kAgHlkk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVlows%2FbtrmPRasOk7%2Fj5wMl9QWtuuUbB2kAgHlkk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;391&quot; data-filename=&quot;Fresnel_b.jpg&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;559&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: Real-Time Rendering, 3rd Edition.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 공식을 통해서 특정 매질이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어떤 각도에서 어느정도의 반사율을 가지는지&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;알아낼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뭔가 복잡한 것 같지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;실생활에서 이러한 효과는 의외로 쉽게&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;접했을 수도 있을것 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;아래의 사진을 보면&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel_c.jpg&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;312&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/efqpZ9/btrmSwJZsef/J1kKkKIvJu0h0fpn0zN2bk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/efqpZ9/btrmSwJZsef/J1kKkKIvJu0h0fpn0zN2bk/img.jpg&quot; data-alt=&quot;사진출저: https://gamedevforever.com/35&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/efqpZ9/btrmSwJZsef/J1kKkKIvJu0h0fpn0zN2bk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FefqpZ9%2FbtrmSwJZsef%2FJ1kKkKIvJu0h0fpn0zN2bk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;267&quot; data-filename=&quot;Fresnel_c.jpg&quot; data-origin-width=&quot;468&quot; data-origin-height=&quot;312&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: https://gamedevforever.com/35&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;가까운 곳의 물은 안쪽이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반사되지 않고 내부를 볼 수 있지만&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;멀리에 있는 물의 표면에는 주변 환경이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반사되는 강도가 강한걸 볼 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;추가로&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 굴절되는 과정에서 조금 특이한 현상이 생기는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;특정 각도에서는 굴절이 되지 않고 정반사가 이루어지는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;각도가 생긴다는 것입니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel_a.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bwJHhZ/btrmWsfJc16/siOHdz9i1JmFQo8ktKQGF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bwJHhZ/btrmWsfJc16/siOHdz9i1JmFQo8ktKQGF0/img.png&quot; data-alt=&quot;사진출저: 위키피디아&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bwJHhZ/btrmWsfJc16/siOHdz9i1JmFQo8ktKQGF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbwJHhZ%2FbtrmWsfJc16%2FsiOHdz9i1JmFQo8ktKQGF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;400&quot; height=&quot;265&quot; data-filename=&quot;Fresnel_a.png&quot; data-origin-width=&quot;420&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: 위키피디아&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이러한 각도를 Critical Angle 이라고 하고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 각도를 구하는 공식은 아래와 같습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$\Theta_{c}&amp;nbsp;=&amp;nbsp;arcsin(\frac{n2}{n1})$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이 현상도 실생활에서 볼 수가 있는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;어두운 곳에서 사진을 촬영할때&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뒤에 조명을 놓고 터트려서 피사체의&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;외곽을 강조하면서 사진을 찍거나&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;뒷부분에 빛이 비출 때&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;외곽선이 빛이나는 현상이&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이것과 연관된다고 할 수 있겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;(게임에서는 림라이트라고도 하죠)&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel_d.jpg&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCwrhZ/btrmNn1RbWV/KM5AJnl2iwc574lMtzKIxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCwrhZ/btrmNn1RbWV/KM5AJnl2iwc574lMtzKIxK/img.jpg&quot; data-alt=&quot;사진출저: 사이버펑크 2077 (팔뚝이나 머리 가장자리 부분에 빛이 반사되는 효과)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCwrhZ/btrmNn1RbWV/KM5AJnl2iwc574lMtzKIxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCwrhZ%2FbtrmNn1RbWV%2FKM5AJnl2iwc574lMtzKIxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;550&quot; height=&quot;367&quot; data-filename=&quot;Fresnel_d.jpg&quot; data-origin-width=&quot;601&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: 사이버펑크 2077 (팔뚝이나 머리 가장자리 부분에 빛이 반사되는 효과)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이정도 알아보고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물리기반 렌더링을 사용할때&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이용되는 프레넬 효과를 유니티에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한번 구현해 보겠습니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel00.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TUDdu/btrmSwb9uJ4/K61CmfFcJXVO9AGeXoyVbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TUDdu/btrmSwb9uJ4/K61CmfFcJXVO9AGeXoyVbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TUDdu/btrmSwb9uJ4/K61CmfFcJXVO9AGeXoyVbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTUDdu%2FbtrmSwb9uJ4%2FK61CmfFcJXVO9AGeXoyVbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;600&quot; height=&quot;329&quot; data-filename=&quot;Fresnel00.png&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일단 적당히 환경을 세팅해 놓고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;쉐이더파일과 매터리얼을 만들어서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;원형 구에 씌워 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel01.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfNjp/btrmRaOagID/jZKkA3nxAKk3odpIbyjC6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfNjp/btrmRaOagID/jZKkA3nxAKk3odpIbyjC6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfNjp/btrmRaOagID/jZKkA3nxAKk3odpIbyjC6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfNjp%2FbtrmRaOagID%2FjZKkA3nxAKk3odpIbyjC6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;424&quot; data-filename=&quot;Fresnel01.png&quot; data-origin-width=&quot;447&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;유니티에서 기본 제공되는 쉐이더를 입혔는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;옛날에 비해서 뭔가 느낌이 그럴싸(?) 해졌네요.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기에서 일단 프레넬 효과를&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;좀 더 잘 확인할 수 있도록 앰비언트를 없애고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;색깔을 0으로 세팅했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638504028347&quot; class=&quot;html xml&quot; style=&quot;display: block; overflow: auto; padding: 20px; color: #383a42; background: #f8f8f8; font-size: 14px; font-family: 'SF Mono', Menlo, Consolas, Monaco, monospace; border: 1px solid #ebebeb; line-height: 1.71; margin: 20px auto 0px; cursor: default; z-index: 1; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-thickness: initial; text-decoration-style: initial; text-decoration-color: initial;&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#pragma surface surf Lambert noambient
#pragma target 3.0

void surf (Input IN, inout SurfaceOutput o) 
{
	fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = 0; // c.rgb;
	o.Alpha = c.a;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel02.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kzEVy/btrmRierrQk/VovieSONHLZIxBA10nofUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kzEVy/btrmRierrQk/VovieSONHLZIxBA10nofUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kzEVy/btrmRierrQk/VovieSONHLZIxBA10nofUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkzEVy%2FbtrmRierrQk%2FVovieSONHLZIxBA10nofUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;410&quot; data-filename=&quot;Fresnel02.png&quot; data-origin-width=&quot;423&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;주변광없애고 색깔을 없앤 모습.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;게임에서 많이 사용되는 프레넬 공식중에&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;Schlick 공식이 있다는데 이 공식을 사용해 줍니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$R(\Theta)&amp;nbsp;=&amp;nbsp;R_{o}&amp;nbsp;+&amp;nbsp;(1&amp;nbsp;-&amp;nbsp;R_{o})(1&amp;nbsp;-&amp;nbsp;cos\Theta)^{5}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;여기서 R0는 반사율 입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$R_{o}&amp;nbsp;=&amp;nbsp;(\frac{n1-n2}{n1+n2})^{2}$$&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;보통 반사율값은 메탈릭값으로 넣어준다고 해서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;메탈릭 값으로 넣어 봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1638505173218&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;void surf (Input IN, inout SurfaceOutput o) 
{
	fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = 0; // c.rgb;
	o.Alpha = c.a;

	// Schlick Approximation Fresnel
	// 굴절률값 대신 metalic 값으로 넣음.
	float NoV = saturate(dot(o.Normal, IN.viewDir));
	float exponential = pow(1 - NoV, 5);
	float fresnel = _Metallic + (1 - _Metallic) * exponential;			
	o.Emission = fresnel;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;이렇게 해주면&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;물체의 가장자리가 반사되어 빛이나는&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;효과를 만들어 볼 수 있습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Fresnel05.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;414&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MGR0G/btrmXj37VkQ/zTA8C6ECFX1nuJHEVAtxaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MGR0G/btrmXj37VkQ/zTA8C6ECFX1nuJHEVAtxaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MGR0G/btrmXj37VkQ/zTA8C6ECFX1nuJHEVAtxaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMGR0G%2FbtrmXj37VkQ%2FzTA8C6ECFX1nuJHEVAtxaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;414&quot; data-filename=&quot;Fresnel05.png&quot; data-origin-width=&quot;417&quot; data-origin-height=&quot;414&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;전체 쉐이더 코드&lt;/p&gt;
&lt;pre id=&quot;code_1638505692522&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Shader &quot;Custom/SchlickApproximation&quot; 
{
	Properties {
		_Color (&quot;Color&quot;, Color) = (1,1,1,1)
		_MainTex (&quot;Albedo (RGB)&quot;, 2D) = &quot;white&quot; {}		
		_Metallic (&quot;Metallic&quot;, Range(0,1)) = 0.0
	}
	SubShader {
		Tags { &quot;RenderType&quot;=&quot;Opaque&quot; }
		LOD 200

		CGPROGRAM
		#pragma surface surf Lambert
		#pragma target 3.0

		sampler2D _MainTex;

		struct Input {
			float2 uv_MainTex;
			float3 viewDir;
		};

		half _Metallic;
		fixed4 _Color;

		void surf (Input IN, inout SurfaceOutput o) 
		{
			fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
			o.Albedo = c.rgb;
			o.Alpha = c.a;

			// Schlick Approximation Fresnel
			// 반사율값 대신 metalic 값으로 넣어둠.
			float NoV = saturate(dot(o.Normal, IN.viewDir));
			float exponential = pow(1 - NoV, 5);
			float fresnel = _Metallic + (1 - _Metallic) * exponential;			
			o.Emission = fresnel;
		}

		ENDCG
	}
	FallBack &quot;Diffuse&quot;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Programming/Shader</category>
      <category>schlick</category>
      <category>Shader</category>
      <category>Unity</category>
      <category>림라이트</category>
      <category>쉐이더</category>
      <category>유니티</category>
      <category>프레넬</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/380</guid>
      <comments>https://lhh3520.tistory.com/380#entry380comment</comments>
      <pubDate>Fri, 3 Dec 2021 13:21:25 +0900</pubDate>
    </item>
    <item>
      <title>[수학] 입체각 (스테라디안)</title>
      <link>https://lhh3520.tistory.com/379</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;각도를 표시할때 육십분법이 아닌&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;호의 길이로 표시하는 방법을 호도법이라고 하는데&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/378&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://lhh3520.tistory.com/378&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1638368118804&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[수학] 호도법&quot; data-og-description=&quot;일반적인 육십분법처럼 각도를 30&amp;deg;, 60&amp;deg;, 90&amp;deg; 처럼 표시하는 것이 아닌 호의 길이를 이용해 각도를 표시하는 방법. 원주는 2&amp;pi;r 로 나타낼 수 있고 특정 부채꼴을 기준으로 중심각의 크기를 ϕ, 반&quot; data-og-host=&quot;lhh3520.tistory.com&quot; data-og-source-url=&quot;https://lhh3520.tistory.com/378&quot; data-og-url=&quot;https://lhh3520.tistory.com/378&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/LhWL6/hyMyfh60nc/PvZhUK0RhfDUZvZBQzwDE1/img.png?width=400&amp;amp;height=387&amp;amp;face=0_0_400_387,https://scrap.kakaocdn.net/dn/Srx74/hyMykwXfwu/C96IR3EWzKNtkB9VaCwXak/img.png?width=400&amp;amp;height=387&amp;amp;face=0_0_400_387,https://scrap.kakaocdn.net/dn/cohoOx/hyMyqDXxW9/qDYrpuIC1f7Oa24mhzo700/img.png?width=777&amp;amp;height=777&amp;amp;face=0_0_777_777&quot;&gt;&lt;a href=&quot;https://lhh3520.tistory.com/378&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://lhh3520.tistory.com/378&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/LhWL6/hyMyfh60nc/PvZhUK0RhfDUZvZBQzwDE1/img.png?width=400&amp;amp;height=387&amp;amp;face=0_0_400_387,https://scrap.kakaocdn.net/dn/Srx74/hyMykwXfwu/C96IR3EWzKNtkB9VaCwXak/img.png?width=400&amp;amp;height=387&amp;amp;face=0_0_400_387,https://scrap.kakaocdn.net/dn/cohoOx/hyMyqDXxW9/qDYrpuIC1f7Oa24mhzo700/img.png?width=777&amp;amp;height=777&amp;amp;face=0_0_777_777');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[수학] 호도법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 육십분법처럼 각도를 30&amp;deg;, 60&amp;deg;, 90&amp;deg; 처럼 표시하는 것이 아닌 호의 길이를 이용해 각도를 표시하는 방법. 원주는 2&amp;pi;r 로 나타낼 수 있고 특정 부채꼴을 기준으로 중심각의 크기를 ϕ, 반&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;lhh3520.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;입체각은 평면에서 각도를 표시하는 호도법에서&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;한차원 더 나아가 3차원 공간에서의 각을 표시하는 방법입니다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;반지름이 r 인 구의 표면에서 면적이 A인&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;값을 1 스테라디안 이라고 하는데 아래 그림과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;a22.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Eg6tn/btrmK8h0aCA/wFwghWtKfjQw0FLT6L25k1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Eg6tn/btrmK8h0aCA/wFwghWtKfjQw0FLT6L25k1/img.png&quot; data-alt=&quot;사진출저: 나무위키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Eg6tn/btrmK8h0aCA/wFwghWtKfjQw0FLT6L25k1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEg6tn%2FbtrmK8h0aCA%2FwFwghWtKfjQw0FLT6L25k1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;300&quot; data-filename=&quot;a22.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: 나무위키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;또한, 반지름이 r인 구면 위의 한 영역의 면적이 A 일때,&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;입체각 &amp;Omega;는 아래와 같이 정의할 수 있다.&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;$$\Omega=\frac{A}{r^2}$$&lt;/p&gt;</description>
      <category>Programming/수학,물리</category>
      <category>입체각 #스테라디안 #오메가</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/379</guid>
      <comments>https://lhh3520.tistory.com/379#entry379comment</comments>
      <pubDate>Wed, 1 Dec 2021 23:42:10 +0900</pubDate>
    </item>
    <item>
      <title>[수학] 호도법</title>
      <link>https://lhh3520.tistory.com/378</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;c5c3a104a85aff1efc60d7bd1d927e6a7515b0b71071ea6b2cd6b98bc26ac62ace0979faed9fcf7061140e3f6f80a1ed6faca5fb433c3f7d16b85a29804b5bbd36b36bc94eaa3e7751dbfe05fa184fa68823d2f7437fbca2f6203c904352eafd.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;387&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctFTmW/btrmEEVGv2x/7O9TK7AU78bn02sBBsdnH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctFTmW/btrmEEVGv2x/7O9TK7AU78bn02sBBsdnH0/img.png&quot; data-alt=&quot;사진출저: 나무위키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctFTmW/btrmEEVGv2x/7O9TK7AU78bn02sBBsdnH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctFTmW%2FbtrmEEVGv2x%2F7O9TK7AU78bn02sBBsdnH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;300&quot; height=&quot;290&quot; data-filename=&quot;c5c3a104a85aff1efc60d7bd1d927e6a7515b0b71071ea6b2cd6b98bc26ac62ace0979faed9fcf7061140e3f6f80a1ed6faca5fb433c3f7d16b85a29804b5bbd36b36bc94eaa3e7751dbfe05fa184fa68823d2f7437fbca2f6203c904352eafd.png&quot; data-origin-width=&quot;400&quot; data-origin-height=&quot;387&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: 나무위키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 육십분법처럼 각도를 30&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;deg;, 60&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;deg;, 9&lt;/span&gt;&lt;/span&gt;0&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;deg; 처럼&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;표시하는 것이 아닌 호의 길이를 이용해 각도를 표시하는 방법.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;원주는 2&amp;pi;r 로 나타낼 수 있고&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;특정 부채꼴을 기준으로 중심각의 크기를 ϕ,&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;반지름의 길이를 r 이라고 할때&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;호의 길이는 아래와 같이 나타낼 수 있다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aa00.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;114&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Iu7ZS/btrmDQ3mRBu/soiMZ5pul7bb2s1s0XNNdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Iu7ZS/btrmDQ3mRBu/soiMZ5pul7bb2s1s0XNNdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Iu7ZS/btrmDQ3mRBu/soiMZ5pul7bb2s1s0XNNdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FIu7ZS%2FbtrmDQ3mRBu%2FsoiMZ5pul7bb2s1s0XNNdk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;250&quot; height=&quot;78&quot; data-filename=&quot;aa00.png&quot; data-origin-width=&quot;366&quot; data-origin-height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aa11.png&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;154&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AiTaO/btrmGhTc88B/IOm0Wjaf8MUKrD11KF62Bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AiTaO/btrmGhTc88B/IOm0Wjaf8MUKrD11KF62Bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AiTaO/btrmGhTc88B/IOm0Wjaf8MUKrD11KF62Bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAiTaO%2FbtrmGhTc88B%2FIOm0Wjaf8MUKrD11KF62Bk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;200&quot; height=&quot;121&quot; data-filename=&quot;aa11.png&quot; data-origin-width=&quot;254&quot; data-origin-height=&quot;154&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aa22.png&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhyPK5/btrmykj6uzp/W87ROPyBVTaTUCQJhXkAGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhyPK5/btrmykj6uzp/W87ROPyBVTaTUCQJhXkAGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhyPK5/btrmykj6uzp/W87ROPyBVTaTUCQJhXkAGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhyPK5%2Fbtrmykj6uzp%2FW87ROPyBVTaTUCQJhXkAGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;180&quot; height=&quot;123&quot; data-filename=&quot;aa22.png&quot; data-origin-width=&quot;210&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;1라디안은 대략 ≒ 57.2958&amp;deg; 이고&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;deg; 로 계산하면 아래와 같다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aa33.png&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zhL8y/btrmDQI37bb/Cyo3lRKjgKH427h64729B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zhL8y/btrmDQI37bb/Cyo3lRKjgKH427h64729B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zhL8y/btrmDQI37bb/Cyo3lRKjgKH427h64729B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzhL8y%2FbtrmDQI37bb%2FCyo3lRKjgKH427h64729B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;160&quot; height=&quot;97&quot; data-filename=&quot;aa33.png&quot; data-origin-width=&quot;192&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;각도에 따른 삼각함수표&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;aa44.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;777&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bgF4oh/btrmKjqP2Du/2QPr1xCoe6KycDRI9xVoD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bgF4oh/btrmKjqP2Du/2QPr1xCoe6KycDRI9xVoD1/img.png&quot; data-alt=&quot;사진출저: 나무위키&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bgF4oh/btrmKjqP2Du/2QPr1xCoe6KycDRI9xVoD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbgF4oh%2FbtrmKjqP2Du%2F2QPr1xCoe6KycDRI9xVoD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;777&quot; height=&quot;777&quot; data-filename=&quot;aa44.png&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;777&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;사진출저: 나무위키&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Programming/수학,물리</category>
      <category>라디안 #호도법 #육십분법 #원주 #원주율 #파이</category>
      <author>lhh3520</author>
      <guid isPermaLink="true">https://lhh3520.tistory.com/378</guid>
      <comments>https://lhh3520.tistory.com/378#entry378comment</comments>
      <pubDate>Tue, 30 Nov 2021 23:06:07 +0900</pubDate>
    </item>
  </channel>
</rss>