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?
Respostas:
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:
Contras:
Uber-shader
Prós:
Contras:
fonte
Uber-shader
nesta 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#ifdef
s que serão alternados para vários materiais.