As chamadas de desenho são executadas em paralelo ou sequencialmente ou em ambos?


8

Este é um acompanhamento de uma pergunta que eu respondi no GameDev SE. A pergunta era simplesmente O glDrawArraysInstanced no OpenGL é paralelo ao desenhar essas instâncias?

Minha resposta estava nas linhas de "a GPU pode executar várias chamadas de empate em paralelo, dependendo de várias coisas, por exemplo, se duas chamadas de empate usam os mesmos shaders de vértice". Aqui está a resposta completa .

Nos comentários mencionados pelo OP, "acho que deve ser seqüencial. Afinal, alguns modos de mesclagem dependem da sequência"

Agora, estou um pouco confuso. Minha resposta ainda será paralela a eles quando puder ser válida? Alguém pode esclarecer isso?

Respostas:


9

O resultado deve ser como se fosse executado seqüencialmente, um triângulo de cada vez. Isso é importante para que cada quadro seja determinístico. Se não fosse, desenhar o mesmo quadro várias vezes poderia criar resultados diferentes e criar uma imagem tremeluzente na tela.

No entanto, isso não significa que a paralelização seja impossível . Os vértices podem ser calculados em paralelo. Seus resultados serão ordenados e alimentados ao rasterizador que alimentará o estágio do shader do fragmento.

O mesmo acontece com os pixels. Normalmente, um grupo de pixels de um triângulo pode ser calculado em paralelo e mesclado. Um triângulo sem sobreposição também pode ser preenchido ao mesmo tempo; no entanto, se o triângulo se sobrepuser a um ocupado no momento, o resultado do sombreador de fragmento deve ser armazenado em buffer até que os pixels correspondentes do triângulo anterior sejam feitos, para que a mistura possa ocorrer na ordem correta.


É perfeitamente possível executar o sombreador de pixel para triângulos sobrepostos ao mesmo tempo. Tudo o que importa é que a mistura ocorra sequencialmente. Os sombreadores de pixel podem dar muito trabalho à unidade de mistura em qualquer ordem, o que pode reordenar todas essas operações de mistura, dependendo do triângulo de origem.
precisa saber é o seguinte

Já vi situações em que a cintilação ocorre devido a vários triângulos no mesmo plano, mas não me lembro se isso aconteceu enquanto a câmera / mundo / etc. as transformações eram estáticas ou se exigiam movimento e recálculo. Esse é um caso extremo, no entanto.
JAB

@JAB Parece que você está se referindo ao z-fighting . Isso geralmente ocorre devido ao fato de que, mesmo que duas primitivas sejam analiticamente co-planares, a quantização no interpolador produz um padrão em que alguns pixels das duas primitivas são visíveis. O padrão mudará, causando tremulação, apenas se os vértices (ou câmera) forem movidos; caso contrário, o padrão de interferência deve ser consistente entre os quadros.
MooseBoys

@MooseBoys É exatamente isso, sim. Faz alguns anos que eu fiz muito com gráficos 3D.
JAB

Além de executar vários vértices e pixels em paralelo, também é possível que várias chamadas de draw estejam em andamento ao mesmo tempo, se houver recursos suficientes da GPU disponíveis e não houver dependência entre as chamadas de draw.
Nathan Reed
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.