스크린 스페이스 파생 상품이란 무엇이며 언제 사용합니까?


12

나는보고 ddxddyGLSL 기능을하고, HLSL 등가물은 모든 이제 다음 쉐이더 코드에서 온다. 현재 접하거나 비트가없는 범프 매핑을 위해 그것들을 사용하고 있지만 기본적으로 코드를 복사하여 붙여 넣었습니다. 나는이 기능들이 실제로 무엇을하고 무엇을하는지, 언제 사용하려고하는지 이해할 수 없습니다.

따라서 질문 :

  1. 스크린 스페이스 파생 함수는 무엇입니까?
  2. 이 기능들은 무엇을합니까? 입력 값과 출력값
  3. 그들이 가장 일반적으로 사용하는 효과는 무엇입니까?
  4. 이러한 기능에 대해 어떤 종류의 효과가 필요합니까?

과거에는 텍스처 워프에 이것을 사용했는데, 워프가 일부 조각에 대해 잘못된 밉 레벨이 선택 될 수 있습니다. 일반적으로 밉 레벨이 낮으므로 텍스처가 왜곡 될 때 디테일이 매우 눈에 띄게 변화하는 것을 볼 수 있습니다. 변형되지 않은 texcoord의 파생물을 가져온 다음 날실을 계산 한 다음 tex2Dgrad / SampleGrad / textureGrad를 변형 된 texcoord 및 파생물과 함께 사용하면 이러한 상황이 발생하지 않습니다.
Maximus Minimus

@ LeComteduMerde-fou 텍스처 워프 란 무엇입니까? 빠른 구글은 랩을 의미합니까?
NeomerArcana 2

아니요, 워프를 의미합니다 . 즉, 시간이 지남에 따라 텍스처 좌표를 변경하여 텍스처를 왜곡합니다.
Maximus Minimus

이 관련 질문을 참조하십시오 . 링크 된 질문은 이러한 기능의 작동 방식 / 계산 방법에 대해 더 높은 수준의 "이것이 무엇이고 무엇이 좋습니까?"대신 더 많은 것을 요구하기 때문에 상당히 중복되지는 않습니다.
DMGregory

안녕하세요, 저는 이것에 매우 관심이 있습니다 . 현재 접하거나 비트가없는 범프 매핑을하기 위해 그것들을 사용하고 있지만 기본적으로 코드를 복사하여 붙여 넣었습니다. ... 나는 그것을 위해 그것을 생각하고 있었지만 ...이 스크린 공간 파생물을 값싼 선형 대수를 사용하여 세계 공간 법선으로 변환하는 방법을 모르겠습니다. 아마도 카메라 프로젝션 매트릭스의 역수가 필요할 것입니다.
Prokop Hapala

답변:


12

첫째, GPU는 항상 한 번에 2x2 픽셀 블록에서 조각 / 픽셀 쉐이더를 평가한다는 것을 아는 데 도움이됩니다. (이러한 픽셀 중 일부만 최종적으로 그려야하지만 다른 픽셀은 다각형 외부에 있거나 폐색 된 경우에도 필요하지 않은 조각은 끝에 쓰지 않고 마스크 처리됩니다.)

래스터 화 된 삼각형의 미분을 나타내는 다이어그램

v셰이더에서 변수 (또는 표현식)의 화면 공간 파생은 v이 2x2 픽셀 쿼드의 한 쪽에서 다른쪽으로 (코드의 해당 시점에서) 값의 차이입니다 . 즉. ddx의 값은 v우측 화소에 마이너스의 값을 v왼쪽에, 그리고 마찬가지로위한 ddy수직 켜짐.

이것은 " v화면에서 가로 (ddx) 또는 세로 (ddy)로 움직일 때 얼마나 빨리 증가 또는 감소합니까?" -즉 미적분학 용어로 변수 의 부분 미분 값을 근사합니다 (함수의 무한한 동작을 수학적으로 평가하는 대신 각 조각에서 개별 샘플을 사용하기 때문에 근사)

스칼라 수량의 경우 이를 화면 공간 방향을 따라 가장 빠르게 증가 하는 그래디언트 벡터 로 볼 수도 있습니다 .∇v = float2(ddx(v), ddy(v))v

이 유형의 정보는 종종 텍스처 조회를 위해 적절한 밉맵 또는 이방성 필터링 커널 을 선택하기 위해 내부적으로 사용됩니다 . 예를 들어, 카메라가 uv질감이있는 바닥면 의 수직 방향과 거의 평행 해 보이는 경우에 ddy(uv.y)비해 ddx(uv.x)(수직 축이 화면에서 단축되기 때문에-한 픽셀이 수직으로 길게 늘어난 질감 공간을 차지하므로) 텍스처 샘플링 하드웨어에 앨리어싱 아티팩트를 피하기 위해 수평보다 수직 질감 방향을 흐리게하기 위해 이방성 필터링이 필요하다고 알려줍니다.

