Direct3D 10 이상에서 삼각형 팬이 지원되지 않는 이유는 무엇입니까?


16

설명서에서 다루는 바와 같이 삼각형 팬은 Direct3D 10 이상에서 지원되지 않습니다 .

왜? 삼각형 팬 작업에 고유 한 단점이 있습니까?


5
필자는 삼각형 팬이 종종 매우 마른 긴 삼각형을 만들어 인공물을 일으키는 interop을 초래한다는 것을 알고 있습니다. 또한 팬과 연결되지 않은 시도를 렌더링하려면 별도의 그리기 호출이 필요하다고 생각합니다. 스트립으로 가능한 곳. 나는 스트립이 더 잘 할 수없는 팬이 할 수있는 일이 없다고 생각합니다.
ClassicThunder

3
인덱스를 사용하여 팬을 연결할 수 있으므로 별도의 호출이 필요하지 않습니다. 훨씬 유연하고, 성능 저하가없고, 대역폭 측면에서 더 가벼운 스트립에도 적용됩니다.
Maximus Minimus

답변:


15

10여 년 동안 하드웨어 공급 업체는 삼각형 스트립, 인덱스 삼각형 목록 및 인덱스 삼각형 스트립을 가장 빠른 기본 유형으로 사용하고 있습니다. 왜? 스트립은 더 나은 캐시 위치를 가지며 (첫 번째로 계속 돌아 가지 않고 제출 된 마지막 2 개의 버트를 재사용 함) 인덱싱을 통해 하드웨어 버텍스 캐시가 실제로 작동 할뿐 아니라 중복 버트를 제거하는 데 더 효과적입니다.

모든 하드웨어 공급 업체가 "이렇게하면 더 빨라질 것"이라고 말하면, 이렇게하면 실제로 더 빨라질 가능성이 매우 높습니다.

D3D10 +는 이것을 공식화합니다. 이것이 빠른 경로라면 사용하려는 경로이며 다른 경로는 존재하지 않습니다. 이것은 D3D10 +의 디자인 철학 중 하나와 관련이 있습니다. D3D10 +는 빠른 길로 가고 당신을 거기에있게합니다.


4

이것이 실제로 개발에 얼마나 영향을 미치는지 모르겠지만 그러한 변경과 마찬가지로 드라이버 개발자가 더 나은 드라이버를 작성할 수 있다고 들었습니다. GPU 드라이버의 복잡성은 놀랍지 만이 정확한 변경이 많은 도움이 될지 확실하지 않습니다.

두 경우 모두 볼록 다각형 렌더링과 같은 대부분의 요구에 맞는 삼각형 팬을 스트립으로 대체 할 수 있으며, 종종 더 나은 결과를 얻을 수 있습니다.

// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
    Push( vertices[ i ] );

// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
    if( i % 2 == 0 )
        vertex = i / 2;
    else
        vertex = vertices.count - 1 - i / 2;
    Push( vertices[ vertex ] );
}

편집 : 언급을 잊어 버렸습니다-와인딩 순서를 변경 해야하는 경우 해당 "if"(== ~! =)에서 테스트를 취소하십시오.


3

(이 특정 질문에는 다음과 같은 의견 답변이 필요합니다.)

주관적으로, 나는 그것의 건축 우주 비행술을 말할 것입니다. 또한 OpenGLES는 레거시 코드를 사용하여 모든 개발자에게 복잡성을 가중시키는 동시에 복잡성을 줄이기 위해 많은 것을 포기했습니다.

물론 하드웨어가 기본적으로 하드웨어를 지원하지 않더라도 삼각형 팬을 스트립이나 삼각형으로 변환하여 시퀀싱하는 사람들과의 호환성을 제공하는 것은 쉽지 않을 것입니다.

WebGL 런타임 등은 검증 된 버퍼 등을 항상 추적해야하며, 드라이버는 팬을 지원하지 않더라도 팬을 보내는 사람들을 쉽게 관리 할 수 있습니다 .

전체 그래서 던지는 밖으로 FFP의 이러한 것은 단지입니다 큰 두통 거리 IMO.


10 년 이상 전에는 이것이 정답 일 것입니다. 오늘날 정점 파이프 라인은 거의 항상 하드웨어로 구현되며 정점 데이터는 GPU 메모리의 버퍼 객체에 저장 될 가능성이 더 높으므로 드라이버에서 가상 팬-투-스트립을 구현하려면 정점 데이터를 CPU 메모리로 다시 가져와야합니다. 순서를 변경 한 다음 GPU 메모리에 다시로드하십시오. 그것은 더 이상 정적 정점 데이터가 없기 때문에 버퍼 객체 사용의 요점을 파괴 할뿐만 아니라 GPU 메모리의 리드 백이 필요하므로 파이프 라인이 멈추고 성능이 저하됩니다.
Maximus Minimus

1
@ mh01 어떤 하드웨어가 팬을 기본적으로 지원하지 않습니까? HW는 결국 OpenGL과 함께 작동해야합니다.
Will

정점 데이터가 저장 될 수 있습니다 는 GPU 메모리에 있지만 시스템 메모리에서 먼저 (적어도 한 번) 시스템 메모리에 도착해야합니다. 그것은 드라이버를 통해입니다. (데이터가 CPU 쪽에서 시작되었다고 가정하면 특수 하드웨어 데모를 제외하고 거의 항상 수행됩니다).
BrainSlugs83
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.