Quantas texturas geralmente posso ligar de uma só vez?

23

Estou desenvolvendo um mecanismo de jogo e ele só funciona em hardware moderno (Shader model 4+). Eu acho que, quando eu terminar, isso não será um requisito tão irracional.

Minha pergunta é: quantas texturas posso vincular de uma vez em uma placa gráfica moderna? 16 seria suficiente. Posso esperar que a maioria das placas gráficas modernas suporte esse número de texturas?

Minha GTX 460 parece suportar 32, mas não faço ideia se isso é representativo da maioria das placas de vídeo modernas.

Avi
fonte
Qual API de renderização você está usando?
Adam
2
OpenGL é claro :)
Avi

Respostas:

53

O número de texturas que podem ser vinculadas ao OpenGL não é 32 ou 16 . Não é o que você recebe glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Essa função recupera o número de texturas que podem ser acessadas pelo shader de fragmento .

Veja, cada sombreador tem seu próprio limite do número de texturas que pode usar . No entanto, há também um número total de texturas que podem ser usadas, ponto final. Isso é definido (no OpenGL) por GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Portanto, existem dois limites: as texturas por estágio e as texturas-total-bound.

O OpenGL 3.x define o número mínimo para o limite por estágio ser 16, portanto o hardware não pode ter menos de 16 texturas por estágio. Pode ter um limite mais alto, mas você sabe que obtém pelo menos 16. 3.x define o número mínimo para o limite total de texturas como 48. AKA: 16 * 3 estágios. Da mesma forma, o GL 4.x define os números como 16 texturas por estágio e 96 texturas com limite total (ou seja: 16 * 6 estágios, incluindo sombreadores de computação).

Novamente, esses são os números mínimos . O hardware pode (e faz) variar.

Quanto ao hardware específico, você pode esperar que qualquer hardware da classe DX10 corresponda a esses números. O hardware da classe DX11 tem alguma variação; Os chips NVIDIA (GeForce 4xx +) e AMD de ponta (também conhecidos como núcleos GCN) podem ter mais do que os 16 por estágio.

Nicol Bolas
fonte
2
Eu gostaria que essa fosse a resposta aceita. Isso me salvaria 5 minutos de leitura inútil.
Fibbles 24/03
3

Acredito que 32 é o número máximo de texturas que podem ser vinculadas atualmente. Até onde eu sei, até a série 8800 tinha 32 unidades de textura.

Até onde eu sei, para suporte ao openGL 4.x, você precisará de uma placa nvidia Fermi ou mais recente (ou placa amd correspondente), todos os modelos de ponta parecem ter 32 unidades, enquanto as placas finais mais baixas (GT 430, por exemplo ) têm 16. No entanto, olhando as folhas de especificações da AMD, listam números como 80 ou 128 unidades de textura, mas listam 32 unidades ROP coloridas que parecem ter permanecido constantes por gerações.

O GTX 480, por outro lado, está listado com 60 unidades de textura e 48 unidades de ROP, enquanto placas de extremidade inferior como a 430 supostamente têm apenas 16 unidades de textura e 4 in ROP. Então, no geral, não estou realmente convencido de que nenhum desses seja o número que você está procurando.

Você pode verificar o número de unidades de textura disponíveis para renderização de pipeline de função não fixa com glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);, no entanto, se você tiver acesso a algum hardware diverso, poderá verificar a si mesmo.

EDIT: este site permite comparar os recursos reportados do openGL de todos os tipos de placas de vídeo, que devem fornecer os números necessários: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PS: A AMD e a nvidia introduziram recentemente "texturas sem vinculação", (amd tem um nome diferente), que permite usar um grande número de texturas sem vinculá-las a unidades de texto, no momento, isso está disponível apenas no openGL.


fonte
1
Depois disso, a resposta real é algo como 'você tem o máximo que o hw pode oferecer'. Ou, de maneira diferente, tudo deve correr o mais rápido possível. (e no OpenGL, que cobre quase todos os campos).
precisa
@ Darkwings Suponho que sim, vincular mais texturas do que o hardware pode suportar geralmente leva a um erro ou o tempo limite do driver. Eu também interpretei errado, ele disse que o shader model 4+ não opengl 4+. Olhando para as primeiras placas DX10 (famílias de placas X2900 e 8800), todas parecem ter pelo menos 16 unidades de textura.
Eu estava apenas sublinhando o fato de que, como pode ser parametrizado, deve ser. Mesmo que o jogo rasteje em cartões mais antigos, não deve ser algo codificado, mas um "requisito sugerido".
precisa
4
-1: esta resposta está errada. Veja minha resposta para saber por que (é muito longo para explicar aqui).
Nicol Bolas
1
O que pode não ser imediatamente óbvio. Quase ninguém usa os GL_TEXTURE n GLenums; em vez disso, use GL_TEXTURE0 + n, em que n é o slot a ser vinculado. Os GLenums vão apenas até 32 slots, mas isso não significa que o OpenGL restrinja você a 32. As especificações garantem que serão sequenciais. Além disso, se você não estiver usando o DSA, convém reservar um slot para ligar / criar / modificar, para que o estado usado para criar / modificar tenha menos interação com o estado usado para desenhar.
Maximus Minimus