Quantos programas OpenGL devo usar para renderizar vários objetos?

10

Minha cena tem vários objetos nela. (Digamos 3 cubos, 1 cilindro, 8 esferas). Suponho que devo criar um sombreador de vértice para cada um. Quantos programas devo ter?

Alternativas:

  • Um programa por objeto
  • Um programa para todos os cubos e outro para todas as esferas (supondo que eles usem os mesmos shaders)
  • Um grande programa para tudo

Qual é a abordagem correta?

Jacks_Gulch
fonte
1
"Suponho que devo criar um shader de vértice para cada um." Por que você está assumindo isso? Um sombreador de vértice transformará os vértices de acordo com seu modelo e exibirá matrizes e você quase sempre deseja que seja o mesmo para tudo.
usm

Respostas:

8

Você deve considerar os programas de sombreador como parte similar do estado das texturas. Alterar o estado é caro, então você poderá combinar várias texturas para uma para evitar alterações de textura; o mesmo se aplica aos shaders - você pode combinar vários shaders para evitar alterações de estado.

Da mesma forma que a combinação de texturas, a combinação de shaders vem com uma sobrecarga - se você renderizar apenas 16x16 pixels de área com uma textura de 4096x4096, não estará usando o hardware com eficiência. Da mesma forma, se o objeto que você renderiza usar apenas 10% do código no seu sombreador, é possível (e até provável) que a placa de vídeo esteja computando muitas coisas desnecessariamente.

Em suma, "depende".

Jari Komppa
fonte
4
Além disso, em muitos casos, você pode se safar com apenas um shader. As diferenças são apenas nas uniformes você passar para o shader, como, cor, textura, mapas normais, etc.
rioki
Sim, por exemplo, você pode ter um sombreador "Escamoso" que produz fragmentos com aparência escamosa e que funciona dessa maneira (a maioria dos sombreadores ...) que você pode renderizar todos os 3 cubos, 1 cilindro e 8 esferas usando esse um sombreador (com as primitivas correspondentes da geometria, é claro). Um conjunto razoável de uniformes aqui pode ser um valor vetorial que define a cor e talvez alguns escalares ou algo que afeta o quão "escamoso" ou "brilhante" será o efeito visual. Então você tem um sombreador e altera a forma como o sombreador se fragmenta, alterando os uniformes entre os desenhos das geometrias individuais.
Steven Lu
5

É melhor manter as coisas o mais simples possível. Duplicar o mesmo sombreador para cada objeto é desnecessário e ficará inchado rapidamente. Você também não deseja um shader gigante que cubra todos os casos de uso possíveis, pois isso causa sobrecarga desnecessária.

Existem várias opiniões sobre gerenciamento de sombreadores e nenhuma maneira "ideal" de abordar isso. Eu já vi algumas implementações de shader em que cada shader é gerado com base em parâmetros off-the-fly (por exemplo, no mecanismo Unreal ).

Para alguém que está começando nessa área, talvez seja bom escrever primeiro os shaders básicos. Por exemplo, tenho um sombreador para objetos sem textura, um sombreador com textura básica e suporte para iluminação por pixel, etc ... Cada vez que eu quero um efeito diferente que não pode ser feito usando um sombreador anterior, então eu ' Criaremos um novo para o novo efeito.

O objetivo desse sistema é manter as coisas simples. Somente. Manter. Isto. Simples.

Anko
fonte
+1 porque você mencionou o que a indústria atual está fazendo.
Krythic