그래픽스 42

D3D11 Rasterization - Light

조명은 크게 3가지이다.Direction light, Point light, Spot light 이를 코드로 나타내면 다음과 같다.struct Light{ float3 Strength; float FalloffStart; // point/spot light only float3 Direction; // directional/spot light only float FalloffEnd; // point/spot light only float3 Position; // point light only float SpotPower; // spot light only};Directional light태양같이 아주 멀리 있는 광원을 가정한다.광원은 아주 멀리있다고 정의..

그래픽스/DX11 2024.10.30

인공지능 - 상태 기계 설계 해시맵 이용하기

게임 인공지능 구현에 빠질 수 없는 것이 있다.State Machine Behaviors 상태 기계 행위이다. 아주 간단한 게임에서는 AI는 항상 같은 행위를 한다.다음과 같은 3가지 행위를 가지는 AI가 있다고 가정해보자. 플레이어 쫒아가기흩어지기플레이어로부터 멀어지기이러한 행위의 변화를 표현하는 한 가지 방법으로 각 행위가 하나의 상태를 가지는상태 기게 (State Machine)이란 것이 있다. 상태 기계 설계하기 상태 그 자체는 부분적으로 하나의 상태 기계만 정의한다.그래서 상태 기계 설계에 있어서 상태 기계를 변경하거나상태 기계 간 전이하는 방법을 결정하는 것이 중요하다. state 상태를 구분할 때는 주로 enum class를 사용한다.enum class 혹은 enum을 사용하면switch 문..

그래픽스/OpenGL 2024.10.27

DX11 - 쉐이딩(Blinn-Phong Shading)

쉐이딩은 조명과 재질의 상호작용을 고려해서 색을 결정하는 과정이다. 이때 vs에서 미리 색을 결정해서 ps에서 보간하는 방법이 있고, 쉐이딩 알고리즘 자체를 ps에서 하는 방법이 있다. 둘 중에 어느 것이 다 빠르나면, 픽셀수에 비해 vertex의 수가 훨씬 적기 때문에 vs에서 돌리는 것이 더 빠르다. 대신에 렌더링의 상세도는 조금 떨어질 것이다. 요즘에는 GPU가 많이 빨라졌기 때문에 ps에서 돌리는 경우도 많다. 오늘은 ps에서 blinn-pong shading을 구현한다. 회전 회전을 할 때는 어떤 회전 축에 대해 회전할 것인지 정해야한다. DX는 왼손 좌표계를 사용하고 있기 때문에 Y축을 기준으로 회전시킨다면, 왼손을 엄지를 위로 쭉 펴고 나머지 손가락들을 감아주는 방향으로 회전하는 것과 같다...

그래픽스/DX11 2024.10.25

DX11 - 원근 투영(Perspective Projection)

원근 투영은 원근법에 대한 것으로,원근범에 대한 기본적인 방식은 먼 거리에 있는 물체가더 작게 보이게 2D 화면에 나타내는 방식이다.3D 투영 (또는 그래픽 투영)은 2차원 (2D) 표면에3차원 (3D) 객체를 표시하는 데 사용되는 디자인 기술이다. 원근법을 적용한 그림들의 공통점은 '소실점의 존재'이다.이 소실점을 기준으로 일정 각도만큼의 직선들을 나란히 그리게 되면실제로 소실점에 가까운 부분들은 멀어보이게 되는 시각적 효과를 가져온다. 하지만, 3D 컴퓨터 환경에서 원근법을 적용하기 위해선실제 그림에서 적용되는 방식과는 조금 다르다.결론은 3D Rendering 에서는 소실점 개념은 필요치 않다. 우선, 한가지 생각해볼 문제는 우리가 바라보는 위치즉, 3D 공간을 표현하기 위한 우리의 시계에서는'카메..

그래픽스/DX11 2024.10.23

DX11 - 쉐이더 개념 + 뒷면 제거

이번 강의에서는 렌더링 파이프라인의 각 화살표 단계에서 쉐이더가 무슨 일을 하는지, 왜 필요한지, 왜 이런 구조로 만들어 졌는지 알아보기 위해서 마치 쉐이더라는 것을 활용하는 것 처럼 짜본다. 쉐이더의 이름은 쉐이딩를 할 때 사용해서 쉐이더라는 이름이 붙기 시작했다. 입체감을 주기 위해서 음영처리를 하기 위해서 처리하는 단계이다. 가상 세계에서 정말로 3차원에 있는 것처럼 보이기 위해 빛과 물체의 표면의 상호작용을 고려해서 음영처리 하는 것을 시작으로 GPU안에서 작동하는 프로그램을 쉐이더라고 부르기 시작했다. 쉐이더에 공통적으로 들어가는 것은 스케일, 트랜스레이션, 로테이션 값이다. 같은 물체 안에 동일한 변환을 적용하는 것들은 따로 모아놓고 사용하셨다. 버텍스 쉐이더에서 가장 중요한 것은 어떠한 정보..

그래픽스/DX11 2024.10.21

D3D11 - 2차원 애니메이션 + 깊이 버퍼

렌더를 할 때, CPU가 처리할 기하 정보와 GPU가 처리할 버퍼 정보는 서로 다르다. 정점의 정보와 정점과의 연결관계, 그리고 컬러의 값은 기하 정보이며, 그 정보 값을 토대로 처리할 버퍼를 따로 변수로 둬야한다. 이후 버퍼와 값을 한 함수에 묶어줘서 컴퓨터에게 넘겨주면 컴퓨터가 이를 처리하는 것으로 알고 있었는데, 홍랩에서는 버퍼로 현재 값을 복사하고 있었다. 실제로 DX를 사용하면 cpu에 있는 것을 gpu에 복사하고, 다시 그 값이 변경되고 그 다음에 렌더링이 생기는 과정을 거치는 것을 해당 수업을 통해서 알았다. 오늘날의 GPU CPU 값 전달 방식은, GPU가 데이터를 VRAM에 저장한 상태에서 CPU에서 그렇게하는 신호가 오면 VRAM에서 데이터를 가져와 연산하는 방식이다. 이는 그래픽 카드..

그래픽스/DX11 2024.10.20

2D 운석 피하기 게임 속 수학

운석에 6번 맞으면 플레이어 사망,레이저와 플레이어가 운석이 직접 충돌하는 것으로 운석 부술 수 있음 벡터와 물리 벡터는 방향 + 스칼라입니다. 벡터는 방향을 나타낼 수 있으므로 게임에서는 오브젝트의 방향을 표현하고자벡터를 종종 사용합니다. 오브젝트의 전방 벡터는 오브젝트가 나아가는 직선 방향을 나타내는 벡터입니다.예를 들어 x축을 따라 쭉 이동하는 오브젝트는 전방 벡터 을 가집니다. 개발자는 게임상에서 다양한 벡터 연산을 수행하여 기능 구현을 합니다.따라서 일반적으로 게임 프로그래머는 이런 다양한 벡터 연산을 수행하기 위해 라이브러리를 사용합니다.이로인해 벡터 관련 방정식을 기억하는 것 보다는,어떤 벡터 연산으로 어떤 문제를 해결할 수 있는지를 아는 것이 더 좋습니다.  2D 좌표 평면에서는 x,y축을..

그래픽스/OpenGL 2024.10.20

DX11 - 2차원 변환(VertexShader작업)

일반적으로 우리가 머리 속으로 생각하는 형상을 그래픽으로 표현한 것을 모델이라고 한다. 이러한 것을 3차원으로 표현하기 위해 우리는 메쉬라는 작은 삼각형을 이용해서 모델을 만든다. 그렇다면 이번에는 뭘 만드는 것이 중점이냐면, 2차원 환경에서 삼각형으로 이루어진 물체를 시계 방향과 반시계 방향으로 회전시키고 비율을 줄여보고 늘려볼 수 있다. 또한 중점을 중심으로 회전하는 것과 자기 자신을 회전하는 것 등 이동과 관련에 대한 실습을 해보는 것이 해당 강의의 목표이다. 1. 모델의 이동 모델을 이동시키기 위해서는 각 정점의 현 위치에서 이동시키고자 하는 거리까지 더해주면 된다. 2. 모델의 회전 2차원 회전에서는 어떤 점에 대해서 회전하는 지가 중요하고 3차원 회전에서는 어떤 축에 대해서 회전하는 지가 중요..

그래픽스/DX11 2024.10.03

DX11 - 원 그리기

원은 여러 개의 삼각형을 쪼개어 만든다. 얘를 들어 삼각형을 그린다고 했을 땐, 삼각형0은 vertex 0 2 1 삼각형1은 vertex 0 3 2 ... 이런 식으로 사용할 것이다. 이럴 때 vertex의 순서가 중요하다. 해당 엔진에서는 Vertex 순서가 시계 방향으로 가면 화면에 그려지지만, 반시계 방향으로 그린다면 화면에 제대로 그려지지 않는다. 이러한 방향은 사실 원하는 대로 바꿀 수 있다. 하지만, dx에서는 전통적으로 시계 방향으로 렌더하는 것이 앞면이라고 여긴다. 이러한 삼각형을 원처럼 보이도록 여러개를 쪼개어, sin과 cos을 이용하여 애둘러쌓아 둔다면 원처럼 보인다. 이러한 방식으로 원을 그리면 모든 삼각형이 0번을 공유한다. 하지만 마지막 삼각형은 1번 정점으로 다시 돌아오기 때문..

그래픽스/DX11 2024.10.02

퐁라이팅

lighting은 물체와 빛 사이의 상호작용을 말한다. 사실적인 그래픽을 위해서 lighting이 매우 중요하다. 이러한 linghting 기법 중 하나인 퐁라이팅은 빛을 반사하는 것을 ambient, diffuse, specular, emissive 4가지로 나누어서 표현한다.diffuse는 난반사를 의미하며, 광원으로부터, 광원으로부터 점P까지의 벡터를 l, (normal vector 법선 벡터는 해당 직선이나 평면에서 수직인 벡터를 말한다) 점 P의 normal을 n으로 표현한다. 두 벡터 사이의 각이 작으면 작을수록 점 P는 더 많은 조명을 받게 될 것이다. 점 P로 들어오는 빛의 양은 두 벡터의 내적 값이라고 정의할 수 있다. 즉, 조명의 위치에 따라서 표면이 얼마나 밝아질 지를 정할 수 있다...

그래픽스/DX11 2024.09.30