Devo distribuir shaders de forma compilada ou em texto sem formatação?

13

Tendo um aplicativo que usa shaders que foram escritos no GLSL, qual é a melhor estratégia para a distribuição no mundo real e para desktop e celular?

Meu objetivo é distribuir isso de forma binária ou como texto serializado simples, gostaria de uma boa sugestão sobre isso.

user827992
fonte

Respostas:

15

A principal justificativa para o uso de shaders binários é se a compilação dos shaders de texto é uma carga de trabalho muito grande para o dispositivo de destino. Os shaders GLSL binários não têm um formato padronizado; portanto, você precisa de formatos diferentes para cada GPU / driver que planeja oferecer suporte. Eu recomendo que você distribua os sombreadores no formulário de origem e, em seguida, na primeira execução, armazene-os em cache no formato binário e, posteriormente, carregue a partir daí. Então, novamente, eu primeiro testaria se você realmente tem um gargalo de desempenho para justificar o uso dos binários.

Uma coisa a considerar é também um otimizador de sombreador de texto off - line que pode ter um grande efeito com compiladores de sombreador de baixa qualidade.

Tapio
fonte
Eu ficaria realmente surpreso se você pudesse encontrar qualquer dispositivo em que a compilação do shader seja um gargalo. A quantidade de código, mesmo em shaders grandes, é uma quantidade trivial de código em termos de compilação.
EdA-qa mort-ora-y
1
Os grandes mecanismos por aí geralmente compilam shaders offline e / ou os armazenam em cache na primeira execução, como sugere Tapio. Talvez haja uma quantidade trivial de código por sombreador, mas você pode ter muitos deles.
precisa saber é o seguinte
então eu tenho que comprar uma placa de vídeo ATI aleatória e outra da Nvidia, compilar meus shaders e distribuir apenas a versão compilada? Como posso verificar em tempo de execução qual é a marca da placa de vídeo alvo? Existe algo confiável para isso?
user827992
1
@ user827992 O formato binário pode ser diferente para diferentes gerações de GPUs / controladores, mesmo que o fornecedor seja o mesmo. E não esqueça que também existem muitas GPUs da Intel, muito menos todas as móveis, como Qualcomm e PowerVR. Novamente: sugiro que você não distribua shaders compilados, mas armazene-os em cache na primeira execução no dispositivo do usuário. Em relação à detecção de GPU, você pode tentar analisar as seqüências GL_VENDOR, GL_VERSION e GL_RENDERER do glGetString (), mas seu formato varia de fornecedor para fornecedor.
Tapio