전체 글 143

행렬 변환

게임에서 행렬을 활용하는 대표적인 방법은 Transfrom 변환이다. 어떤 물체의 위치, 크기, 회전에 변화를 주기 위해 그 물체의 벡터에 변환 행렬을 곱해주는 방식이다. 이 방식의 장점은 행렬의 곱 특성 상 결합법칙이 성립하기 때문에 여러 가지 변환 행렬들 끼리 먼저 곱해주고 나중에 도형 벡터에 곱해주면 된다는 것이다.따라서 특정 값 만큼 이동하고 회전하고 크기를 늘려주고 싶으면 해당 변환에 해당하는 변환행렬들을 모두 곱해주기만 하면 결과 값이 나온다는 것이다. 그런데 서로 다른 종류의 변환행렬을 곱할 떄 주의할 사항이 있다. 곱하는 순서가 Scale, Rotation, Transfrom이어야 한다는 것이다. 왜냐하면 Rotate 하고 Scale 하는 것과 Scale 하고 Rotate 한 결과가 다르기..

행렬

곱셈 - 교환법칙 성립 x, 결합법칙 성립 o 단위행렬 : 대각선 요소가 1이고 나머지는 모두 0인 행렬. 교ㅕ환법칙 성립. I로 표현 게임에선 정사각행렬 주로 씀. 벡터를 곱했을 때 크기가 같아야하므로 역행렬 : 곱했을 때 단위행렬이 되는 행렬, 거꾸로 해도 단위행렬임. A[a,b,c,d]의 역행렬: D = ad-bc != 0 일 때 역행렬은 1/D * [d, -b, -c, a] 전치행렬 : 행과 열을 뒤집은 행렬. 대각선을 기준으로 바꿔줌. 직교행렬: 각 행 벡터가 모두 직교하는(내적이 0임) 행렬. 직교행렬의 전치행렬과 직교행렬을 곱하면 단위행렬이 됨. 즉 직교행렬의 역행렬은 직교행렬의 전치행렬임.

VECTOR

Vector의 내적 : 두 벡터 a, b가 있을 때 내적 a . b = |a| * |b| * cos(Theta) = ax*bx + ay*by 가 성립. Dot 함수., Vector의 내적 활용 : 주로 cos연산이 오래걸리는데 x*bx + ay*by는 금방 할 수 있다는 점을 이용. e.g) - 내적이 양수이면 Theta가 예각, 음수이면 Theta가 둔각임을 알 수 있음. cos(Theta)의 성질. - 그림자의 길이를 알고 싶을 때 물체의 벡터 a 와 바닥의 단위벡터 b 를 알면 내적을 이용해 쉽게 구할 수 있음. 그림자의 길이 =|a| * cos(Theta) = |a| * |b| * cos(Theta) = ax * bx + ay * by = ax + ay Vector의 외적 : 두 벡터 a, b가 ..

생성자

class Man{ public : Man(); // 기본생성자 Man(const Man& m); //복사 생성자 Man(int hp);//타입변환 생성자 Man(int hp, int name); //기타 생성자 } 기본생성자 아무런 인자도 받지 않는 생성자. 아무런 생성자도 만들어주지 않을 경우 복사 생성자와 함께 자동으로 암시적 생성된다. 명시적 선언도 가능. 아래와 같이 사용한다. Man m; //자동으로 기본 생성자 호출 복사 생성자 자신과 같은 타입의 클래스를 인자로 받는 생성자. 아무런 생성자도 만들어주지 않을 경우 기본 생성자와 함께 자동으로 암시적 생성된다. 명시적 선언도 가능. 인자로 받은 객체와 모든 멤버 데이터가 같은 객체를 만든다. 아래와 같이 사용한다. Man m1; Man m2(..

C++ 2021.12.27

Index Buffer

Index Buffer란 정점 연결 순서 정보이다. 위 이미지만 보아도 어느정도 이해가 될 정도로 쉬운 내용이다. 사각형을 그리는데는 삼각형 두 개가 필요하다. 그런데 정말로 삼각형 두 개를 겹쳐서 위 그림의 왼쪽 처럼 표현하면 v0과 v5, v2와 v3가 겹쳐 메모리 공간이 낭비된다는 사실을 알 수 있다. 그래서 오른쪽 처럼 정점은 4 개만 표현하고, 대신 정점이 연결된 순서 정보를 담은 Index Buffer를 추가한다. 그림의 {0, 1, 2, 2, 3, 0}은 0, 1, 2로 하나의 삼각형을 그리고, 2, 3, 0으로 두 번째 삼각형을 그린다는 뜻이다. 이렇게 하면 훨씬 적은 공간으로 같은 사각형을 표시할 수 있다.

그래픽스 2021.12.08

Data Flow Languages Part3

Spark : mapreduce가 iterative, interactive 한 작업에 성능상 이슈가 있어서 등장. 데이터 reuse. RDD 사용. RDD 개념. Resilient Distributed Datasets: 스파크 기본 레코드. 변경 불가. Transformation : Rdd를 통해 새로운 RDD 생성. Lineage 추적. Persistence : 캐싱 기능. 개발자에게 맡김. Fault tolerance(Resilient)) : lineage로 깨진 데이터 재생성 가능 Transformation & Action lazy. Transformation을 Lineage로 관리하다가 Action을 만나야 실제 실행. RDD는 어떻게 데이터를 계산하는지에 대한 명령으로 구성되었을지도? Persi..

Constant Buffer

이번 글에서 할 것은 Constant Buffer를 사용해 저번에 그렸던 삼각형의 포지션을 조금 이동시키고, 색을 바꿔줄 것이다. 그렇다면 Constant Buffer란 무었일까 알아보도록 하자. Constant Buffer가 무엇인지 알아보기 전에 아래 그림을 보자. 위 그림에서 1번은 CPU RAM에 있는 데이터, 즉 우리가 일반적으로 코드 상에서 다루는 데이터를 GPU의 RAM으로 보내고있다. 이때 GPU RAM에 Buffer의 형태로 저장되는데, Constant(리소스)를 저장하면 그것이 바로 Constant Buffer다~. 그리고 더욱 빠른 연산을 위해 레지스터도 활용해야 한다. 2번 과정을 통해 Buffer의 주소값을 Register에 등록해서 사용할 수 있다. 그리고 중요한 점은 1번 과정..

그래픽스 2021.11.10

MBTI 어쩌구 50문답

참고로 저는 INFJ입니다. 01) 내 이상형 중 특이한 조건을 말해보자면? 지적이어 보이는 사람. 안경이 잘어울리는 사람? 근데 안경 특) 예쁘고 잘생긴 사람이 끼면 그냥 잘어울림. ​ ​02) 살면서 놓쳤던 인연 중에 한 명을 다시 잡을 수 있다면 누굴 잡을 것인지? 인터넷 방송 열심히 봤는데 방송 접은 사람들. 굉장히 마음아파 ​ ​03) 내가 태어나서 가장 열정적으로 배운 것은? ​프로그래밍. 먹고 살려면 열심히 공부하는 수 밖에... 근데 사실 그렇게 열정적으로 배우지도 않음. 그냥 그나마 배운것 중에 제일 열심히 한 것 뿐. ​ 04) 내가 좋아하는 계절과 시간대는? ​가을, 저녁 6시. 당연히 평균 기온이 사람 살기 가장 좋다는 15도~25도 사이인 가을이 최고다. 저녁 6시는 그냥 퇴근시간..

기타 등등 2021.11.06