SlideShare a Scribd company logo
1 of 72
가성비價性比 좋은
렌더링 테크닉 10선
넥슨 신규개발3본부 1실 GTR팀
전형규(henjeon@nexon.co.kr)
발표자 소개

     넥슨 9년차 프로그래머
         현재 신규개발 3본부 1실 GTR팀 팀장


     참여 프로젝트
         마비노기
         XBOX360 마비노기
         마비노기2

     주요 관심사
         Computer Graphics
         Real-Time Rendering
발표 내용

  개발 비용 대비 결과가 좋은 렌더링 기술을 10 가지 소개
        지난 몇 년간의 마비노기2 개발 경험을 바탕으로 함.
        반 나절 내로 적용할 수 있는 것도 있고 개발에 한두달 정도 필요한 것도 있음.


  범용적이면서 독특한 기술 위주로 선정
        마비노기2에 특화된 기술들은 제외.
        너무 유명하거나 접하기 쉬운 기술도 제외.


  주로 제가 개발한 것 위주로…
        그래야 설명하기 쉽고 질문에도 답할 수 있습니다.
        순위에 없다고 가성비 떨어지는 것은 아님!
발표 순서

        일반 기술 2개
           렌더링 엔진 전체에 적용 가능한 기술 및 방법론.



        프로젝트 관리 기술 3개
           개발 과정을 기록으로 남기는 효과적인 방법.
           팀 얼라인먼트를 도와주는 도구.


        렌더링 기술 5개
           렌더링 성능, 품질을 높여주는 기술.
일반
1. 시각적인 진단 도구

   디버깅은 확률 게임
      버그가 있는 위치를 추측해서 범위를 좁혀나가는 게임이다.
      눈 감고 찍지 말고 사실에 근거해서 디버깅하자.


   시각 정보는 가장 강력한 정보
      소리보다 글자, 글자보다 그림, 그림보다 동영상이 이해하기 쉽다.



   빠르고 정확한 진단을 위해 시각 정보를 최대한 활용하자
      게다가 그래픽스 프로그래머는 팀에서 이것을 가장 잘 할 수 있는 사람이다.
적용 사례 – 장비 커스터마이징


                                   절단 대상 버텍스




                                          절단면




  아티스트가 정의한 장비 조합 절단면을 눈으로 관찰하고 문제점을 쉽게 찾을 수 있다.
적용 사례 – 렌더타겟 이벤트 모니터링




렌더타겟




                    스테이지(렌더링 순서)
적용 사례 – 프레임 액티비티 리플레이




이벤트를 저장한 후에
반복 재생할 수 있다.
적용 사례 – 카메라 위치 정보



                    게임 카메라 위치.

                    디버그 카메라 시점에서
                    게임 카메라 상태를 진단.
1. 시각적인 진단 도구 - 조언

      무리해서라도 무조건 시각화
         어떤 형태로든 반드시 보상받는다.



      시각화 코드를 첫 번째 테스트 코드라고 생각하라
         보통, 진단 코드는 대상 코드 전체를 사용하는 유일한 코드.
         일종의 코드 커버리지 테스트를 수행하는 셈.



      남에게 코드의 동작을 설명한다는 느낌으로 작성
         실제로 이렇게 코드를 작성하다가 문제점을 조기에 발견하는 경우가 많다.
2. LAA(Large Address Aware)

32bit 프로세스에서 최대 4G까지 메모리를 사용할 수 있는 링크 옵션
2. LAA

    의외로 이 옵션을 모르는 개발자가 많다
         다들 알고 계실 듯 하지만 혹시 모르니 순위에 넣었음…



    64bit가 가야 할 길이긴 하지만…
         현실은 그렇게 만만하지 않았습니다.


    자세한 정보는 아래 링크를 참고
         2007 Gamefest, “Why Your Windows Game Won’t Run In 2,147,352,576 Bytes”
         (http://download.microsoft.com/download/e/3/c/e3c25fea-2b53-4174-8729-
         29a4ec16583b/Why%20Your%20Windows%20Game%20Won't%20Run%20In%202,147,352,576%20Bytes.zip)
2. LAA

켜는 법
  EXE 프로젝트의 속성창에서
  ‘큰 주소 처리’를 켠다.

  DLL 프로젝트는 변경해도 의미 없다
  (할 필요 없다).
2. LAA - 추가 작업

   이게 왜 ‘렌더링 테크닉’?
       32bit 주소의 상위 1비트를 해킹하는 대표적인 코드가 D3DXEffect.




   그래서 몇 가지 추가 작업이 필요하다
       다음 슬라이드에서 설명…
2. LAA - 추가 작업
   모든 #include <d3dx9.h> 앞에
   D3DXFX_LARGEADDRESS_HANDLE 매크로 정의
      혹은 아래처럼 속성 시트에 정의
2. LAA - 추가 작업
 D3DXGetShaderConstantTable() 대신
 D3DXGetShaderConstantTableEx()를 사용하고,
 D3DXCONSTTABLE_LARGEADDRESSAWARE 추가
2. LAA - 추가 작업

   그리고,
       이펙트 생성할 때 D3DFX_LARGEADDRESAWARE 옵션 추가.
       이펙트 핸들 이름으로 스트링 사용 금지.



   이게 전부
       정말 쉽다.
프로젝트 관리
3. 클라이언트 동영상 인코딩

  클라이언트에 동영상 인코딩 기능을 넣고 라이브 스트리밍
     “팀장님, 이 작업 컨펌해주시고 오른쪽 아래 추천, 즐찾 부탁드려요~”



  내부 클라이언트에서만 동작하는 ‘개발 전용 기능’
     이 기능을 모두에게 공개하려면 넘어야 할 산이 많다.
     일반 유저들은 아*** 같은 서비스를 사용하는 것이 효율적이다.



  동영상은 생각을 공유하는 강력한 도구
     그리고 개발 과정을 효과적으로 기록에 남길 수 있다.
적용 사례




        클라이언트 실행 중에
        이 버튼을 누르면 인코딩 시작
적용 사례

동영상은 프로젝트 포탈 사이트에서 라이브 스트리밍 된다




전광판처럼
동영상 제목을 표시

                           간단한 재생 정보 출력 및
                           볼륨 조절 기능
적용 사례
  영상을 보면서 채팅도 할 수 있다
        채팅은 플래시로 구현




                       스샷 찍게 도와달라고 했더니 다들 이따위로…
적용 사례
  동영상은 자동으로 팀 저장소에 남는다
3. 클라이언트 동영상 인코딩 – 우리는 이렇게 활용한다

     아침 정기 게임 플레이
        테스트 그룹 내에서 돌아가면서 녹화한다.
        게임 플레이 장면을 팀 전체가 볼 수 있다.


     디렉터 지시
        디렉터의 모범 플레이를 학습한다.
        기획 의도를 설명하는데 효과적이다.


     디버깅 자료
        “그 버그 재현법은 몇 월 며칠 영상 어디어디를 보세요”
3. 클라이언트 동영상 인코딩 - 구현

클라이언트                                               Flash
                                                  Media Sever        인코딩 서버가 전송한
         H.264로 인코딩                                                  스트림을 포워딩
         (nVidia CUDA Video Encoder)


                                       FLV로 변환후                   FMS
                                       RTMP로 전송
     인코딩 서버                                                     서버 스크립트
                                                                            동영상 스트리밍

           임의로 하나 선택

                                                  플래시 플레이어                 플래시 플레이어
동영상 폴더                                                           P2P로 채팅


                                                  플래시 플레이어                 플래시 플레이어
3. 클라이언트 동영상 인코딩 – H.264 인코딩

   H.264 비디오 인코딩은 GPU로 처리
        nVidia CUDA Video Encoder를 사용한다.
        (http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_VideoEncoder_Library.pdf)

        CUDA를 지원하지 않거나 nVidia GPU가 아니면 motion jpeg 포맷으로 CPU 인코딩한다.
        (ATI 님들 제발 GPU 인코딩 API좀 공개해주세요…)



   오디오는 WASAPIWindows Audio Session API 사용
        http://msdn.microsoft.com/en-us/library/windows/desktop/dd371455(v=vs.85).aspx




   인코딩한 데이터는 25fps로 인코딩 서버에 전달된다
        bitrate와 fps는 조절 가능.
3. 클라이언트 동영상 인코딩 – 인코딩 서버

  인코딩 서버는 클라이언트가 보낸 패킷을 동영상으로 변환
     클라이언트가 전송한 비디오와 오디오 패킷을 합쳐서 동영상으로 만든다.
     서버는 C#으로 제작, 동영상 생성은 ffmpeg(www.ffmpeg.org)를 사용.
     클라이언트가 없을 동안에는 동영상 폴더에서 임의로 하나 재생.


  동영상은 ffmpeg를 사용해서 FMS로 전달
     FMS : Flash Media Server.
     RTMP(Real Time Messaging Protocol)을 사용해서 전달한다.


  동영상을 파일로도 저장한다.
     이것 역시 ffmpeg를 사용해서 처리한다.
3. 클라이언트 동영상 인코딩 - FMS

   FMS로 팀 전체에 동영상을 라이브 스트리밍
       FMS로 인코딩 서버가 전송한 동영상을 팀 전체 네트워크에 배포한다.
       샘플에 들어있는 multicast 서버 스크립트를 약간 고쳐서 사용 중.


   Flash Media Interactive Server 4.5를 사용
       가격은 500만원 정도(US $4,500).

       평가판(Flash Media Development Sever)를 사용해도 무방하나,
       동접 제한(10명)이 있고 일정 길이(30분)가 넘는 동영상은 스트리밍이 중지된다.

       아래 두 링크를 참고:
       http://www.adobe.com/products/flash-media-interactive.html
       http://www.adobe.com/products/flash-media-server-family/buying-guide-comparison.html
3. 클라이언트 동영상 인코딩 – 플래시 플레이어

   FMS가 배포하는 스트림을 플래시 플레이어로 재생
      FMS에 들어있는 샘플 플레이어를 바탕으로 대충 만들었다.
      플래시라서 웹 페이지에서 사용하기 쉽다.



   채팅은 플래시의 P2P 기능을 사용
      플래시 최근 버전에 들어있는 P2P 기능을 사용해서 채팅을 구현.
4. 스크린샷 히스토리

     스크린샷을 생성하면 공유 폴더에 사본 복사
        정말 간단한 기능이지만 아주 유용하다.
        우리의 경우, 한달 평균 850 장 정도가 저장된다.
4. 스크린샷 히스토리

     활용
          작업 정기 리뷰, 리포트 작성시 짤방으로 자주 사용된다.
          변경점 추적이나 디버깅 할 때도 유용하다.



     남는 건 사진 뿐
          심심할 때 예전 스크린샷을 보면 추억 돋는다.
5. 프로파일링 DB

      클라이언트의 주요 지표를 DB에 저장
         DB에 저장해 두면 가공해서 여러 용도로 활용하기 쉽다.


      하드웨어 구성 별 클라이언트 성능 정보를 수집
         특정 하드웨어에서 발생하는 성능 이슈를 추적할 수 있다.


      어셋 지표는 수동으로 DB에 기록
         주기적으로 담당자가 수집 프로그램을 실행.


      클라이언트 성능 지표는 실행 중에 자동으로 전송
         매 1분마다 DB에 전송한다.
적용 사례 – 이미지 리소스 변경점 추적
적용 사례 – 클라이언트 성능 프로파일링

       다른 팀원들의
        데이터 조회




     프로젝트 포탈
     사이트에 간략하게
     표시
5. 프로파일링 DB – 구현

   클라이언트는 웹페이지를 통해 자료를 전송
      C++로 DB에 직접 접속하려면 여러 가지로 번거롭다.

      HTTP Request 등으로 간단하게 처리 가능
      예) http://perfdb.deskcast.com/GameClient/default.aspx?id=henjeon&fps=60




   자료 수집보다 분석하고 시각화하는 프로세스가 중요
      주기적으로 자료를 분석하고 유의미한 정보를 찾으려 노력해야 한다.
      “시각적인 진단 도구” 가 역시 중요하다.
