라벨이 DirectX12인 게시물 표시
{{ label!='' ? 'Label : ' : (q!='' ? '검색 : ' : '전체 게시글') }} {{ label }} {{ q }} {{ ('('+(pubs|date:'yyyy-MM')+')') }}

[DirectX12] ddx(), ddy()

이미지
텍스처의 밉맵 수준은 언제 결정되나요?   DirectX12에서 적절한 대답은, "Sample() 함수를 호출할 때"이다. 즉, 픽셀 셰이더 단계가 될 것이다. Sample() 함수 내에서는 다시 SampleGrad()를 호출한다. SampleGrad()에는 ddx, ddy 값을 의미하는 매개변수가 전달되며, 이를 통해서 밉맵 수준을 결정할 수 있는 것이다. ddx, ddy의 값을 어떻게 얻나요?   그렇다면 Sample() 내에서 SampleGrad()를 호출하기 위해 ddx, ddy 값을 계산해야 할 것이다. HLSL에서는 ddx(), ddy() 내장 함수를 지원하며, 이를 통해서 해결할 수 있다.   ddx(), ddy()에 대한 설명을 읽어보면 화면 공간의 x, y에 대해서 지정된 값의 편도함수를 반환한다고 써져있다. 이를 이해하는 데 약간의 혼란이 있을 수 있다. 이것이 어떻게 동작하는지를 알면 조금 더 명확해질 것이다.   그래픽 하드웨어는 병렬적으로 프로세스를 처리하며, 워프의 개념이 있어서 가령 32개의 스레드가 동일한 코드를 발맞추어 실행한다. 픽셀 셰이더는 특히 픽셀 단위로 처리되며, 각각의 스레드도 최소한 2x2 픽셀 단위로 처리된다. 따라서 해당 스레드는 자신 주변의 픽셀에 대한 정보 역시 알 수 있게 된다.   따라서 ddx()와 ddy()는 "내 픽셀에서 평가된 매개변수로 주어진 값"과 "옆 픽셀에서 평가된 매개변수로 주어진 값"의 차이 를 반환하는 것이다. 예를 들어, 다음과 같은 코드를 작성하면 화면 공간에서 x나 y로 움직일 때 텍스처 좌표의 변화가 얼마나 급격하게 변하는지를 확인할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 PixelOut PS(VertexOut pin) {     PixelOut pixelOut;           ...

[코딩의탑] 3층: 바다 렌더링

이미지
바다를 그려봅시다.   수많은 게임들은 바다를 배경으로 하고 있습니다. 굳이 바다를 게임의 메인 배경으로 하지 않더라도, 게임 어느 중간에는 꼭 바다를 볼 수 있는 순간이 나오기 마련이죠.  <Sea of Thieves>   이러한 바다를 유체역학적 지식으로 구현하는 것은 쉽지 않습니다. 화면에 보이는 입자가 너무 많아 현실적으로 계산 능력이 부족하기 때문입니다. 따라서 많은 게임들은 바다를 구현하기 위해서 수많은 편법을 활용하고 있습니다. 대표적인 방법은 Displacement Mapping(변위 매핑)을 이용하는 것이죠.  Displacement Mapping   Displacement Mapping이란 Displacement Map을 이용해 물체를 구성하는 일련의 정점들을 재배치하는 것을 의미합니다. 가령, 평평한 격자의 물체가 있고 다음과 같은 두 개의 Displacement Map이 있다면 우리는 파도와 같은 현상을 만들어낼 수 있습니다. 하나는 큰 파도(저주파)를, 다른 하나는 작은 파도(고주파)를 재현합니다. 흰색일수록 위에 있으며, 검은색일수록 아래에 있게 됩니다.   이러한 Displacement Map들을 겹친 후에, 서로 다른 방향으로 움직이게 만들고 겹쳐진 값을 이용해서 Displacement Mapping을 한다면 저렴한 연산으로 파도와 같은 환상을 만들어낼 수 있습니다. 하지만 이 방법은 정적으로 파도가 만들어진다는 한계가 있습니다. 바람의 방향, 파도의 세기 등을 조절하기가 어렵죠. 조금 더 멋진 Displacement Map을 만들 수 있는 방법이 있을까요? Jerry Tessendorf의 'Simulating Ocean Water'   영화 프로듀서이자 교수인 Tessendorf는 그럴듯한 바다를 시뮬레이션할 수 있는 방법을 논문으로 정리해 제안하였습니다. 제가 다룰 내용을 간단히 요약하면 다음과 같습니다: 파도는 일종의 사인파와 코사인파의 합입니다. 따라서 ...