DirectX
컨텍스트(Context)
https://www.reddit.com/r/opengl/comments/lb3ptw/what_is_context_in_opengl/ OpenGL이나 DirectX와 같은 그래픽스 라이브러리를 학습하다보면 컨텍스트(context)라는 단어를 종종 볼 수 있다. 각 그래픽스 라이브러리마다 구현된 방법도 다르고 사용 방법도 다르겠지만, 일반적으로 컨텍스트는 렌더링 파이프라인 전반에 걸쳐 사용되는 특정한 상태를 기억하고 관리하는 객체라고 생각하면 된다. 이러한 관점에서 OpenGL은 하나의 큰 상태 머신(state machine)이라고 생각하면 된다. 이 상태 머신은 하나의 스레드마다 하나의 컨텍스트를 가질 수 있으며, 컨텍스트를 이용해 상태 머신 내부에서 사용할 수 있는 모든 상태를 관리할 수 있게 된다. ..
쉐이더 리소스 뷰(ID3D11ShaderResourceView) 사용하기
쉐이더는 GPU에서 실행되는 프로그램이다. DirectX와 같은 그래픽스 라이브러리에서 제공하는 렌더링 파이프라인은 GPU와 쉐이더를 이용하여 렌더링을 하기 위한 절차를 의미한다. CPU에서 실행되는 프로그램과 GPU에서 실행되는 프로그램은 서로 다른 메모리를 사용하기 때문에 필요한 데이터가 있다면 이를 CPU나 GPU로 넘겨주어야 한다. DirectX에서는 이렇게 전달되는 데이터를 리소스(resource)라고 부른다. DirectX에서 사용되는 일반적인 리소스의 종류는 크게 텍스처(texture)와 버퍼(buffer, 버텍스 버퍼, 인덱스 버퍼, 컨스턴트 버퍼 등)로 나눌 수 있다. C++에서 실행되는 DirectX 라이브러리의 함수들은 CPU에서 실행되는 코드다. 따라서 GPU에 존재하는 텍스처나 버..
조명
물체를 보다 실감나게 표현하기 위해서는 물체의 재질(material)과 광원의 상호 작용이 필요하다. 광원을 고려하지 않고 픽셀의 색을 결정한다면 텍스처의 샘플링 값이나 버텍스 버퍼나 다른 버퍼에 저장된 물체의 색을 그대로 사용하면 되겠지만, 현실과 가까운 느낌의 물체를 렌더링 할 수는 없을 것이다. 물체의 색을 결정하기 위해선 광원에서 나온 빛이 물체와 충돌하고 반사되어 나온 빛이 관찰자의 눈으로 들어와야 된다. 이 과정에서 눈에 들어오는 빛의 세기 역시 색의 결정에 영향을 주게 된다. 따라서 조명을 사용하여 물체를 렌더링 하고자 한다면 빛의 방향, 빛의 세기, 빛의 위치 등과 같은 광원에 대한 정보와 함께 반사되는 빛의 유형에 대한 정의도 필요하다. DirectX에서 조명 효과를 만들기 위해 일반적으..
노멀 벡터 변환
https://www.scratchapixel.com/lessons/mathematics-physics-for-computer-graphics/geometry/transforming-normals.html 물체를 회전할 때에는 물체가 가지고 있는 노멀 벡터도 함께 회전을 시켜야 한다. 노멀 벡터는 물체의 표면이 어떤 방향을 바라보고 있는지를 나타내는 데이터로 사용된다. 따라서 노멀 벡터는 물체의 표면과 항상 직교를 이루고 있어야 하는데, 물체의 model 변환 그대로 노멀 벡터를 변환하면 상황에 따라 직교를 이루지 않는 경우가 있어 노멀 벡터의 변환은 물체의 model 변환 행렬과 다른 별도의 행렬을 이용해야 한다. 물체의 원래 상태를 a라고 하고, 물체의 스케일링을 x축으로 2배, y축으로 1배 적용..