Por que o pipeline programável (GLSL) é mais rápido que o pipeline fixo?

27

Então, eu estou me ensinando GLSL e tentando descobrir por que é suposto ser mais rápido que o pipeline de função fixa.

A razão pela qual estou tendo um problema é que, pelo meu entendimento, os shaders que você cria estão substituindo seções do pipeline que estavam lá antes. Então, como está simplesmente fornecendo sua própria versão, acelerando as coisas?

A única coisa que posso pensar é que, se você tentou fornecer sua própria equação de iluminação antes, teria que fazer o cálculo na CPU, mas agora pode fazer os cálculos na GPU, que serão mais rápidos.

Estou entendendo isso corretamente?

Joey Green
fonte
Você está perguntando se é mais rápido criar suas próprias versões das funções existentes ou se é mais rápido descarregar as funções que você estava calculando na CPU?
MichaelHouse
Eu encontrei um post no gamedev.net que responde às minhas perguntas.
Joey Green
2
Entendo. Você deve postar uma resposta sobre isso aqui, para que outros possam se beneficiar. Talvez esclarecendo sua pergunta no processo.
MichaelHouse
@ joey-green, por favor, vincule o gamedev.net aqui. Eu seria útil para pessoas que se depararão com essa questão.
Quazi Irfan
11
Para confundir mais, nos meus testes o pipeline fixo pode ser realmente mais rápido que shaders, pelo menos em casos simples; consulte sol.gfxile.net/instancing.html
Jari Komppa

Respostas:

27

Os shaders criados não serão sua própria versão do pipeline de função fixa (FFP), mas sim uma operação personalizada de manipulação de vértices e pixels para obter algo interessante e complexo.

Muitas coisas que você faz via pipeline programável (PP) funcionarão mais rapidamente do que suas possíveis implementações de FFP, porque o PP reduz o número de passes ou a quantidade de mágica do combinador e do mapa do cubo necessária para renderizar essas coisas hipotéticas no FFP.

Imagine implementar algo tão comum como iluminação por pixel no FFP com apenas dados de vértices interpolados e textura de amostra em suas mãos. Nem é possível fazer isso "honestamente", apenas hacks para casos especiais, dependendo de mapas de cubos pré-calculados fiéis e de algumas misturas sérias. Com o PP, torna-se uma questão de colorir um produto pontilhado entre a direção da luz e o vértice normal.

Em suma, o PP se torna lento e impossível em rápido e possível. Mas se você decidir escrever um sombreador para implementar os mesmos algoritmos usados ​​no FFP, descobrirá que o FFP será um pouco mais rápido porque é muito otimizado por hardware.

EnoughTea
fonte
11
Boa resposta ... +1.
Amir Zadeh
@ Green Não tenho certeza sobre isso. Perde o argumento de alguma forma. A resposta de Kylotan é muito mais apropriada para a pergunta real.
Chris diz Reinstate Monica
14

Em termos teóricos, o pipeline programável é mais lento que o pipeline de função fixa. Nenhum processador de uso geral pode competir com um processador de caso especial. O pipeline de função fixa original era pouco mais do que um monte de portas lógicas em uma linha o mais rápido possível teoricamente.

No entanto, hoje em dia o pipeline programável é a norma. Portanto, o hardware é voltado para o pipeline programável. Tendo perdido as eficiências iniciais de ter um circuito criado especificamente para um determinado fluxo de dados, ele deve acomodar o caso mais comum, que é a abordagem baseada em shader. No entanto, para opções de compatibilidade com versões anteriores, o pipeline de função fixa ainda é disponibilizado - mas o custo é que as funções fixas antigas precisam ser transacionadas em shaders, o que pode resultar em um custo. Isso explicaria a diferença de desempenho.

Kylotan
fonte
1

A principal razão pela qual pude pensar é em uma fase no pipeline fixo, em que seu programa não precisa disso. por exemplo, imagine um jogo em que todas as luzes são estáticas, você pode implementar facilmente um sombreador que nem tente calcular a luz dinâmica. nesse caso, o sombreador é executado mais rapidamente do que um sombreador pré-compilado que verifica algumas equações quanto à luz dinâmica (um sombreador de uso geral). também existem outros exemplos, você pode facilmente pensar em muitos aspectos que devem ser considerados para um pipeline fixo, mas pode ignorar a implementação em seus próprios códigos GLSL.

Ali1S232
fonte
1

É exatamente isso, seus shaders estão substituindo partes do pipeline. Mas muitas vezes seus shaders são especializados para um efeito específico que você deseja obter e não lida com todos os recursos especiais possíveis que podem ser ativados, sendo, portanto, mais simples do que um shader que emula o pipeline completo de funções fixas. Considerando que o caminho da função fixa precisa levar em consideração muitas coisas e os recursos do OpenGL que você pode simplesmente não querer usar (ou sequer ouviu falar).

E os dias em que você executou a função fixa em hardware especial (oposto a um hardware totalmente programável) acabaram, o que provavelmente acontece quando você usa o pipeline de função fixa é que seu driver apenas carrega seus próprios shaders especiais que implementam o caminhos de função fixa. Mas eles podem ser muito complexos, para fornecer todos os recursos que o pipeline de função fixa oferece.

Chris diz Restabelecer Monica
fonte
"o que provavelmente acontece quando você usa o pipeline de função fixa é que seu driver apenas carrega seus próprios shaders especiais que implementam os caminhos de função fixa". ..Você tem certeza disso? Você pode fornecer algum recurso confiável? Obrigado.
Quazi Irfan
@iamcreasy Não tenho uma fonte confiável (portanto, provavelmente), tenho que admitir. Mas duvido muito que as placas gráficas de hoje em dia (que são apenas um monte de muitos processadores pequenos) ainda tenham hardware dedicado para computação de iluminação ou computação de neblina. Em vez disso, é mais provável que eles apenas carreguem programas pré-compilados para isso nos estágios específicos do shader (se eles vêm do driver ou de algum armazenamento ROM, eu não sei).
Chris diz Reinstate Monica
@iamcreasy de acordo com o nouveau wiki nouveau.freedesktop.org/wiki/CodeNames , o pipeline fixo foi removido na GeForce 6xxx.
DirtY iCE
"o que provavelmente acontece quando você usa o pipeline de função fixa é que seu driver apenas carrega seus próprios shaders especiais que implementam os caminhos de função fixa". Verdade. "Mas eles podem ser muito complexos, para fornecer todos os recursos que o pipeline de função fixa oferece". Um bom driver irá gerar shaders apenas para a funcionalidade que você ativou.
21413 Chris