GLSL, tudo em um ou mais programas shader?

17

Estou fazendo algumas demos em 3D usando o OpenGL e notei que o GLSL é um pouco "limitado" (ou sou apenas eu?). Enfim, tenho muitos tipos diferentes de materiais. Alguns materiais têm cor ambiente e difusa, alguns materiais têm mapa de oclusão ambiental, alguns têm mapa especular e mapa de relevo etc.

É melhor oferecer suporte a tudo em um par de vértice / fragmento de sombreador ou é melhor criar muitos sombreadores de vértice / fragmento e selecioná-los com base no material atualmente selecionado? Qual é a estratégia usual de sombreador no OpenGL ou D3D?

stjepano
fonte
2
Veja stackoverflow.com/questions/4649801/…
Patryk Czachurski
Esta é uma dicotomia falsa, na qual você deve escolher uma ou outra abordagem para gerenciar shaders. Em quinze anos na indústria, nunca trabalhei em um projeto em que nos aderimos ao extremo, mas sempre encontrei um equilíbrio entre as duas abordagens para gerenciar shaders, usando cada uma delas onde fazia sentido.
Trevor Powell

Respostas:

12

A resposta é que depende.

Basicamente, existem duas escolas de pensamento; shaders pequenos e ótimos para tudo e para o acampamento do uber-shader.

Os pequenos shaders são exatamente isso; faça uma coisa e faça bem. Os Uber-shaders controlam sua funcionalidade no tempo de execução por meio de uniformes ou compilam-se em vários shaders diferentes através de macros de pré-processador (e / ou fontes de shader geradas).

A solução ideal provavelmente não é nenhuma, mas algum tipo de híbrido. Talvez alguns super-shaders ou super-shaders combinados com shaders especializados em alguns casos.

Shader pequeno

Prós:

  • É provável que seja mais rápido / ideal
  • Faz exatamente o que você quer fazer
  • Pode fazer coisas estranhas e personalizadas facilmente

Contras:

  • Facilmente sai do controle, especialmente quando o número de recursos aumenta
  • Provavelmente mais trabalho, a menos que você tenha um número muito pequeno de shaders

Uber-shader

Prós:

  • Tudo em um só lugar
  • Mais amigável ao artista (usar o recurso A com o recurso X pela primeira vez não requer necessariamente tempo do codificador)

Contras:

  • Tempos de compilação mais longos do shader
  • Resultados menos otimizados (especialmente se uniformes forem usados ​​para ativar / desativar recursos)
  • Pode ser mais difícil depurar / otimizar
Jari Komppa
fonte
Uber-shadernesta representação não é uma coisa boa :) Eu proporia escrever um bom gerenciador de sombreadores com base em predefinições - portanto, teremos código de super-sombreador com muitos #ifdefs que serão alternados para vários materiais.
Brigadir
2
Eu acrescentaria que outro profissional de um uber-shader é que os comutadores têm um custo em termos de desempenho; portanto, se você alternar com menos frequência, poderá melhorar o desempenho.
Jherico