Log Stash

as an Industrial Personnel

잡글

GDC 2018 참관기 및 짧은 미국 여행기 - 4

SavvyTuna 2022. 11. 27. 15:00

이전 참관기에서 이어지는 글.

 

1. Day 4 (2018-03-23)

왠만한 호텔은 짐을 맡아주는 서비스를 제공한다. 안 그러면 밖에서 돌아다니다가 중간에 체크아웃 하러 와야하는데 귀찮으니까,

아침에 일어났을 때 햇빛 드는 게 좋아서 사진 한번 찍었다. 오늘은 밖에서 체크아웃 시간을 넘어 오래 있을 예정이기 때문에 미리 짐을 싸놓고 호텔 1층 리셉션에 가방을 맡겨두고 컨퍼런스 홀로 향했다.

 

2. 세션

2.1. Extreme SIMD: Optimized Collision Detection in Titanfall

초간단 요약

  • 충돌 검사를 위해 4-way AABB tree를 사용 (SIMD 최적)
  • 4개의 자식을 가지고 있는 1개의 노드를 64비트 캐시라인에 쑤셔넣음
  • Branchless AABB 테스트
    • 선, 선분, 반직선 vs. AABB box 충돌 검사 테스트는 아래 논리로 간단하게 판별 가능
    • 각 AABB box face 영역에 대해서, enter 전에 exit 하면 no 충돌. 마지막 enter 이후에 첫 번째 exit이 일어나면 충돌
    • (CPU) 분기 예측 실패 페널티는 크다. 심지어 그 예외 로직으로 빠지는 게 아니더라도 평시 로직 속도를 갉아먹음
    • 그러면 예외 케이스 if-branching 없이 그냥 한벌의 로직으로 예외 케이스를 핸들링 할 수 있으면 좋음
    • SSE2에서는 0으로 나눠도 괜찮도록 로직을 구성함. 0으로 나누는 경우를 따로 처리할 필요가 없음
      • 0으로 나누면 경우에 따라 +, -, NaN이 나오는데 이 셋 다 평상시 AABB test 로직에서 핸들 가능
      • NaN은 IsNan()을 제외한 모든 비교 연산자에서 false를 반환
      • SSE에서 NaN을 집어넣으면 min/max instruction이 무조건 후자를 반환시키는 특성을 이용
      • instruction 특성이 다른 HLSL과 ARM에서는 안됨
  • Branchless AABB tree traversal order
    • AABB tree에 대해 ray test를 했을 때, 충돌하는 순서대로 박스를 순회 & 정렬해서 반환해야
    • bit 조절과 매직 넘버를 '잘' 조작해서 분기 없는 traversal order를 만들어냄
    • mask를 계산할 때, 마스크가 FPU로 넘어가지 않고 integer unit 내부에서 머무르게 해야 했음
      • 매우 기나긴 custom comparison 로직을 작성하거나 (캐시라인 무너짐)
      • 비교 조건 - 결과식 결과를 룩업 테이블 (LUT)로 미리 만들어서 걔만 사용

 

발표 내용과 좀 다른 이야긴데 NaN은 전염성이 심하다. Asin() 같은 Nan-prone 수학 함수를 사용할 때 무조건 정의역 Clamping은 필수. 나중에 애 먼 곳에서 exception이 터지면 원인을 알기 어려운 경우가 있음.

 

x64 캐시라인에 맞는 트리 노드를 설계.
각 face 마다 enter/exit하는 곳을 기록한뒤, 마지막 enter 전에 exit이 있는지 보는것으로 intersection test.
NaN = 숫자가 아님. 아키텍쳐마다 NaN을 다루는 방식이 조금 다르다.
min/max instruction 에서 전, 후 operand를 잘 보고 넣지 않으면 논리는 똑같은데 잘 안되는 코드를 만들 수 있음.

2.2. Inertialization: High-Performance Animation Transitions in Gears of War

