2014-05-10 7 views
2

저는 GPU Pro 2, Chapter VI.2에서 " 픽셀 쿼드 메시지 전달"을 사용하는 Eric Penner의 "Shader Amortization"기술을 활용하려고했습니다. 기본적인 아이디어는 2 × 2 조각 쿼드에 현대적인 GPU의 프로세스 조각 쉐이더 것입니다, 당신은 다음과 같은 홀드만큼 네 조각에서 some_var의 값을 얻기 위해 DDX()와 DDY()를 사용할 수 있습니다2x2 픽셀 쿼드에서 어떻게 셰이더 조각 위치를 결정적으로 감지 할 수 있습니까?

  1. 귀하 GPU는이 조각 쉐이더 기회를 많이 열어 고품질의 유도체
  2. 당신은 처리중인 조각을 알고
  3. (왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래)

지원 Compute Shader가 필요로하는 최적화 (2x2 픽셀 쿼드에서 텍스처를 가져 오는 것과 같음).

내 문제는 다음과 같습니다. 처리중인 조각을 결정적으로 감지 할 수 없습니다. 이상적으로 각 조각 블록은 (0, 0), (2, 0), ... (1024, 1024), ...과 같은 짝수 번호의 출력 픽셀 코드에서 시작합니다. 출력 픽셀 x 및 y 좌표는 현재 처리중인 조각을 알기 위해 짝수 또는 홀수입니다. 이 책에서 Penner가 사용하는 방법은 이것이 작동한다고 가정합니다 ... 그러나 그것은 나에게 잘못 될 것 같습니다.

불행히도 내 2x2 조각 쿼드는 비 결정적 장소에서 시작하는 것처럼 보입니다. 나는 (심지어 짝수, 홀수), (홀수, 홀수)에서 시작하는 것을 보았습니다. 어쨌거나 (홀수, 홀수) 보았는지는 기억이 나지 않습니다. 그러나 어쨌든 배열은 출력 해상도와 쉐이더 특성을 포함하여 내가 이해하지 못하는 무수한 요소에 의존하는 것 같습니다. (누군가 8800 GTS를 테스트 중입니다.)

이 비 결정론을 유발하거나 문서를 가지고있는 사람은 누구입니까? 이 분야에는 공식적인 표준화가 거의 없다는 것을 알고 있습니다 만, 현대 데스크톱 수준의 GPU에서는 어떻게 작동하는지에 관심이 많습니다.이 기술을 작동시킬 수있는 방법이 있기를 바랍니다. 아무도 짝수/홀수 시작 동작에 대해 추론하는 방법을 안다면 2x2 쿼드에서 현재 조각의 상대 위치를 결정하는 다른 방법을 알고 있습니까? 한 출력 해상도가 짝수이기 때문에 ... 는 2 × 2 조각 쿼드 거의 항상 심지어 픽셀 수를에 시작합니까 :

감사합니다 :)

답변

3

이 밝혀 바와 같이, 내 질문의 전제는 대부분 잘못 번호 매김.

출력 해상도가 홀수 인 경우 (작업중인 기본 프로그램의 가능성이 있음) 분명한 이유 때문에 더 복잡한 문제가 발생할 수 있습니다. 나는 여기에 드라이버/GPU의/etc에 어떤 통일성이 있다고 생각하지 않는다. 둘 중 하나이지만 현재 테스트 (자체적으로 버그가있을 수 있음)는 적어도 홀수 차원이 수평 일 때 이상한 해상도의 차원을 따라 홀수 픽셀에서 시작하는 2x2 픽셀 쿼드를 나타냅니다.

이 모든 이상한 점이 내 큰 문제를 불분명하게 만들었습니다. 픽셀 쿼드에서 조각의 위치를 ​​감지하는 데 사용한 코드는 버그가 있습니다. 나는 픽셀 쿼드 (픽셀 쿼드 센터로 설정) 내에서 텍스쳐 좌표를 동일하게 설정하여 테스트를했다. 또는 그렇게 생각했다. 그러나 uv 매핑의 아래쪽을 가리키는 + v 축이있는 전체 화면 쿼드를 기반으로 화면 좌표를 계산했습니다. 스크린 공간 원점은 왼쪽 하단에서 시작합니다. 왜냐하면 직교 좌표의 오른쪽 위 사분면을 기반으로하기 때문에 실수로 픽셀 쿼드 중심을 찾기 위해 사용했던 uv 오프셋의 v 좌표를 반전하는 것을 잊어 버렸습니다. 나의 비결정론적인 관찰의 많은 것들은 결과를 디버깅하고 잘못된 해석을하는 동안, 특히 이상한 결의와 함께 내 가정을 점검하지 못한 데서 비롯된다.

이것은 내가 더 빨리 잡았어야하는 난처한 실수 였지만 반대쪽 방향을 다루는 경우 세로 축의 방향을 항상 두 번씩 점검하라는 경고로 자세히 묘사했습니다. 좌표 프레임. ;)

업데이트 : 해상도가 이상하더라도 2x2 픽셀 쿼드가 짝수 픽셀에서 시작되는 상황을 보았습니다. 홀수 해상도에서 비결정론 덕분에, 내가 다른 솔루션을 해결했다 : 당신이 (사후 처리) 전체 화면 쿼드의 UV 좌표에서 화면 픽셀 번호를 부여하는 경우

  1. 을 조각 위치는 유도 이것은 쿼드 - 픽셀 통신 그 자체가 아니라 조각들 사이에 공유 된 샘플을 정렬/배치하는 데 유용합니다. 화면 공간의 원점을 기준으로 화면 픽셀 수를 가져야합니다. 이들을 정점 위치에서 파생 시키거나 uv 기반 픽셀 번호에서 ddx(). x 및 ddy(). y를 사용하여 화면 방향을 찾고 거기에서 적절한 방향으로 조각 위치를 미러링 할 수 있습니다.
  2. 화면 픽셀 수 (실제 스크린 공간 원점을 기준으로)와 2x2 픽셀 쿼드가 짝수 픽셀로 시작한다는 가정을 기반으로 조각 위치를 계산합니다. (uv 기반 픽셀 숫자를 사용했다면 이제는 물건을 비춰야 할 때입니다.)
  3. 조각 위치에서 ddx(). x와 ddy(). y를 수행하고 어느 방향 으로든 음수이면, 당신은 픽셀 쿼드가 그 방향의 홀수 픽셀 번호에서 시작한다는 것을 알고 있습니다 ... 그래서 그 방향으로 거울을 칠하십시오.
  4. 두 원본 위치를 기반으로하는 두 조각 위치를 계산하는 경우 uv 기반 샘플 배치에 대한 추론을 위해 uv 기반 대상을 사용하고 실제로 원본 위치를 얻기 위해 화면 기반 대상을 사용합니다 인접한 조각들에있는 변수의 값.
  5. 이익.

내가 예문과 함께 Github에서에 출시 한 번 내 작업 MIT-라이센스가 부여 된 코드에 대한 링크를 게시합니다 (무엇이든 속도 향상은 내가 기대했던 불행하게도이 아니라)). 나는 그걸로 업로드 할 큰 쉐이더로 끝내기를 기다리고있다.