
이번 시간에는 HLSL(High Level Shading Language)을 이용해 언리얼의 Custom Shader를 제작하는 방법을 알아보겠습니다. Shader Shader라는 용어가 조금 생소할 수 있기 때문에 먼저 Shader가 무슨 뜻인지 알아보겠습니다. Shader는 직역하면 음영을 주는 것인데 실제로는 GPU를 이용해 병렬처리를 하는 것으로 많이 쓰입니다. 처음 Shader Programming을 배울 때 제일 어려웠던 부분이 바로 이 용어와 기능이 매치가 안된 점이었습니다. Shader Programming이라고 하면 뭔가 물체의 음영을 줘서 색깔을 칠하거나 재질을 다루는 코드를 작성해야할 거 같은데 정작 하는 것은 Mesh의 각 정점별로, 각 픽셀별로 돌아가는 병렬 프로그래밍이었기 때문입..

여러가지 시뮬레이션 프로그램 개발을 목표로 하고 있으며, 이 블로그에는 그 개발 과정에서 같이 공유하고 싶은 지식을 기록, 공유하는 것에 있습니다. 가장 먼저 개발해보고 싶은 시뮬레이션 현상은 열 현상입니다. 열의 전달과정에 관한 시뮬레이션을 통해 커피의 식어가는 것과 같은 일상현상을 재현해볼 예정입니다. 프로그램 개발 과정과 열 현상이론에 관한 두 가지 내용을 모두 다루고 싶었으나, 프로그램 개발과정은 계속 변화하기 때문에 프로그램이 완성된 후에 한꺼번에 공개하도록 하겠습니다. 그럼 열 현상 이론에 관한 글은 온도(0법칙), 기체동역학, 이동 현상, 에너지(1법칙), 엔트로피(2법칙), 통계역학 이렇게 6가지 큰 주제를 통해 다루도록 하겠습니다. 대학개론 수준으로 상세하게 진행하면 너무 장황하고 지루할..

이번에는 Unreal4를 이용해서 Camera를 제어하는 방법에 대해 알아보겠습니다. 그동안 Unreal을 배워야지라고 늘 생각만 해오다가 최근 본격적으로 시작했습니다. 필자는 Unity를 사용해본 경험이 있고 C++, 자료구조, 알고리즘 등 컴퓨터 공학에 대한 기본적인 지식이 있습니다. Unreal을 어떻게 공부할까 고민하다가 처음 Unity를 배웠던 때가 떠올라서 그때처럼 시작해보기로 결정했습니다. 처음 Unity를 배울 때 책을 보거나 튜토리얼을 따라하지 않았습니다. 대신 구현할 기능을 먼저 생각한 후 이러한 기능을 Unity에서 제공하는 방식을 찾아보고 직접 구현하며 익혔습니다. 찾아보다가 새로운 시스템을 발견하면 그 시스템에 대해서 공부하는 식이었습니다. 인터넷을 검색하며 공부하면 지식이 파편화..

지난 시간에 정의한 벡터의 일반적인 곱셈을 통하여 쿼터니안 연산의 유도과정을 전개해보겠습니다. 이 과정이 150여년전 해밀턴의 사고 과정과 얼마나 유사할 지는 확신은 못하지만 이 것을 고민하는 와중에 폭 넓은 이해를 할 수 있었습니다. 1. 이차원 회전 삼차원 회전에 앞서서 분명 평면상에서 이차원의 회전에 대해 공부했을 것입니다. 이차원 회전은 아래 그림과 수식으로 설명 가능합니다. a벡터의 방향을 i방향으로 잡고 회전 축의 방향을 k방향으로 잡은 후 회전하는 이미지를 나타낸 것입니다. i방향으로는 cos값 만큼 줄고 j방향으로 sin값이 곱해진만큼 더해지는 것을 통해 회전이 표현됨을 볼 수 있습니다. 위 연산은 일반적인 벡터 곱 연산을 사용하여 표현 가능할 것으로 보입니다. 우선 기존 벡터 a에 cos..

지난번에 올린 쿼터니안 해설관련 자료를 올리고 친구와 동료들에게 많은 피드백을 받았습니다. 다수가 문제로 지적했던 점은 제가 올린 자료는 쿼터니안을 수식적으로 분석해서 3차원 회전과 등가임을 증명한 것일 뿐 어떻게 저러한 방식의 연산을 유도했는지에 관한 해설이 부족해 보인다는 것입니다. 저도 친구들에 말에 공감하였고, 제가 그러한 방식으로 글을 올리지 않은 이유는 순전히 저도 몰랐기 때문입니다. 사실 그 첫 글을 쓸 당시는 해밀턴이 어떤 생각으로 쿼터니안 연산을 유도했는지 전혀 짐작해보지 않았습니다. 해밀턴이 과연 어떤 사고를 밟았는지 궁금해졌고 지난 2주간 고민을 한 뒤, 어느 정도 짐작을 마쳤습니다. 이번자료와 다음자료에서는 해밀턴이 어떤 생각의 과정으로 쿼터니안의 연산을 개발했는지에 관한 저의 생각..