렌더링 기술
6. 텍스쳐 스트리밍

 저해상도 텍스쳐(썸네일)를 먼저 보여주고,
    텍스쳐 요청이 들어오면 저해상도 텍스쳐를 로딩.
    크기가 작기 때문에 빠르게 로딩 가능.


 천천히 고해상도 텍스쳐를 로딩한 후,
    백그라운드 작업 스레드에서 처리한다.



 고해상도 텍스쳐로 교체
    썸네일을 새 텍스쳐로 교체한다.
6. 텍스쳐 스트리밍

  장점
       로딩 응답 시간을 줄일 수 있다.
       모든 썸네일을 미리 로딩해두면 요청 즉시 렌더링에 사용할 수 있다.

       무조건 텍스쳐의 모든 밉맵을 로딩하지 않고, 필요한 밉맵만 로딩한다면
       비디오 메모리를 절약할 수 있다.



  단점
       “만들기 정말 귀찮다”
6. 텍스쳐 스트리밍 - 구현

  필요한 밉맵 레벨 계산
      메시에 매핑된 텍스쳐의 텍셀:픽셀 비율이 1 이상이 되는 밉맵 레벨을 찾는다.




  계산에 필요한 값
      화면 해상도
      메시의 중심 위치
      그리고 텍스쳐 스케일
6. 텍스쳐 스트리밍 - 구현

  텍스쳐 스케일                                                 pos: (2, 5)
                                                          uv: (0.5, 0)
      메시의 uv 길이와 월드 길이의 비율.
      텍스쳐를 확대해서 매핑할 수록 이 값은 작다.

                                                                     ts: 0.19
                                         ts: 0.09
  메시 전처리 단계에서 미리 계산
      우리의 경우, 모든 엣지의 텍스쳐 스케일을
      계산한 후에 그 평균값을 사용한다.
                                                                         pos: (5, 1)
                                                                         uv: (1, 0.8)
                                                      ts: 0.25
                                  pos: (0, 0)
                                  uv: (0, 0)


                                         메시 ts = (0.09 + 0.19 + 0.25) /3 = 0.18
6. 텍스쳐 스트리밍 - 구현

   이제 계산해보자
      메시의 크기가 변경되지 않는다고 가정(스케일 애니메이션이 없다고 가정)
6. 텍스쳐 스트리밍 - 구현

  텍스쳐 교체는 두 가지 상황에서 발생한다
      카메라가 메시로 다가올 때 : 고해상도 텍스쳐로 교체
      카메라가 메시에서 멀어질 때 : 저해상도 텍스쳐로 교체



  저해상도 텍스쳐로 교체하기는 쉽다
      그냥 바로 바꿔도 사람이 알아채기 어렵다.



  고해상도 텍스쳐로 교체하면 눈에 잘 띈다
      이른바 ‘텍스쳐 팝핑popping’ 현상.
6. 텍스쳐 스트리밍 - 구현

  저해상도 텍스쳐를 고해상도 텍스쳐로 부드럽게 전환
      이미지를 조금씩 변경시키면 팝핑 현상을 줄일 수 있다.




  정답은 없다
      트랜지션은 공짜가 아니다: 크지는 않지만 실행 부하가 있다.
      트랜지션 없이 바로 바꾸는 것을 선호하는 사람도 많다.
6. 텍스쳐 스트리밍 - 구현
  밉맵 LOD 바이어스로 소프트 트랜지션 처리
      SetSamplerState(…, D3DSAMP_MIPMAPLODBIAS, …)




                                                  교체할 두 텍스쳐의
                                               밉맵 개수 차이. 이 값을 조금씩
                                               줄이고, 0이 되면 트랜지션 종료
6. 텍스쳐 스트리밍 – 소프트 트랜지션




   로딩 완료   새 텍스쳐로 교체                   트랜지션 중                  트랜지션 완료
           MipMap LOD Bias = n   MipMap LOD Bias = k, 0<k<n   MipMap LOD Bias = 0
7. TEXCOORDN

   셰이더 소스 코드 생성시 전처리되는 커스텀 키워드
       비슷한 키워드로 COLORN이 있다.

       사실, C***** 셰이더를 보고 도입(=따라함).




   전처리문을 많이 사용하는 셰이더 코드 작성시 아주 유용
       구조체 정의할 때 #if를 많이 쓰고 있다면 이 기능이 반드시 필요.
적용 사례
        struct MeshMainPSInput_Packed
        {
          // …

             float4 texcoord: TEXCOORDN;
             float4 pack00: TEXCOORDN;

        #if CompileOption.ColorOverriding.Enable
         float4 pack01: TEXCOORDN;
         float4 pack02: TEXCOORDN;
        #endif

             float4 pack10: TEXCOORDN;
             float4 pack11: TEXCOORDN;
             float4 pack12: TEXCOORDN;

        #if CompileOption.NormalMapping.Enable
         float4 pack13: TEXCOORDN;
        #endif

             // …
        };
적용 사례

   float4 texcoord: TEXCOORDN;
   float4 pack00: TEXCOORDN;

  #if CompileOption.ColorOverriding.Enable
                                                   float4 texcoord: TEXCOORD0;
   float4 pack01: TEXCOORDN;
                                                   float4 pack00: TEXCOORD1;
   float4 pack02: TEXCOORDN;
  #endif
                                                   float4 pack10: TEXCOORD2;
                                                   float4 pack11: TEXCOORD3;
   float4 pack10: TEXCOORDN;
                                                   float4 pack12: TEXCOORD4
   float4 pack11: TEXCOORDN;
   float4 pack12: TEXCOORDN;
                                                   float4 pack13: TEXCOORD5;
  #if CompileOption.NormalMapping.Enable
   float4 pack13: TEXCOORDN;
  #endif



                    ColorOverriding이 false, NormalMapping이 true라면,
                              왼쪽 코드는 오른쪽처럼 변경된다.
적용 사례
                              float4 texcoord: TEXCOORD0;
                              float4 pack00: TEXCOORD1;

                             #if CompileOption.ColorOverriding.Enable
                              float4 pack01: TEXCOORD2;
 TEXCOORDN 없이                 float4 pack02: TEXCOORD3;
 코드를 작성하면 오른쪽 처럼 될 것이다.       float4 pack10: TEXCOORD4;
                              float4 pack11: TEXCOORD5;
                              float4 pack12: TEXCOORD6;
                             #else
                              float4 pack10: TEXCOORD2;
                              float4 pack11: TEXCOORD3;
                              float4 pack12: TEXCOORD4;
 TEXCOORDN 이 없다면             #endif
 CompileOption이 3,4개만 넘어가도
                             #if CompileOption.NormalMapping.Enable
 코드의 유지 보수가 괴롭다.             #if CompileOption.ColorOverriding.Enable
                              float4 pack13: TEXCOORD7;
                             #else
                              float4 pack13: TEXCOORD5;
                             #endif
                             #endif
7. TEXCOORDN - 구현
   1. D3DXPreprocessShader() 로 정규화Canonical Form
   // 진정한 남자는 3탭을 사용한다.
   struct MeshMainPSInput_Packed
      {
        float4 texcoord: TEXCOORDN;
        float4 pack00: TEXCOORDN;      struct MeshMainPSInput_Packed
                                       {
   #if 0                                   float4 texcoord : TEXCOORDN ;
       float4 pack01: TEXCOORDN;           float4 pack00 : TEXCOORDN ;
       float4 pack02: TEXCOORDN;           float4 pack10 : TEXCOORDN ;
   #endif                                  float4 pack11 : TEXCOORDN ;
                                           float4 pack12 : TEXCOORDN ;
           float4 pack10: TEXCOORDN;       float4 pack13 : TEXCOORDN ;
           float4 pack11: TEXCOORDN;   }
           float4 pack12: TEXCOORDN;   ;

   #if 1
        float4 pack13: TEXCOORDN;
   #endif
     };
7. TEXCOORDN - 구현
   2. 한 줄씩 읽어가며 TEXCOORDN을 적당히 변경
            ‘{‘를 만나면 새 스택을 시작.
            ‘}’를 만나면 현재 스택을 종료.
            TEXCOORDN을 만나면 현재 스택 안의 TEXCOORDN 개수를 보고 변경.

            정규화되어 있으므로 파서를 만들기 쉽다.


   struct MeshMainPSInput_Packed       struct MeshMainPSInput_Packed
   {                                   {
       float4 texcoord : TEXCOORDN ;       float4 texcoord : TEXCOORD0 ;
       float4 pack00 : TEXCOORDN ;         float4 pack00 : TEXCOORD1 ;
       float4 pack10 : TEXCOORDN ;         float4 pack10 : TEXCOORD2 ;
       float4 pack11 : TEXCOORDN ;         float4 pack11 : TEXCOORD3 ;
       float4 pack12 : TEXCOORDN ;         float4 pack12 : TEXCOORD4 ;
       float4 pack13 : TEXCOORDN ;         float4 pack13 : TEXCOORD5 ;
   }                                   }
   ;                                   ;
8. 업스케일링

  저해상도로 3D 장면을 렌더링하고 그 결과를 확대해 사용
     비싼 픽셀 셰이더 계산 시간을 줄이는 테크닉.
     콘솔 게임에서 많이 사용한다.


  UI와 2D 요소는 1:1로 렌더링한다.
     인터페이스가 뭉개지거나 폰트가 번지는 것은 참을 수 없다.
8. 업스케일링 - 구현

   그냥 Bilinear Filtering로 업스케일링
       이것 저것 다 해봤는데 결과가 좋지 않았다.
       복잡한 업스케일링 셰이더를 쓰면 오히려 더 느려지는 경우도 있다.

       팁: 세로 해상도를 더 확보하는 것이 인지적 측면에서 유리.

   프레임버퍼 해상도에 비례해서 렌더 타겟을 생성
       아래와 같이 렌더 타겟을 생성하는 기능이 있다면 업스케일링 구현은 공짜.
적용 사례




   원본   W=0.5배, H=0.5배 (원본의 25%)   0.65배, 0.85배 (55%)
