¿Cuántas texturas generalmente puedo unir a la vez?

23

Estoy desarrollando un motor de juego, y solo funcionará en hardware moderno (modelo Shader 4+). Supongo que, para cuando termine, no será un requisito tan irracional.

Mi pregunta es: ¿cuántas texturas puedo unir a la vez en una tarjeta gráfica moderna? 16 serían suficientes. ¿Puedo esperar que la mayoría de las tarjetas gráficas modernas admitan esa cantidad de texturas?

Parece que mi GTX 460 admite 32, pero no tengo idea si es representativa de la mayoría de las tarjetas de video modernas.

Avi
fuente
¿Qué API de representación estás usando?
Adam
2
OpenGL, por supuesto :)
Avi

Respuestas:

53

El número de texturas que se pueden vincular a OpenGL no es 32 o 16 . No es con lo que obtienes glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);. Esa función recupera la cantidad de texturas a las que puede acceder el sombreador de fragmentos .

Mira, cada sombreador tiene su propio límite de la cantidad de texturas que puede usar . Sin embargo, también hay un número total de texturas que se pueden usar, punto. Esto se define (en OpenGL) por GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS.

Así que hay dos límites: las texturas por etapa y las texturas-total-unido.

OpenGL 3.x define el número mínimo para que el límite por etapa sea 16, por lo que el hardware no puede tener menos de 16 texturas por etapa. Puede tener un límite más alto, pero sabes que obtienes al menos 16. 3.x define el número mínimo para el límite total de texturas como 48. AKA: 16 * 3 etapas. Del mismo modo, GL 4.x define que los números son 16 texturas por etapa y 96 texturas con límite total (es decir: 16 * 6 etapas, incluidos los sombreadores de cálculo).

De nuevo, estos son los números mínimos . El hardware puede (y varía).

En cuanto a hardware específico, puede esperar que cualquier hardware de clase DX10 coincida con estos números. El hardware de clase DX11 tiene alguna variación; NVIDIA (GeForce 4xx +) y los chips AMD de gama alta (también conocidos como núcleos GCN) pueden tener más de 16 por etapa.

Nicol Bolas
fuente
2
Desearía que esta fuera la respuesta aceptada. Me hubiera ahorrado 5 minutos de lectura inútil.
Fibbles
3

Creo que 32 es el número máximo de texturas que se pueden vincular actualmente. Por lo que puedo decir, incluso la serie 8800 tenía 32 unidades de textura.

Hasta donde sé, para el soporte de openGL 4.x necesitará una tarjeta Fermi o una tarjeta nvidia más nueva (o la tarjeta amd correspondiente), los modelos de gama alta parecen tener 32 unidades, mientras que las tarjetas de gama más baja (GT 430, por ejemplo ) tienen 16. Sin embargo, mirando las hojas de especificaciones de AMD, enumeran números como 80 o 128 unidades de textura, pero enumeran 32 unidades ROP de color que parecen haber permanecido constantes a través de las generaciones.

La GTX 480, por otro lado, está listada con 60 unidades de textura y 48 unidades de ROP, mientras que las tarjetas de gama baja como la 430 solo tienen 16 unidades de textura y 4 inicios de ROP. Entonces, en general, no estoy realmente convencido de que ninguno de esos sea el número que realmente está buscando.

Sin glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);embargo, puede verificar el número de unidades de textura disponibles para la representación de canalizaciones de funciones no fijas , por lo que si tiene acceso a algún hardware diverso, puede verificarlo usted mismo.

EDITAR: este sitio le permite comparar las capacidades de OpenGL reportadas de todo tipo de tarjetas de video, que deberían darle los números que necesita: http://feedback.wildfiregames.com/report/opengl/device/GeForce%20GTX%20580

PD: AMD y nvidia han introducido recientemente "texturas sin enlace" (amd tiene un nombre diferente) que le permite usar grandes cantidades de texturas sin vincularlas a unidades de texturas, por el momento esto solo está disponible en openGL.


fuente
1
Después de eso, la respuesta real es algo así como "tienes todo lo que el hw puede ofrecer". O, redactado de manera diferente, todo debería funcionar tan rápido como sea posible. (y en OpenGL que cubre casi todos los campos).
Darkwings
@Darkwings Supongo que sí, unir más texturas de las que el hardware puede manejar generalmente conducirá a un error o al tiempo de espera del controlador. También leí mal, dijo que el shader model 4+ no opengl 4+. Mirando las primeras tarjetas DX10 (familias de tarjetas X2900 y 8800), todas parecen tener al menos 16 unidades de textura.
Solo subrayaba el hecho de que, dado que puede parametrizarse, debería serlo. Incluso si el juego se arrastrara en cartas antiguas, no debería ser algo codificado sino un "requisito sugerido".
Darkwings
44
-1: Esta respuesta es incorrecta. Vea mi respuesta de por qué (es demasiado largo para explicarlo aquí).
Nicol Bolas
1
Lo que puede no ser inmediatamente obvio. Casi nadie usa GL_TEXTURE n GLenums; en su lugar use GL_TEXTURE0 + n, donde n es la ranura para enlazar. Los GLenums solo suben hasta 32 ranuras, pero eso no significa que OpenGL lo restringe a 32. La especificación garantiza que serán secuenciales. Además, si no está utilizando DSA, es posible que desee reservar un espacio para vincular para crear / modificar, de modo que el estado utilizado para crear / modificar tenga menos interacción con el estado utilizado para dibujar.
Maximus Minimus