초간단 요약

  • 애니메이션 전환을 좀 더 자연스럽게 하기 위해, 단순 cross-fade blending 대신 관성(inertia)을 이용한 blending 방법을 고안해서 사용함
  • 여기까지 오기까지 시도한 아이디어들 먼저 나열
    • 흔히들 많이 쓰는 대로 단순히 blending 하는 것에서 시작해서
    • velocity를 맞춰서 blending
    • overshoot을 제한하는 방법
    • 마지막으로 관성을 사용하는 Inertialization
  • 벡터 & 쿼터니언 보간 할 때, 보통 각 차원을 수치적으로 보간하는데, 그게 아니라 방향, 크기, 각을 따로따로 나눠서 보간하는게 더 이쁨.
  • 블렌딩이 시작되면 source 애니메이션은 stop. target 애니메이션만 evaluation 함. (어차피 source에서 관성을 가져와서 어색하지 않음)

 

손 흔드는 애니메이션과 팔을 내리는 애니메이션은 단순 블렌딩 하면 손을 흔들면서 내리는데 관성화를 하면 좀 더 자연스러움
source 애니메이션의 관성만 계산하고 내부 '블렌딩 상태'를 생각할 필요가 없다.
각 차원을 따로 보간하는 것 보다, 방향과 길이를 분리해서 각자 관성화 시키는게 더 이쁨

 

2.3. Rendering Technology in 'Agents of Mayhem'

 

Rendering Technology in 'Agents of Mayhem'

This talk covers some of the main rendering technologies used on Volition's 'Agents of Mayhem'. The presentation includes Volition's adaptation of Weighted Blended Order-Independent Transparency for use with additive as well as non-additive alpha....

www.gdcvault.com

초간단 요약

  • 게임 특성상 반투명 오브젝트가 포함된 이펙트를 그릴 일이 많은데, 이를 어떻게 처리했는지에 대한 이야기
  • 보통 반투명 오브젝트를 그릴 때 카메라 기준으로 멀리 있는 오브젝트부터 그릴 수 있도록 먼저 정렬하고, 프레임 버퍼에 그린다. (사족:유니티 엔진은 뷰 스페이스 z 축 거리 기준으로 다이나믹 배칭을 한다. material 이 다른 오브젝트가 중간에 안 끼어들도록 잘 정렬해줘야 draw call이 적음)
  • weighted-blended OIT라는 반투명 오브젝트를 그리는 방식이 있는데, 이건 오브젝트를 정렬할 필요가 없음.
  • 오브젝트가 거의 불투명 한지, 거의 투명한지, 아니면 그저 그런지, fx인지 아닌지, 상황에 맞는 가중치 (weight) 설정해줘야 함 (매직넘버 많이 들어감)
  • 각종 블렌딩 문제가 어떤 게 있었고, 어떻게 해결했는지

 

왼쪽 k =3

 

이 세션을 마지막으로 GDC 2018 참관은 끝. 중간에 버거킹 하나 먹었다.

 

다 끝나고 집에가는 nerd들.

 

3. 샌프란 둘러보기

같이 갔던 동료 한 분이 예전에 샌프란에서 잠시 일했던 경험이 있어, 주변을 잘 알고 계셨다. 덕분에 하나도 몰랐던 관광 명소를 그나마 남은 시간에 조금이나마 방문해보았다.

 

마지막으로 출장비가 조금 남아서 비싼 스테이크를 마지막으로 하고 한국으로 돌아왔다. 식사를 끝내고 스테이크 비용과 팁을 현찰로 수십 달러를 bill과 함께 제출했는데, 그걸 매우 공손한 표정으로 받아 들던 웨이터의 모습과, 나중에 카운터 뒤에서 열성적인 모습으로 지폐를 세던 얼굴이 너무 달라서 살짝 웃겼던 기억이 있음.

 

케이블 카 회차 지점
트위터 파란 체크보다 저렴한 $7였던 것으로 기억
앞쪽으로 금문교 방향
기라델리 스퀘어 앞부분
알카트라즈 와 금문교(?)
우버 타고 저녁 먹으러 이동
열변을 토하며 먹느라 정작 스테이크는 못 찍음

 

Alexander's Steakhouse · 448 Brannan St, San Francisco, CA 94107 미국

★★★★★ · 스테이크 전문점

www.google.com

 

 

다음은 마지막으로 세션듣는 요령을 소개하기로 함.