9. 버텍스 단위 3축 조명

  Per Vertex Radiosity Normal Mapping
      소스엔진 Radiosity Normal Mapping의 버텍스 단위 버전.

      너무나 유명한 기법이므로 자세한 설명은 생략.
      (http://www2.ati.com/developer/gdc/D3DTutorial10_Half-Life2_Shading.pdf)



  개발 동기
      A. 우리는 배경의 렌더링 품질을 위해서 래디어시티 노멀 맵을 써야 한다.
      B. 그냥 텍스쳐로 구워버리면 너무 용량이 크므로 압축해야 함.
      C. 번지 처럼 박사 학위급 논문 쓰면서 빡시게 압축할 수 있겠니?
      D. 에라 모르겠다 버텍스에 넣고 잊자.
3축 조명 X축




           와이어프레임
3축 조명 Y축
3축 조명 Z축
노멀
조명 결과
알베도
스피큘러
최종 결과




        ※이 지역은 조명테스트 목적으로 제작되었음(플레이 지역 아님)
9. 버텍스 단위 3축 조명 - 구현

   3DSMAX 에서 조명 계산
       자체 제작한 플러그인에서 계산하고 출력(export)한다.
       최근 작업으로 GPU(CUDA)로 계산하는 기능이 추가되어 성능이 크게 개선되었다.




   쓸만한 버텍스 단위의 GIGlobal Illumination 솔루션이 없다
       거의 대부분의 솔루션들은 픽셀 단위 처리만 지원.
       조명 계산 대부분을 직접 제작할 각오를 해야 함(TA 만세!!).
9. 버텍스 단위 3축 조명 - 구현

   탄젠트 공간Tangent Space 대신 라이트 공간Light Space 베이시스Basis 사용
        라이트 좌표계는 버텍스의 노멀을 Z축으로 하는 좌표계로,
        탄젠트 좌표계와 비슷하지만 UV맵과 무관한 좌표계이다.

        노멀 벡터가 같은 버텍스는 라이트 베이시스도 같다.



   특징
        + 저작할 때 인접 면의 UV를 90도 이상 돌려서 매핑해도 괜찮다(저작 편의성).
        + UV매핑을 수정해도 이미 계산한 조명을 재사용할 수 있다(빠른 이터레이션).
        - 약간의 런타임 셰이더 비용이 증가한다(런타임 성능 저하).
10. 컨택트 섀도(Contact Shadow)

   CS는 매우 중요하다
       CS는 캐릭터와 지면을 밀착시켜 주고,
       떠 있다는 느낌을 없앤다.
       물론 Creep Score도 중요하다…




   그림자와 SSAO만으로는 부족
       그림자에는 강도가 없고,
       SSAO는 CS용으로 튜닝하기 어렵다.
10. 컨택트 섀도 - 구현

   일종의 볼륨 파티클 효과
      해당 위치에 빌보드를 붙이고 깊이맵을 참조해서 CS를 계산한 후에,
      디퍼드 섀도(Deferred Shadow) 결과에 곱한다(Modulate).

         float4 ContactShadowPSMain(PSInput input) : COLOR
         {
            input.screenTC.xyz /= input.screenTC.w;

             float depthSample = tex2D(DepthSampler, input.screenTC.xy).x;
             float sceneDepth = GetClipDistance(depthSample);
             float3 scenePos = FromScreenToView(input.screenTC.xy, sceneDepth);

             float shadow = length(scenePos - input.origin) / (input.attributes.x + 0.001f);
             shadow = pow(saturate(1 - shadow),2);

             const float radiusInMeter = input.attributes.x;
             float aoIntensity = saturate(4.0f - 2.5*radiusInMeter);

             shadow *= 0.7f * input.attributes.y;

             return float4(shadow , 0.0f, shadow * aoIntensity, 0);
         }
적용 사례

  발바닥에 한 개씩, 캐릭터 스탠스 위치에 하나 붙인다
요약
가성비 좋은 렌더링 테크닉
     일반 기술
        시각적인 진단 도구
        LAA

     프로젝트 관리 기술
        클라이언트 동영상 인코딩
        스크린샷 히스토리
        프로파일링 DB

     렌더링 기술
        텍스쳐 스트리밍
        TEXCOORDN
        업스케일링
        버텍스 단위 3축 조명
        컨택트 섀도
전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012

More Related Content

What's hot

UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
QooJuice
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
MinGeun Park
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
영욱 오
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
MinGeun Park
 

What's hot (20)

Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .Tips and experience of DX12 Engine development .
Tips and experience of DX12 Engine development .
 
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
NDC 2010 이은석 - 마비노기 영웅전 포스트모템 2부
 
UE4 Garbage Collection
UE4 Garbage CollectionUE4 Garbage Collection
UE4 Garbage Collection
 
GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자GameInstance에 대해서 알아보자
GameInstance에 대해서 알아보자
 
게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU게임프로젝트에 적용하는 GPGPU
게임프로젝트에 적용하는 GPGPU
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
게임에서 흔히 쓰이는 최적화 전략 by 엄윤섭 @ 지스타 컨퍼런스 2013
 
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
유니티의 툰셰이딩을 사용한 3D 애니메이션 표현
 
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
Ndc2010   김주복, v3. 마비노기2아키텍처리뷰Ndc2010   김주복, v3. 마비노기2아키텍처리뷰
Ndc2010 김주복, v3. 마비노기2아키텍처리뷰
 
[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading[Ndc11 박민근] deferred shading
[Ndc11 박민근] deferred shading
 
UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1UI아트 작업자를 위한 언리얼엔진4 UMG #1
UI아트 작업자를 위한 언리얼엔진4 UMG #1
 
그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기그럴듯한 랜덤 생성 컨텐츠 만들기
그럴듯한 랜덤 생성 컨텐츠 만들기
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
Umg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation BoxUmg ,이벤트 바인딩, Invaidation Box
Umg ,이벤트 바인딩, Invaidation Box
 
나만의 엔진 개발하기
나만의 엔진 개발하기나만의 엔진 개발하기
나만의 엔진 개발하기
 
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
NDC2017 언리얼엔진4 디버깅 101 - 게임 기획자, 프로그래머가 버그와 만났을 때 사용할 수 있는 지침들
 
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
[NDC 2010] 그럴듯한 랜덤 생성 컨텐츠 만들기
 
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
[150124 박민근] 모바일 게임 개발에서 루아 스크립트 활용하기
 
게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가게임서버프로그래밍 #8 - 성능 평가
게임서버프로그래밍 #8 - 성능 평가
 

Viewers also liked

GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링
Mark Choi
 

Viewers also liked (15)

라이트,라이트맵,라이트프로브,누가가장가볍고이쁠까
라이트,라이트맵,라이트프로브,누가가장가볍고이쁠까라이트,라이트맵,라이트프로브,누가가장가볍고이쁠까
라이트,라이트맵,라이트프로브,누가가장가볍고이쁠까
 
유니티 게임 그래픽스 아트 개발 사례 분석
유니티 게임 그래픽스 아트 개발 사례 분석유니티 게임 그래픽스 아트 개발 사례 분석
유니티 게임 그래픽스 아트 개발 사례 분석
 
GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링GameMath-Chapter 08 고급렌더링
GameMath-Chapter 08 고급렌더링
 
Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01Unity Surface Shader for Artist 01
Unity Surface Shader for Artist 01
 
Game Visual Art Technologies
Game Visual Art TechnologiesGame Visual Art Technologies
Game Visual Art Technologies
 
Unity Surface Shader for Artist 04
Unity Surface Shader for Artist 04Unity Surface Shader for Artist 04
Unity Surface Shader for Artist 04
 
Unity Surface Shader for Artist 03
Unity Surface Shader for Artist 03Unity Surface Shader for Artist 03
Unity Surface Shader for Artist 03
 
Unity Surface Shader for Artist 02
Unity Surface Shader for Artist 02Unity Surface Shader for Artist 02
Unity Surface Shader for Artist 02
 
LCD Monitor 선택 가이드와 Gamma의 이해
LCD Monitor 선택 가이드와 Gamma의 이해LCD Monitor 선택 가이드와 Gamma의 이해
LCD Monitor 선택 가이드와 Gamma의 이해
 
【Unite 2017 Tokyo】Unityライティング最新情報
【Unite 2017 Tokyo】Unityライティング最新情報【Unite 2017 Tokyo】Unityライティング最新情報
【Unite 2017 Tokyo】Unityライティング最新情報
 
Unite Seoul 2017 Yi SangYun
Unite Seoul 2017 Yi SangYunUnite Seoul 2017 Yi SangYun
Unite Seoul 2017 Yi SangYun
 
Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해Display color와 Digital texture format의 이해
Display color와 Digital texture format의 이해
 
Unite seoul 2016 Rooms2 mobile to VR
Unite seoul 2016 Rooms2 mobile to VRUnite seoul 2016 Rooms2 mobile to VR
Unite seoul 2016 Rooms2 mobile to VR
 
Rooms2 vr ArtWorks
Rooms2 vr ArtWorksRooms2 vr ArtWorks
Rooms2 vr ArtWorks
 
Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?Igc2016 Technical Artist가 뭐하는 사람이에요?
Igc2016 Technical Artist가 뭐하는 사람이에요?
 

Similar to 전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012

전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
devCAT Studio, NEXON
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
Jaeseung Ha
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
devCAT Studio, NEXON
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
MinGeun Park
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
Jeongsang Baek
 

Similar to 전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012 (20)

전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
20140514 team blender_v01 (Korean)
20140514 team blender_v01 (Korean)20140514 team blender_v01 (Korean)
20140514 team blender_v01 (Korean)
 
Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)Ndc2013 정리(upload버전)
Ndc2013 정리(upload버전)
 
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능 인자 이해하기
 
프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model프론트엔드 개발자를 위한 Layer Model
프론트엔드 개발자를 위한 Layer Model
 
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
[NDC2015] 언제 어디서나 프로파일링 가능한 코드네임 JYP 작성기 - 라이브 게임 배포 후에도 프로파일링 하기
 
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
프론트엔드 개발자를 위한 크롬 렌더링 성능인자 이해하기
 
Gametech2015
Gametech2015Gametech2015
Gametech2015
 
모바일웹Ui개발 저자세미나 1부
모바일웹Ui개발 저자세미나 1부모바일웹Ui개발 저자세미나 1부
모바일웹Ui개발 저자세미나 1부
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록 [KGC2014] 울프나이츠 엔진 프로그래밍 기록
[KGC2014] 울프나이츠 엔진 프로그래밍 기록
 
빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)빌드관리 및 디버깅 (2010년 자료)
빌드관리 및 디버깅 (2010년 자료)
 
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud[박민근] 3 d렌더링 옵티마이징_nv_perfhud
[박민근] 3 d렌더링 옵티마이징_nv_perfhud
 
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
Auto Scalable 한 Deep Learning Production 을 위한 AI Serving Infra 구성 및 AI DevOps...
 
