Nos sombreadores de vértice OpenGL, a única entrada integrada considerada dinamicamente uniforme é gl_DrawID
. Posso adivinhar que a decisão de não uniformizar gl_InstanceID
dinamicamente foi tomada para permitir que as implementações agrupem vértices de instâncias diferentes em um único warp de sombreador de vértice (/wavefront/qualquer). No entanto, é bem sabido que desenhos instanciados com um pequeno número de vértices por instância são ruins para o desempenho, já que nenhum grande fornecedor de GPU para desktop agrupa múltiplas instâncias em um único warp (o que resulta em baixa ocupação de warp com muitas instâncias com poucos vértices cada ). Isto parece implicar que, na prática, gl_InstanceID
poderia muito bem ser dinamicamente uniforme. Qual foi a razão para não fazer gl_InstanceID
(e também gl_BaseInstance
egl_BaseVertex
) uma expressão dinamicamente uniforme? Existe alguma GPU que possa realmente agrupar várias instâncias por frente de onda ou existia no momento em que a especificação estava sendo escrita?
Expressões dinamicamente uniformes em OpenGL são definidas como expressões que possuem o mesmo valor para todas as invocações no mesmo grupo de invocações. Um grupo de invocação no modo de renderização é a combinação de todas as invocações de todos os shaders causadas por um único comando de desenho. Os comandos de desenho regulares (
glDrawElements
,glDrawArrays
) e o comando de desenho de instância (glDrawElementsInstanced
,glDrawArraysInstanced
, ...) são considerados um único comando de desenho, em contraste com os comandos de desenho múltiplo, que possuem um grupo de invocação separado para cada um de seus subcomandos.O modo como a GPU agrupa os comandos de renderização em warps (um conceito que o OpenGL não tem para invocações de renderização) realmente não desempenha um papel aqui, pois esse não é o fator decisivo para identificar expressões dinamicamente uniformes.
Com base nessas definições, deve ser fácil perceber por que
gl_InstanceID
não pode ser dinamicamente uniforme a menos que haja exatamente uma instância.Observe que a definição de grupo de invocação indicada acima só é válida para o modo de renderização. O modo de computação tem sua própria definição.