분류 전체보기(89)
-
[DX12]혼합(Blend) 및 예제
목표혼합의 작동 방식과 Direct3D에서 혼합을 사용하는 법을 이해한다.Direct3D가 지원하는 여러 혼합 모드를 배운다.기본도형의 투명도를 알파 성분을 이용해서 제어하는 방법을 파악한다.HLSL의 clip 함수를 이용해서 한 픽셀이 후면 버퍼에 아예 그려지지 않게 만드는 방법을 배운다. 혼합 공식현재 래스터화 중인 ij번째 픽셀, 즉 원본 픽셀(source pixel) 에 대해 픽셀 셰이더가 출력한 생삭이 Csrc라고 하자. 그리고 현재 후면 버퍼에 있는 ij번째 픽셀, 즉 대상 픽셀(destination pixel)의 색상이 Cdst라고 하자. 만약 혼합을 사용하지 않는다면 Csrc가 Cdst를 덮어 씌운다.(원본이 깊이,스텐실 판정을 통과했다고 할 때)그런데 혼합을 적용하면 Csrc와 Cdst를..
2023.08.26 -
각도로부터 전방 벡터 변환
Actor 클래스의 각도가 라디안(radian) 단위인 회전값을 가지고 있다는 가정하에, 이 값을 사용하면 액터는 자신이 향해야 될 방향으로 회전할 수 있다. 회전은 지금 2D상에서 이뤄지므로 각도는 그림 3.6처럼 단위 원의 각도와 일치한다.각도를 세타(theta)로 표현한 단위 원의 방정식은 다음과 같다.이 방정식은 액터의 각도를 전방 벡터로 변환하는 데 바로 사용할 수 있다.Vector2 Actor::GetForward() const { return Vector2(Math::Cos(mRotation),Math::Sin(mRotation)); }
2023.07.23 -
법선 벡터 계산하기: 외적
법선 벡터(normal vector)는 표면에 수직인 벡터다. 표면(삼각형 등)의 법선 벡터를 계산하면 3D 게임에서 매우 도움이 된다. 예를들어 6장 '3D 그래픽스'에서 설명하는 광원 모델은 법선 벡터의 계산이 필요하다. 평행하지 않은 2개의 3D 벡터가 주어지면 두 벡터를 포함하는 평면은 반드시 존재한다. 외적은 그림 3.9에서 보여주듯이 그 평면에 수직한 벡터를 구한다. (즉 벡터의 두 벡터의 외적을 계산하면 법선 벡터가 나온다.) 외적은 2D 벡터에서는 동작하지 않는다. 그러나 2D 벡터를 3D 벡터로 변환하면 사용할 수 있다. 2D 벡터를 3D 벡터로 변환하려면 z 요소값 0을 2D 벡터에 추가하면 된다. 기술적으로는 그림 3.9에서 평면에 수직인 두 번째 벡터 -c가 존재할 수 있다. 평면에..
2023.07.22 -
두 벡터 사이의 각도 구하기: 내적
두 벡터 사이의 내적(dot product)결과는 단일 스칼라 값이다. 게임에서 내적을 사용하는 가장 일반적인 경우는 두 벡터 사이의 각도를 찾는 것이다. 내가 정리한 벡터정리글 벡터의 크기(길이)는 이중 수직선으로 표기한다. 예를 들어 u의 크기 ||u|| 다음 방정식은 벡터 a와 b의 내적을 계산한다. 또한 내적은 각의 코사인(cosine)과 관계가 있다. 그래서 두 벡터 사이의 각도는 다음과 같이 표현할 수 있다. 그림 3.8에 나와 있는 공식은 코사인 법칙을 토대로 한 것이다. 이 공식을 사용하면 세타를 구할 수 있다. 두 벡터 a,b가 단위 벡터라면 각 벡터의 길이가 1이므로 분모를 생략할 수 있다. 단위 벡터를 사용했으므로 식이 단순해졌는데, 방향만이 중요하다면 미리 벡터를 정규화해두는 것이 ..
2023.07.22 -
벡터를 각도로 변환: 아크탄젠트(2D추천)
벡터가 주어졌을 때 이 벡터를 각도로 변환하려 한다. 탄젠트(tangent) 함수가 각도를 인자로 받고 삼각형의 밑변과 높이의 비율값을 반환했던 걸 떠올리자. 이제 액터의 새로운 전방 벡터로부터 회전 멤버 변수에 해당하는 각도를 구한다고 가정해본다. 이 경우에는 그림 3.7처럼 새로운 전방 벡터 v와 x축으로 직각 삼각형을 구성하면 된다. 이 삼각형에서 전방 벡터의 x요소는 삼각형의 밑변의 길이다. 그리고 전방 벡터의 y요소는 삼각형 높이다. 이 요소들의 비율값을 이용하면 아크 탄젠트 함수를 사용해서 각도 세타를 계산하는 것이 가능하다. 프로그래밍에서 선호되는 아크탄젠트 함수는 atan2함수다. 이 함수는 파라미터로 2개의 인자를 받는다.(삼각형의 높이와 밑변의 길이) 그리고 [- π, π] 범위의 각도..
2023.07.18 -
더블 버퍼링,수직동기화
주로 컴퓨터 그래픽에서 사용되는 용어로서 비디오 메모리만을 사용한 싱글 버퍼링으로 그래픽을 그릴 경우 데이터를 저장하는 동안에는 다음 그림의 데이터를 전송할 수 없기 때문에 지우고 그리고 지우고 그리고 할 경우 필연적으로 발생하는 깜빡임, 찢어짐 등의 상황을 막기 위해서 사용되는 기법이다. 싱글 버퍼링은 비디오 메모리(프론트 버퍼)만을 사용하는데 반하여 예비 버퍼(백 버퍼)를 두어 먼저 버퍼2에 그림을 보내고 그것을 다시 버퍼1로 보낸 다음 버퍼 1의 데이터를 처리하는 동안 다시 버퍼 2에 그림을 보내면 데이터의 전송과 처리가 막히는 일이 없어져서 깜빡임 현상이 사라지게 되는 것이다. 그래서 비단 게임 뿐만이 아니라 그림을 띄워야 하는 프로그래밍을 해야 할 경우에는 반드시 더블버퍼링 API를 찾아보고 적..
2023.06.25