Ndc12 이창희 render_pipeline
Ndc12 이창희 render_pipelineNdc12 이창희 render_pipeline
Ndc12 이창희 render_pipeline
 
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
NDC15 - 사례로 살펴보는 MSVC 빌드 최적화 팁
 
Devtree illu
Devtree illuDevtree illu
Devtree illu
 
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
스마트폰 앱 백-엔드 솔루션 개발을 위한 Node.js 실전 가이드
 
고성능 애니메이션 개발 기법 및 성능 최적화
고성능 애니메이션 개발 기법 및 성능 최적화고성능 애니메이션 개발 기법 및 성능 최적화
고성능 애니메이션 개발 기법 및 성능 최적화
 
20200309 (FSRI) deep-family_v2-br31_rabbit
20200309 (FSRI)  deep-family_v2-br31_rabbit20200309 (FSRI)  deep-family_v2-br31_rabbit
20200309 (FSRI) deep-family_v2-br31_rabbit
 

More from devCAT Studio, NEXON

이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
devCAT Studio, NEXON
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
devCAT Studio, NEXON
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
devCAT Studio, NEXON
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
devCAT Studio, NEXON
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
devCAT Studio, NEXON
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
devCAT Studio, NEXON
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
devCAT Studio, NEXON
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
devCAT Studio, NEXON
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
devCAT Studio, NEXON
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
devCAT Studio, NEXON
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
devCAT Studio, NEXON
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
devCAT Studio, NEXON
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
devCAT Studio, NEXON
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
devCAT Studio, NEXON
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
devCAT Studio, NEXON
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
devCAT Studio, NEXON
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
devCAT Studio, NEXON
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
devCAT Studio, NEXON
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
devCAT Studio, NEXON
 

More from devCAT Studio, NEXON (20)

이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
이봄, 스토리텔링으로 즐기는 콘서트 - 시나리오 기획자를 위한 TRPG의 세계, NDC2019
 
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
유인호, <드래곤하운드>비주얼이펙트 연출, NDC2019
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
윤석주, 신입 게임 프로그래머가 되는 법 - 넥슨 채용 프로세스 단계별 분석, NDC2019
 
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
이현기, <드래곤하운드> 새로움과의 새로운 싸움, NDC2019
 
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
강성훈, 실버바인 대기열 서버 설계 리뷰, NDC2019
 
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
김호용, 드래곤하운드 비주얼 개발기 - 프로젝트 킥오프부터 현재까지, 아트의 기둥 세우기, NDC2019
 
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
이무림, Enum의 Boxing을 어찌할꼬? 편리하고 성능좋게 Enum 사용하기, NDC2019
 
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
김혁, <드래곤 하운드>의 PBR과 레이트레이싱 렌더링 기법, NDC2019
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
윤석주, 인하우스 웹 프레임워크 Jul8 제작기, NDC2018
 
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
홍성우, 게임 프로그래머는 어떻게 가르치나요?, NDC2018
 
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
심예람, <프로젝트DH> AI 내비게이션 시스템, NDC2018
 
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
문석진, 프로젝트DH의 절차적 애니메이션 시스템 Ⅱ, NDC2018
 
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
모광택, 모바일 TCG 게임의 라이브 서비스에 대한 경험 공유, NDC2018
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
백승엽, 매직 더 개더링 20년간의 게임디자인 엿보기, NDC2012
 
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
백승엽, M2프로젝트의 애니메이션 로딩 전략, NDC2011
 
백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010백승엽, M2프로젝트의 오류보고시스템, NDC2010
백승엽, M2프로젝트의 오류보고시스템, NDC2010
 
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017홍성우, 내가 만든 언어로 게임 만들기, NDC2017
홍성우, 내가 만든 언어로 게임 만들기, NDC2017
 

Recently uploaded

Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
Wonjun Hwang
 

Recently uploaded (7)

도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption
 
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 

