É uma boa prática usar todas as unidades de textura disponíveis?

9

Ao aplicar várias texturas a uma malha, como no mapeamento de bump, costumo vincular as texturas às primeiras unidades fixas de textura, por exemplo: difusa = unidade 0, bump = unidade 1, especular = unidade 2, e continuo reutilizando essas para cada malha diferente com diferentes texturas. Mas sempre me perguntei por que glActiveTexturesuporta tantas unidades de textura (no link anterior, diz pelo menos 80).

Portanto, ocorreu-me que uma maneira possível de gerenciar texturas é vincular texturas distintas a cada unidade disponível e deixá-las ativadas, apenas atualizando o índice do amostrador uniforme. Isso deve melhorar a renderização, reduzindo o número de opções de texturas. Se você tiver menos texturas do que as unidades máximas de textura, nunca precisará desvincular uma textura.

Essa é uma prática padrão em aplicativos OpenGL em tempo real (acredito que isso também se aplica ao D3D)? E há implicações não óbvias no desempenho de adotar essa abordagem? Sobrecarga de memória, talvez?

glampert
fonte

Respostas:

11

O hardware moderno realmente não tem o conceito de pontos de ligação de textura expostos pelo OpenGL. Em vez disso, a unidade de sombreador usa um descritor (que é apenas um tipo de ponteiro de gordura) que pode potencialmente endereçar qualquer textura, desde que resida na memória de vídeo. É isso que possibilita coisas como texturas sem vinculação . Portanto, a grande quantidade de "unidades de textura" disponíveis nas implementações atuais está simplesmente tentando manipular essa parte agora irrelevante da API.

Dito isso, a maneira recomendada de implementar o que você está tentando fazer (evitando a vinculação de texturas) é usar matrizes de textura , que permitem indexar dinamicamente em um conjunto de texturas no shader, desde que todas elas tenham o mesmo formato e tamanho. Esta apresentação contém mais detalhes sobre essas e outras técnicas para reduzir a sobrecarga do driver ao renderizar com o OpenGL moderno: Aproximando a sobrecarga do driver zero

yuriks
fonte
Eu já assisti essa apresentação antes, é muito boa. Eu não sabia o que você mencionou no primeiro parágrafo, então obrigado por essa informação!
glampert