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?
Respostas:
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.
fonte
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.
fonte
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.
fonte
É 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.
fonte