전형규, 가성비 좋은 렌더링 테크닉 10선, NDC2012

  • 1. 가성비價性比 좋은 렌더링 테크닉 10선 넥슨 신규개발3본부 1실 GTR팀 전형규(henjeon@nexon.co.kr)
  • 2. 발표자 소개 넥슨 9년차 프로그래머 현재 신규개발 3본부 1실 GTR팀 팀장 참여 프로젝트 마비노기 XBOX360 마비노기 마비노기2 주요 관심사 Computer Graphics Real-Time Rendering
  • 3. 발표 내용 개발 비용 대비 결과가 좋은 렌더링 기술을 10 가지 소개 지난 몇 년간의 마비노기2 개발 경험을 바탕으로 함. 반 나절 내로 적용할 수 있는 것도 있고 개발에 한두달 정도 필요한 것도 있음. 범용적이면서 독특한 기술 위주로 선정 마비노기2에 특화된 기술들은 제외. 너무 유명하거나 접하기 쉬운 기술도 제외. 주로 제가 개발한 것 위주로… 그래야 설명하기 쉽고 질문에도 답할 수 있습니다. 순위에 없다고 가성비 떨어지는 것은 아님!
  • 4. 발표 순서 일반 기술 2개 렌더링 엔진 전체에 적용 가능한 기술 및 방법론. 프로젝트 관리 기술 3개 개발 과정을 기록으로 남기는 효과적인 방법. 팀 얼라인먼트를 도와주는 도구. 렌더링 기술 5개 렌더링 성능, 품질을 높여주는 기술.
  • 6. 1. 시각적인 진단 도구 디버깅은 확률 게임 버그가 있는 위치를 추측해서 범위를 좁혀나가는 게임이다. 눈 감고 찍지 말고 사실에 근거해서 디버깅하자. 시각 정보는 가장 강력한 정보 소리보다 글자, 글자보다 그림, 그림보다 동영상이 이해하기 쉽다. 빠르고 정확한 진단을 위해 시각 정보를 최대한 활용하자 게다가 그래픽스 프로그래머는 팀에서 이것을 가장 잘 할 수 있는 사람이다.
  • 7. 적용 사례 – 장비 커스터마이징 절단 대상 버텍스 절단면 아티스트가 정의한 장비 조합 절단면을 눈으로 관찰하고 문제점을 쉽게 찾을 수 있다.
  • 8. 적용 사례 – 렌더타겟 이벤트 모니터링 렌더타겟 스테이지(렌더링 순서)
  • 9. 적용 사례 – 프레임 액티비티 리플레이 이벤트를 저장한 후에 반복 재생할 수 있다.
  • 10. 적용 사례 – 카메라 위치 정보 게임 카메라 위치. 디버그 카메라 시점에서 게임 카메라 상태를 진단.
  • 11. 1. 시각적인 진단 도구 - 조언 무리해서라도 무조건 시각화 어떤 형태로든 반드시 보상받는다. 시각화 코드를 첫 번째 테스트 코드라고 생각하라 보통, 진단 코드는 대상 코드 전체를 사용하는 유일한 코드. 일종의 코드 커버리지 테스트를 수행하는 셈. 남에게 코드의 동작을 설명한다는 느낌으로 작성 실제로 이렇게 코드를 작성하다가 문제점을 조기에 발견하는 경우가 많다.
  • 12. 2. LAA(Large Address Aware) 32bit 프로세스에서 최대 4G까지 메모리를 사용할 수 있는 링크 옵션
  • 13. 2. LAA 의외로 이 옵션을 모르는 개발자가 많다 다들 알고 계실 듯 하지만 혹시 모르니 순위에 넣었음… 64bit가 가야 할 길이긴 하지만… 현실은 그렇게 만만하지 않았습니다. 자세한 정보는 아래 링크를 참고 2007 Gamefest, “Why Your Windows Game Won’t Run In 2,147,352,576 Bytes” (http://download.microsoft.com/download/e/3/c/e3c25fea-2b53-4174-8729- 29a4ec16583b/Why%20Your%20Windows%20Game%20Won't%20Run%20In%202,147,352,576%20Bytes.zip)
  • 14. 2. LAA 켜는 법 EXE 프로젝트의 속성창에서 ‘큰 주소 처리’를 켠다. DLL 프로젝트는 변경해도 의미 없다 (할 필요 없다).
  • 15. 2. LAA - 추가 작업 이게 왜 ‘렌더링 테크닉’? 32bit 주소의 상위 1비트를 해킹하는 대표적인 코드가 D3DXEffect. 그래서 몇 가지 추가 작업이 필요하다 다음 슬라이드에서 설명…
  • 16. 2. LAA - 추가 작업 모든 #include <d3dx9.h> 앞에 D3DXFX_LARGEADDRESS_HANDLE 매크로 정의 혹은 아래처럼 속성 시트에 정의
  • 17. 2. LAA - 추가 작업 D3DXGetShaderConstantTable() 대신 D3DXGetShaderConstantTableEx()를 사용하고, D3DXCONSTTABLE_LARGEADDRESSAWARE 추가
  • 18. 2. LAA - 추가 작업 그리고, 이펙트 생성할 때 D3DFX_LARGEADDRESAWARE 옵션 추가. 이펙트 핸들 이름으로 스트링 사용 금지. 이게 전부 정말 쉽다.
  • 20. 3. 클라이언트 동영상 인코딩 클라이언트에 동영상 인코딩 기능을 넣고 라이브 스트리밍 “팀장님, 이 작업 컨펌해주시고 오른쪽 아래 추천, 즐찾 부탁드려요~” 내부 클라이언트에서만 동작하는 ‘개발 전용 기능’ 이 기능을 모두에게 공개하려면 넘어야 할 산이 많다. 일반 유저들은 아*** 같은 서비스를 사용하는 것이 효율적이다. 동영상은 생각을 공유하는 강력한 도구 그리고 개발 과정을 효과적으로 기록에 남길 수 있다.
  • 21. 적용 사례 클라이언트 실행 중에 이 버튼을 누르면 인코딩 시작
  • 22. 적용 사례 동영상은 프로젝트 포탈 사이트에서 라이브 스트리밍 된다 전광판처럼 동영상 제목을 표시 간단한 재생 정보 출력 및 볼륨 조절 기능
  • 23. 적용 사례 영상을 보면서 채팅도 할 수 있다 채팅은 플래시로 구현 스샷 찍게 도와달라고 했더니 다들 이따위로…
  • 24. 적용 사례 동영상은 자동으로 팀 저장소에 남는다
  • 25. 3. 클라이언트 동영상 인코딩 – 우리는 이렇게 활용한다 아침 정기 게임 플레이 테스트 그룹 내에서 돌아가면서 녹화한다. 게임 플레이 장면을 팀 전체가 볼 수 있다. 디렉터 지시 디렉터의 모범 플레이를 학습한다. 기획 의도를 설명하는데 효과적이다. 디버깅 자료 “그 버그 재현법은 몇 월 며칠 영상 어디어디를 보세요”
  • 26. 3. 클라이언트 동영상 인코딩 - 구현 클라이언트 Flash Media Sever 인코딩 서버가 전송한 H.264로 인코딩 스트림을 포워딩 (nVidia CUDA Video Encoder) FLV로 변환후 FMS RTMP로 전송 인코딩 서버 서버 스크립트 동영상 스트리밍 임의로 하나 선택 플래시 플레이어 플래시 플레이어 동영상 폴더 P2P로 채팅 플래시 플레이어 플래시 플레이어
  • 27. 3. 클라이언트 동영상 인코딩 – H.264 인코딩 H.264 비디오 인코딩은 GPU로 처리 nVidia CUDA Video Encoder를 사용한다. (http://developer.download.nvidia.com/compute/DevZone/docs/html/C/doc/CUDA_VideoEncoder_Library.pdf) CUDA를 지원하지 않거나 nVidia GPU가 아니면 motion jpeg 포맷으로 CPU 인코딩한다. (ATI 님들 제발 GPU 인코딩 API좀 공개해주세요…) 오디오는 WASAPIWindows Audio Session API 사용 http://msdn.microsoft.com/en-us/library/windows/desktop/dd371455(v=vs.85).aspx 인코딩한 데이터는 25fps로 인코딩 서버에 전달된다 bitrate와 fps는 조절 가능.
  • 28. 3. 클라이언트 동영상 인코딩 – 인코딩 서버 인코딩 서버는 클라이언트가 보낸 패킷을 동영상으로 변환 클라이언트가 전송한 비디오와 오디오 패킷을 합쳐서 동영상으로 만든다. 서버는 C#으로 제작, 동영상 생성은 ffmpeg(www.ffmpeg.org)를 사용. 클라이언트가 없을 동안에는 동영상 폴더에서 임의로 하나 재생. 동영상은 ffmpeg를 사용해서 FMS로 전달 FMS : Flash Media Server. RTMP(Real Time Messaging Protocol)을 사용해서 전달한다. 동영상을 파일로도 저장한다. 이것 역시 ffmpeg를 사용해서 처리한다.
  • 29. 3. 클라이언트 동영상 인코딩 - FMS FMS로 팀 전체에 동영상을 라이브 스트리밍 FMS로 인코딩 서버가 전송한 동영상을 팀 전체 네트워크에 배포한다. 샘플에 들어있는 multicast 서버 스크립트를 약간 고쳐서 사용 중. Flash Media Interactive Server 4.5를 사용 가격은 500만원 정도(US $4,500). 평가판(Flash Media Development Sever)를 사용해도 무방하나, 동접 제한(10명)이 있고 일정 길이(30분)가 넘는 동영상은 스트리밍이 중지된다. 아래 두 링크를 참고: http://www.adobe.com/products/flash-media-interactive.html http://www.adobe.com/products/flash-media-server-family/buying-guide-comparison.html
  • 30. 3. 클라이언트 동영상 인코딩 – 플래시 플레이어 FMS가 배포하는 스트림을 플래시 플레이어로 재생 FMS에 들어있는 샘플 플레이어를 바탕으로 대충 만들었다. 플래시라서 웹 페이지에서 사용하기 쉽다. 채팅은 플래시의 P2P 기능을 사용 플래시 최근 버전에 들어있는 P2P 기능을 사용해서 채팅을 구현.
  • 31. 4. 스크린샷 히스토리 스크린샷을 생성하면 공유 폴더에 사본 복사 정말 간단한 기능이지만 아주 유용하다. 우리의 경우, 한달 평균 850 장 정도가 저장된다.
  • 32. 4. 스크린샷 히스토리 활용 작업 정기 리뷰, 리포트 작성시 짤방으로 자주 사용된다. 변경점 추적이나 디버깅 할 때도 유용하다. 남는 건 사진 뿐 심심할 때 예전 스크린샷을 보면 추억 돋는다.
  • 33. 5. 프로파일링 DB 클라이언트의 주요 지표를 DB에 저장 DB에 저장해 두면 가공해서 여러 용도로 활용하기 쉽다. 하드웨어 구성 별 클라이언트 성능 정보를 수집 특정 하드웨어에서 발생하는 성능 이슈를 추적할 수 있다. 어셋 지표는 수동으로 DB에 기록 주기적으로 담당자가 수집 프로그램을 실행. 클라이언트 성능 지표는 실행 중에 자동으로 전송 매 1분마다 DB에 전송한다.
  • 34. 적용 사례 – 이미지 리소스 변경점 추적
  • 35. 적용 사례 – 클라이언트 성능 프로파일링 다른 팀원들의 데이터 조회 프로젝트 포탈 사이트에 간략하게 표시
  • 36. 5. 프로파일링 DB – 구현 클라이언트는 웹페이지를 통해 자료를 전송 C++로 DB에 직접 접속하려면 여러 가지로 번거롭다. HTTP Request 등으로 간단하게 처리 가능 예) http://perfdb.deskcast.com/GameClient/default.aspx?id=henjeon&fps=60 자료 수집보다 분석하고 시각화하는 프로세스가 중요 주기적으로 자료를 분석하고 유의미한 정보를 찾으려 노력해야 한다. “시각적인 진단 도구” 가 역시 중요하다.
  • 38. 6. 텍스쳐 스트리밍 저해상도 텍스쳐(썸네일)를 먼저 보여주고, 텍스쳐 요청이 들어오면 저해상도 텍스쳐를 로딩. 크기가 작기 때문에 빠르게 로딩 가능. 천천히 고해상도 텍스쳐를 로딩한 후, 백그라운드 작업 스레드에서 처리한다. 고해상도 텍스쳐로 교체 썸네일을 새 텍스쳐로 교체한다.
  • 39. 6. 텍스쳐 스트리밍 장점 로딩 응답 시간을 줄일 수 있다. 모든 썸네일을 미리 로딩해두면 요청 즉시 렌더링에 사용할 수 있다. 무조건 텍스쳐의 모든 밉맵을 로딩하지 않고, 필요한 밉맵만 로딩한다면 비디오 메모리를 절약할 수 있다. 단점 “만들기 정말 귀찮다”
  • 40. 6. 텍스쳐 스트리밍 - 구현 필요한 밉맵 레벨 계산 메시에 매핑된 텍스쳐의 텍셀:픽셀 비율이 1 이상이 되는 밉맵 레벨을 찾는다. 계산에 필요한 값 화면 해상도 메시의 중심 위치 그리고 텍스쳐 스케일
  • 41. 6. 텍스쳐 스트리밍 - 구현 텍스쳐 스케일 pos: (2, 5) uv: (0.5, 0) 메시의 uv 길이와 월드 길이의 비율. 텍스쳐를 확대해서 매핑할 수록 이 값은 작다. ts: 0.19 ts: 0.09 메시 전처리 단계에서 미리 계산 우리의 경우, 모든 엣지의 텍스쳐 스케일을 계산한 후에 그 평균값을 사용한다. pos: (5, 1) uv: (1, 0.8) ts: 0.25 pos: (0, 0) uv: (0, 0) 메시 ts = (0.09 + 0.19 + 0.25) /3 = 0.18
  • 42. 6. 텍스쳐 스트리밍 - 구현 이제 계산해보자 메시의 크기가 변경되지 않는다고 가정(스케일 애니메이션이 없다고 가정)
  • 43. 6. 텍스쳐 스트리밍 - 구현 텍스쳐 교체는 두 가지 상황에서 발생한다 카메라가 메시로 다가올 때 : 고해상도 텍스쳐로 교체 카메라가 메시에서 멀어질 때 : 저해상도 텍스쳐로 교체 저해상도 텍스쳐로 교체하기는 쉽다 그냥 바로 바꿔도 사람이 알아채기 어렵다. 고해상도 텍스쳐로 교체하면 눈에 잘 띈다 이른바 ‘텍스쳐 팝핑popping’ 현상.
  • 44. 6. 텍스쳐 스트리밍 - 구현 저해상도 텍스쳐를 고해상도 텍스쳐로 부드럽게 전환 이미지를 조금씩 변경시키면 팝핑 현상을 줄일 수 있다. 정답은 없다 트랜지션은 공짜가 아니다: 크지는 않지만 실행 부하가 있다. 트랜지션 없이 바로 바꾸는 것을 선호하는 사람도 많다.
  • 45. 6. 텍스쳐 스트리밍 - 구현 밉맵 LOD 바이어스로 소프트 트랜지션 처리 SetSamplerState(…, D3DSAMP_MIPMAPLODBIAS, …) 교체할 두 텍스쳐의 밉맵 개수 차이. 이 값을 조금씩 줄이고, 0이 되면 트랜지션 종료
  • 46. 6. 텍스쳐 스트리밍 – 소프트 트랜지션 로딩 완료 새 텍스쳐로 교체 트랜지션 중 트랜지션 완료 MipMap LOD Bias = n MipMap LOD Bias = k, 0<k<n MipMap LOD Bias = 0
  • 47. 7. TEXCOORDN 셰이더 소스 코드 생성시 전처리되는 커스텀 키워드 비슷한 키워드로 COLORN이 있다. 사실, C***** 셰이더를 보고 도입(=따라함). 전처리문을 많이 사용하는 셰이더 코드 작성시 아주 유용 구조체 정의할 때 #if를 많이 쓰고 있다면 이 기능이 반드시 필요.
  • 48. 적용 사례 struct MeshMainPSInput_Packed { // … float4 texcoord: TEXCOORDN; float4 pack00: TEXCOORDN; #if CompileOption.ColorOverriding.Enable float4 pack01: TEXCOORDN; float4 pack02: TEXCOORDN; #endif float4 pack10: TEXCOORDN; float4 pack11: TEXCOORDN; float4 pack12: TEXCOORDN; #if CompileOption.NormalMapping.Enable float4 pack13: TEXCOORDN; #endif // … };
  • 49. 적용 사례 float4 texcoord: TEXCOORDN; float4 pack00: TEXCOORDN; #if CompileOption.ColorOverriding.Enable float4 texcoord: TEXCOORD0; float4 pack01: TEXCOORDN; float4 pack00: TEXCOORD1; float4 pack02: TEXCOORDN; #endif float4 pack10: TEXCOORD2; float4 pack11: TEXCOORD3; float4 pack10: TEXCOORDN; float4 pack12: TEXCOORD4 float4 pack11: TEXCOORDN; float4 pack12: TEXCOORDN; float4 pack13: TEXCOORD5; #if CompileOption.NormalMapping.Enable float4 pack13: TEXCOORDN; #endif ColorOverriding이 false, NormalMapping이 true라면, 왼쪽 코드는 오른쪽처럼 변경된다.
  • 50. 적용 사례 float4 texcoord: TEXCOORD0; float4 pack00: TEXCOORD1; #if CompileOption.ColorOverriding.Enable float4 pack01: TEXCOORD2; TEXCOORDN 없이 float4 pack02: TEXCOORD3; 코드를 작성하면 오른쪽 처럼 될 것이다. float4 pack10: TEXCOORD4; float4 pack11: TEXCOORD5; float4 pack12: TEXCOORD6; #else float4 pack10: TEXCOORD2; float4 pack11: TEXCOORD3; float4 pack12: TEXCOORD4; TEXCOORDN 이 없다면 #endif CompileOption이 3,4개만 넘어가도 #if CompileOption.NormalMapping.Enable 코드의 유지 보수가 괴롭다. #if CompileOption.ColorOverriding.Enable float4 pack13: TEXCOORD7; #else float4 pack13: TEXCOORD5; #endif #endif
  • 51. 7. TEXCOORDN - 구현 1. D3DXPreprocessShader() 로 정규화Canonical Form // 진정한 남자는 3탭을 사용한다. struct MeshMainPSInput_Packed { float4 texcoord: TEXCOORDN; float4 pack00: TEXCOORDN; struct MeshMainPSInput_Packed { #if 0 float4 texcoord : TEXCOORDN ; float4 pack01: TEXCOORDN; float4 pack00 : TEXCOORDN ; float4 pack02: TEXCOORDN; float4 pack10 : TEXCOORDN ; #endif float4 pack11 : TEXCOORDN ; float4 pack12 : TEXCOORDN ; float4 pack10: TEXCOORDN; float4 pack13 : TEXCOORDN ; float4 pack11: TEXCOORDN; } float4 pack12: TEXCOORDN; ; #if 1 float4 pack13: TEXCOORDN; #endif };
  • 52. 7. TEXCOORDN - 구현 2. 한 줄씩 읽어가며 TEXCOORDN을 적당히 변경 ‘{‘를 만나면 새 스택을 시작. ‘}’를 만나면 현재 스택을 종료. TEXCOORDN을 만나면 현재 스택 안의 TEXCOORDN 개수를 보고 변경. 정규화되어 있으므로 파서를 만들기 쉽다. struct MeshMainPSInput_Packed struct MeshMainPSInput_Packed { { float4 texcoord : TEXCOORDN ; float4 texcoord : TEXCOORD0 ; float4 pack00 : TEXCOORDN ; float4 pack00 : TEXCOORD1 ; float4 pack10 : TEXCOORDN ; float4 pack10 : TEXCOORD2 ; float4 pack11 : TEXCOORDN ; float4 pack11 : TEXCOORD3 ; float4 pack12 : TEXCOORDN ; float4 pack12 : TEXCOORD4 ; float4 pack13 : TEXCOORDN ; float4 pack13 : TEXCOORD5 ; } } ; ;
  • 53. 8. 업스케일링 저해상도로 3D 장면을 렌더링하고 그 결과를 확대해 사용 비싼 픽셀 셰이더 계산 시간을 줄이는 테크닉. 콘솔 게임에서 많이 사용한다. UI와 2D 요소는 1:1로 렌더링한다. 인터페이스가 뭉개지거나 폰트가 번지는 것은 참을 수 없다.
  • 54. 8. 업스케일링 - 구현 그냥 Bilinear Filtering로 업스케일링 이것 저것 다 해봤는데 결과가 좋지 않았다. 복잡한 업스케일링 셰이더를 쓰면 오히려 더 느려지는 경우도 있다. 팁: 세로 해상도를 더 확보하는 것이 인지적 측면에서 유리. 프레임버퍼 해상도에 비례해서 렌더 타겟을 생성 아래와 같이 렌더 타겟을 생성하는 기능이 있다면 업스케일링 구현은 공짜.
  • 55. 적용 사례 원본 W=0.5배, H=0.5배 (원본의 25%) 0.65배, 0.85배 (55%)
  • 56. 9. 버텍스 단위 3축 조명 Per Vertex Radiosity Normal Mapping 소스엔진 Radiosity Normal Mapping의 버텍스 단위 버전. 너무나 유명한 기법이므로 자세한 설명은 생략. (http://www2.ati.com/developer/gdc/D3DTutorial10_Half-Life2_Shading.pdf) 개발 동기 A. 우리는 배경의 렌더링 품질을 위해서 래디어시티 노멀 맵을 써야 한다. B. 그냥 텍스쳐로 구워버리면 너무 용량이 크므로 압축해야 함. C. 번지 처럼 박사 학위급 논문 쓰면서 빡시게 압축할 수 있겠니? D. 에라 모르겠다 버텍스에 넣고 잊자.
  • 57. 3축 조명 X축 와이어프레임
  • 64. 최종 결과 ※이 지역은 조명테스트 목적으로 제작되었음(플레이 지역 아님)
  • 65. 9. 버텍스 단위 3축 조명 - 구현 3DSMAX 에서 조명 계산 자체 제작한 플러그인에서 계산하고 출력(export)한다. 최근 작업으로 GPU(CUDA)로 계산하는 기능이 추가되어 성능이 크게 개선되었다. 쓸만한 버텍스 단위의 GIGlobal Illumination 솔루션이 없다 거의 대부분의 솔루션들은 픽셀 단위 처리만 지원. 조명 계산 대부분을 직접 제작할 각오를 해야 함(TA 만세!!).
  • 66. 9. 버텍스 단위 3축 조명 - 구현 탄젠트 공간Tangent Space 대신 라이트 공간Light Space 베이시스Basis 사용 라이트 좌표계는 버텍스의 노멀을 Z축으로 하는 좌표계로, 탄젠트 좌표계와 비슷하지만 UV맵과 무관한 좌표계이다. 노멀 벡터가 같은 버텍스는 라이트 베이시스도 같다. 특징 + 저작할 때 인접 면의 UV를 90도 이상 돌려서 매핑해도 괜찮다(저작 편의성). + UV매핑을 수정해도 이미 계산한 조명을 재사용할 수 있다(빠른 이터레이션). - 약간의 런타임 셰이더 비용이 증가한다(런타임 성능 저하).
  • 67. 10. 컨택트 섀도(Contact Shadow) CS는 매우 중요하다 CS는 캐릭터와 지면을 밀착시켜 주고, 떠 있다는 느낌을 없앤다. 물론 Creep Score도 중요하다… 그림자와 SSAO만으로는 부족 그림자에는 강도가 없고, SSAO는 CS용으로 튜닝하기 어렵다.
  • 68. 10. 컨택트 섀도 - 구현 일종의 볼륨 파티클 효과 해당 위치에 빌보드를 붙이고 깊이맵을 참조해서 CS를 계산한 후에, 디퍼드 섀도(Deferred Shadow) 결과에 곱한다(Modulate). float4 ContactShadowPSMain(PSInput input) : COLOR { input.screenTC.xyz /= input.screenTC.w; float depthSample = tex2D(DepthSampler, input.screenTC.xy).x; float sceneDepth = GetClipDistance(depthSample); float3 scenePos = FromScreenToView(input.screenTC.xy, sceneDepth); float shadow = length(scenePos - input.origin) / (input.attributes.x + 0.001f); shadow = pow(saturate(1 - shadow),2); const float radiusInMeter = input.attributes.x; float aoIntensity = saturate(4.0f - 2.5*radiusInMeter); shadow *= 0.7f * input.attributes.y; return float4(shadow , 0.0f, shadow * aoIntensity, 0); }
  • 69. 적용 사례 발바닥에 한 개씩, 캐릭터 스탠스 위치에 하나 붙인다
  • 71. 가성비 좋은 렌더링 테크닉 일반 기술 시각적인 진단 도구 LAA 프로젝트 관리 기술 클라이언트 동영상 인코딩 스크린샷 히스토리 프로파일링 DB 렌더링 기술 텍스쳐 스트리밍 TEXCOORDN 업스케일링 버텍스 단위 3축 조명 컨택트 섀도