기본적인 2D 텍스처 샘플링 방법이이를 처리하므로 대부분의 간단한 효과의 경우 이러한 파생물을 사용할 필요가 없습니다. 그러나 Le Comte du Merde-fou가 위의 설명에서 언급했듯이 텍스처 조회를 왜곡 할 때 하드웨어가 적절한 필터링을 선택하도록 돕기 위해 사용할 스크린 스페이스 파생물을 수동으로 검색 및 / 또는 마사지해야 할 수도 있습니다. tex2DlodHLSL에서)

스크린 스페이스 데칼은 하나의 2x2 블록이 계산 된 텍스처 좌표에서 큰 점프 불연속을 커버 할 수 있으며, 시스템이 필터링 레벨을 순진하게 계산하게하면 가장자리가 번지거나 앨리어싱 될 수 있습니다. 이 기사는이 아티팩트에 대해 자세히 설명하고이를 완화하기 위해 접근합니다 .

이 파생물은 절차 적 텍스처 생성에서 노이즈 함수를 사용할 때도 유용 할 수 있습니다. 예를 들어, 절차 적 노이즈를 노멀 맵으로 바꾸고 자한다면 ddx & ddy는 현재 프래그먼트 주변에서 노이즈 값이 어떻게 변하고 어떻게 기울어 지는지 계산할 수있는 간단하고 근사한 방법을 제공합니다. 적절한 법선을 구성 할 수 있습니다.

앤티 앨리어싱 된 선 또는 교차로 강조 표시 를 렌더링하는 기술은 화면 공간 파생을 사용하여 두께 / 폴 오프가 일관되고 지오메트리 또는 뷰 각도에 의존하지 않도록 할 수 있습니다.

Journey의 모래 렌더링에 관한이 강연에서 , 스피커는 이러한 파생 함수를 사용하여 모래가 반짝이는 가장자리를 따라 얼마나 반짝이는지를 제어 할 수 있다고 언급했습니다. 후드 아래에서 이런 종류의 파생물에 의해 구동됩니다)

알아 두어야 할 마지막 참고 사항 : 화면 공간 파생물은 "거친"/ 낮은 정밀도 (한 쌍의 파생물이 전체 쿼드에 의해 공유됨을 의미 함) 또는 "미세"/ 높은 정밀도로 계산 될 수 있음 쿼드에 이웃 한 4 개의 파생 된 파생 쌍을 제공 할 수 있음). 일반적으로 거칠기는 많지만 효과에 2x2 블록이 표시되는 경우 미세 / 고 정도로 전환하는 것이 좋습니다. ;)

(위의 다이어그램에서 나는 고급 파생 상품에 대한 계산을 사용했지만 ddx / ddy만이 기본적으로 파생 파생 상품 일 수 있음에 유의하십시오)


2x2 블록의 한 쪽에서 다른쪽으로 픽셀 간의 차이라고 말하면 픽셀 값의 차이입니까 아니면 텍셀 위치의 차이입니까? 그것이 가치의 차이라면, 그 사이 또는 그 사이의 텍셀을 요약합니까?
NeomerArcana

인수 값 ( v여기) 의 차이이며 2x2 쿼드이므로 사이에 픽셀이 없습니다. 따라서 우리가 쿼드의 왼쪽 상단 조각을 음영 처리하고 v = 1을 거기에서 오른쪽 상단 조각 v = 4로 설정하면 ddx (v) = 3입니다 (이동할 때 "v는 3 씩 증가합니다") 왼쪽에서 오른쪽으로 ")
DMGregory

나는 아직도 잘 이해하지 못한다. 비스듬히 보면 2x2 블록이 텍스처에서 나란히 픽셀로 구성되지 않을 수 있습니다. 따라서 값의 차이는 선택된 두 텍셀의 차이입니까, 아니면 건너 뛴 것을 고려하여 선택한 두 텍셀의 차이입니까?
NeomerArcana 1

텍셀을 잊어 버리십시오 — 텍스처를 샘플링하지 않습니다. ddx 또는 ddy에 전달한 인수의 리터럴 값을 가져 와서 인접 단편을 평가할 때 ddx 또는 ddy에 전달 된 값과 비교합니다. 그 값이 텍스쳐 샘플에서 나온다면, 미분 함수는 텍스쳐에 대한 지식이 없습니다. 그들은 단지 숫자를 뺍니다. 다시 PC로 돌아 오면이 답변에 다이어그램을 추가해 보겠습니다.
DMGregory

아, 지금 이해하고 있다고 생각합니다. 다이어그램을 얻는 것이 좋지만 이해합니다. 이것들은 매우 유용한 기능처럼 보입니다.
NeomerArcana
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.