{{ 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;           // ...        pixelOut.color  =  float4( length(ddx(pin.TexC)

[코딩의탑] 5층: 포탈(Portal), 더 나아가기

이미지
2층에서 많은 부족함이 있었죠..   2층 에서 우리가 구현한 포탈은 다음과 같은 부족함이 있습니다: 포탈을 단순히 월드에 배치하기만 했으며, 포탈 건의 요구사항을 고려하지 않았습니다. 가령 포탈은 벽에 생성될 수 있어야 합니다. 플레이어의 포탈 이동만을 고려했습니다. 큐브 등 다른 오브젝트 역시 통과할 수 있어야 합니다. 포탈에 걸쳐있는 오브젝트는 포탈 양면에서 보일 수 있어야 합니다. 즉, 오브젝트의 복사가 이루어져야 합니다. Near plane clippng으로 인해 포탈에 들어가기 직전 카메라가 평면과 겹치는 순간, 포탈 평면의 뒷면 모습이 비춰집니다. 포탈에 비추는 플레이어의 모습이 3인칭으로 보여야 합니다. 효율적인 포탈 재귀 렌더링 방법이 필요합니다. 복습해봅시다. 벡터와 점의 변환   포탈 건너편으로 이동하는 효과를 주기 위해서, 우리는 적절히 오브젝트를 이동 및 회전시켜야 합니다. 속도 역시 적절한 방향으로 보존되어야 하죠. 포탈   먼저 위치와 속도는 3차원 벡터로 표현될 수 있습니다. 그리고 이것이 포탈과 포탈 사이에서 자연스럽게 이어져야 하죠. 마치 포탈이 붙어있는 것처럼요! 다음 그림을 참고해보세요. 블루 포탈과 오렌지 포탈은 서로가 위 방향 축을 기준으로 180도 회전한 상태에서 맞붙어있는 것처럼 느껴야 합니다. 블루 포탈과 오렌지 포탈   이는 각 포탈을 일종의 지역 좌표계로 생각해볼 수 있습니다. 포탈의 [앞 방향 벡터, 우측 방향 벡터, 위 방향 벡터]를 각각 [X, Y, Z]축으로 삼는 셈이죠. 우리는 마치 "이어져 있는" 환상을 선사해야 하므로, 한쪽 지역 좌표계의 좌표 값을 그대로 다른쪽 지역 좌표계의 좌표 값으로 자연스럽게 넘겨주면 됩니다. 다양한 방법이 있겠지만 성능을 위해, 각 축에 대한 내적의 값을 이용하도록 합시다. 각 축은 정규화되어 있고 수직이므로, 내적을 이용할 수 있습니다. 좌표계의 변환 소스 코드: APortal::TransformVectorToDestSpace(), TransformPoi