Por que os ventiladores triangulares não são suportados no Direct3D 10 ou posterior?

16

Conforme abordado na documentação, ventiladores de triângulo não são suportados no Direct3D 10 ou posterior .

Por quê? Existem desvantagens inerentes ao trabalho com ventiladores triangulares?

Micah Bolen
fonte
5
Meu entendimento é que, porque os ventiladores de triângulo geralmente resultam em triângulos longos muito finos, resultando em interoperações causando artefatos. Também acho que exige chamadas de desenho separadas para renderizar todas as tentativas que não estão conectadas a um ventilador. Onde for possível com uma tira. Eu não acho que exista algo que os fãs possam fazer que tiras não possam fazer melhor.
ClassicThunder
3
Os fãs podem ser conectados usando índices para que não sejam necessárias chamadas separadas. O mesmo se aplica às tiras (e você pode até conectar ventiladores com tiras), que é muito mais flexível, não requer tris degenerados e mais leve em termos de largura de banda.
Maximus Minimus

Respostas:

15

Por mais de uma década, os fornecedores de hardware têm empurrado tiras triangulares, listas triangulares indexadas e tiras triangulares indexadas como os tipos primitivos mais rápidos de usar. Por quê? As tiras têm melhor localidade de cache (reutilizando os 2 últimos verts enviados em vez de precisar voltar continuamente ao primeiro) e a indexação permite que os caches de vértice de hardware funcionem, além de ser mais eficaz para eliminar verts duplicados.

Se todos os fornecedores de hardware disserem "faça dessa maneira e você será mais rápido", haverá uma boa chance de que, se você fizer dessa maneira, será realmente mais rápido.

Então o D3D10 + apenas formaliza isso; se esse é o caminho rápido, é o caminho que você usará e outros caminhos não existirão. Isso está de acordo com uma das filosofias de design do D3D10 +, que é colocar você no caminho mais rápido e mantê-lo lá.

Maximus Minimus
fonte
4

Eu não sei o quanto isso realmente afeta o desenvolvimento, mas, como em qualquer alteração, foi dito que eles permitirão que os desenvolvedores de drivers escrevam drivers melhores. A complexidade dos drivers da GPU é incrível, mas não tenho certeza se essa alteração exata ajudará muito.

Em ambos os casos, é possível substituir os ventiladores de triângulo para a maioria das suas necessidades (como a renderização de polígonos convexos) por tiras, geralmente com melhores resultados.

// 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 ] );
}

EDIT: esqueci de mencionar - se você precisar alterar a ordem do enrolamento - basta inverter o teste nesse "se" (== a! =).

snake5
fonte
3

(Esta questão em particular merece uma resposta de opinião :)

Subjetivamente, eu diria que é astronautismo de arquitetura. O OpenGLES também jogou muitas coisas para torná-lo 'menos complexo', enquanto na verdade apenas empurra a complexidade para cada desenvolvedor com código legado.

Obviamente, mesmo quando o hardware não o suporta nativamente, seria trivial fornecer compatibilidade com as pessoas que sequenciam os ventiladores de triângulo, convertendo-os em tiras ou triângulos.

Os tempos de execução do WebGL e outros precisam acompanhar os buffers validados e outros o tempo todo, e os drivers podem gerenciar facilmente as pessoas que lhes enviam fãs, apesar de não suportarem.

Então, o todo jogando fora do FFP e tal é apenas uma grande OMI irritante .

Vai
fonte
10 ou mais anos atrás, isso teria sido uma boa resposta. Hoje, o pipeline de vértices é quase sempre implementado em hardware, e é mais provável que os dados de vértices sejam armazenados em objetos de buffer na memória da GPU, portanto, uma implementação hipotética de fã para tira em um driver exigiria puxar os dados de vértice de volta à memória da CPU para reordenar e recarregá-lo na memória da GPU. Isso não apenas destrói toda a questão do uso de objetos de buffer (já que você não possui mais dados estáticos de vértice), mas exige uma readback da memória da GPU;
Maximus Minimus
1
@ mh01 que hardware não suporta ventilador nativamente? O HW tem que trabalhar com o OpenGL completo, afinal ...
Será
Os dados do vértice podem ser armazenados na memória da GPU, mas precisam ser obtidos da memória do sistema de alguma forma (pelo menos uma vez). Isso é através do motorista. (Supondo que os dados tenham originado o lado da CPU, o que, exceto para demonstrações de hardware especializadas, quase sempre ocorre).
precisa saber é o seguinte