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?
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?
Respostas:
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á.
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! =).
(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 .