1. 서론 아래의 영상과 같이 3D 오브젝트를 단순히 회전시키는 프로그램을 제작하는 데에도 예상 외로 심오한 수학이론이 필요합니다. 레온하르트 오일러(1707~1783)가 제안한 오일러 각 이론을 이용하거나 윌리엄 로언 해밀턴(1805~1865)이 제시한 쿼터니안(Quaternion)이란 숫자체계 체계를 도입하여야 3D 오브젝트의 회전을 구현 할 수 있습니다. 위 두 방법론은 각각 장단점과 특징을 갖습니다. 우선 오일러 각을 이용한 방법은 매우 직관적이어서 처음 접하는 사람들이 이해하기 쉽습니다. 그러나 짐벌락이라 불리는 무시무시한 함정에 빠질 수가 있습니다. 오일러 각과 짐벌락에 관한 자세한 이야기는 다음 자료에서 다루고 이번 자료에선 아주 간략히 언급해보겠습니다. 오일러각도를 이용한 회전은 기본적으로..

앞선 포스팅에서 스켈레톤 애니메이션의 개념과 구현에 필요한 수학적 지식을 알아보았습니다. 이번 포스팅에서는 직접 코드를 이용해서 스켈레톤 애니메이션을 구현해보겠습니다. 우선 결과 영상은 다음과 같습니다. Windows 환경에서 개발하였고 C++, OpenGL, Assimp를 이용해서 구현했습니다. DAE 파일은 본문 맨 아래에 표기한 웹사이트에서 가져왔습니다. Overview 먼저 전체 과정을 Overview 해봅시다. 총 3개의 과정으로 이루어집니다. 첫 번째는 DAE 파일을 로드하는 부분입니다. DAE 파일에는 Mesh의 정점 정보, Animation 정보 및 정점과 Bone을 연결시켜주는 정보 등을 담고 있습니다. 두 번째는 시간에 따라 각 관절의 형태를 선택하는 부분입니다. 애니메이션은 정점에 영..

앞 포스팅에서 캐릭터의 표면을 이루는 정점들이 뼈대에 속해있고 뼈대의 움직임에 따라 정점들을 움직임으로써 애니메이션을 구현한다는 것을 이야기했습니다. 또 뼈대를 계층 구조로 만들면 팔만 움직이거나 손만 움직이거나 하는 애니메이션을 구현할 수 있다고 이야기했죠. 이론상으로는 간단해 보이지만 우리는 컴퓨터에게 규칙을 알려줘야 하기 때문에 수식을 통해 위와 같은 상황을 표현해야겠죠. 그래픽스를 해본 여러분이라면 변환(Transformation)에 대해서 알고 계실 겁니다. Transformation은 두 개의 관점으로 볼 수 있습니다. 첫 번째 관점은 한 공간 안에 있는 모든 정점들을 특정 규칙에 따라 움직이는 연산으로 생각하는 것이고 두 번째 관점은 하나의 가만히 있는 정점에 대해 다른 좌표계에서 바라보도록..

이번에는 3D 캐릭터 스켈레톤 애니메이션에 대해서 얘기해볼까 합니다. 앞으로 이어지는 포스팅에서 컴퓨터를 이용해 3D 캐릭터 애니메이션을 구현하는 방식을 개괄적으로 설명하고 기반이 되는 수학적 지식과 간단한 샘플 코드를 보여드리겠습니다. *참고로 본 포스팅은 그래픽스 프로그래밍을 하는 프로그래머를 위한 포스팅입니다. 따라서 마야나 블렌더 등 3D 툴을 이용해 캐릭터 애니메이션을 만드는 작업에 대해서는 설명하지 않습니다. 샘플 코드에서는 이미 만들어진 캐릭터 애니메이션 파일(.dae)을 Assimp로 읽어서 OpenGL을 이용해 랜더링할 것입니다. 목표 먼저 아래와 같이 3D 캐릭터가 뛰어가는 영상을 만들고 싶다고 해봅시다. 출처: https://giphy.com/gifs/character-animatio..
- Total
- Today
- Yesterday
- Unreal
- 강화학습
- RubiksCube
- CollisionDetection
- DirectX12
- value type
- Mesh Processing
- Scriptable Render Pipeline
- VTK
- Unity
- C#
- Bounding Volume Hierarchy
- collision detection
- AABB
- 최적화
- 루빅스큐브
- perspective projection
- opengl
- SRP
- 참조 형식
- 유니티
- Mesh
- Transformation
- 값 형식
- reference type
- normalized device coordinate
- RL
- NDC
- MeshProcessing
- transform
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |