Modelando um I-Seção em uma biblioteca de gráficos 3D
Pergunta
Eu estou usando Direct3D para exibir uma série de secções em I utilizados na construção em aço. Poderia haver centenas de instâncias desses I-seções em toda a minha cena.
Eu poderia fazer isso de duas maneiras:
Usando o método A, que tem menor número de superfícies. No entanto, com a face traseira abate ligado, as superfícies serão visíveis a partir de apenas um lado. Se abate backface é desligada, em seguida, as flanges (placas horizontais) e web (placa vertical) pode ser processado na ordem errada.
Método B parece correto (e podia manter backface abate ligado), mas no meu modelo da espessura de placas na secção I não tem qualquer importância e gostaria de evitar ter de criar uma tira triângulo separado para cada lado das placas.
Existe uma solução melhor? Existe uma maneira de desligar backface abate apenas para determinadas chamadas de DrawIndexedPrimitives? Eu também como uma resposta de plataforma neutra para isso, se houver um.
Solução
Primeiro, backface abate não tem nada a ver com a ordem em que os objetos são prestados. Fora isso, eu iria para abordagem B por nenhuma razão em particular que não seja aquele que provavelmente vai olhar melhor. Além disso, este objeto, provavelmente, não é mais que uma mão cheia de triângulos; ter centenas em uma cena não deve ser um problema. Se for, tente olhar para instancing hardware.
Outras dicas
Em OpenGL você pode alternar de abate backface para cada triângulo que você desenhar:
glEnable(GL_CULL_FACE);
glCullFace(GL_FRONT);
// or
glCullFace(GL_BACK);
Eu acho que algo semelhante também é possível em Direct3D
Se o seu i-seções não mudam frequentemente, carregue todas as seções em um grande buffer de vértices / index e atraí-los com uma única chamada. Essa é a maneira mais perfeita para desenhar as coisas, e a placa gráfica vai fazer um trabalho rápido, mesmo se você empurrar meio milhão de triângulo para ele.
Sim, isso requer que você duplicar os dados de vértice para todas as seções, mas é assim que D3D9 se destina a ser utilizado.
Eu iria com A como a distância que você estaria vendo o B a partir seria uma perda de poder de processamento para desenhar todos os triângulos degenerados.
Também gostaria de simplesmente demiti-los em um z-buffer e permitir que resolver tudo isso.
Se ele ficar muito lenta, então eu iria começar a olhar para a otimização, mas os gráficos mesmo consumo cartões podem atrair milhões de polígonos por segundo.