Muestreo directo de texturas 3D muy lento

9

Así que estoy escribiendo un pequeño juego con Direct3D 9 y estoy usando texturas múltiples para el terreno. Todo lo que estoy haciendo es muestrear 3 texturas y un mapa de mezcla y obtener el color general de las tres texturas basadas en los canales de color del mapa de mezcla. De todos modos, obtengo una caída masiva de la velocidad de fotogramas cuando pruebo más de 1 textura, voy de 120+ fps a poco menos de 50.

Este es el código HLSL responsable de la desaceleración:

float3 ground = tex2D(GroundTex, multiTex).rgb;
float3 stone  = tex2D(StoneTex, multiTex).rgb;
float3 grass  = tex2D(GrassTex, multiTex).rgb;
float3 blend  = tex2D(BlendMapTex, blendMap).rgb;

¿Lo estoy haciendo mal? Si alguien tiene información o consejos sobre el muestreo de texturas o algo así, sería bueno.

Gracias.

dotminic
fuente
¿Qué hardware tienes? Cuatro muestras de textura no deberían ser un problema en ningún hardware nuevo.
Axel Gneiting
Tengo una Radeon X1950, sí, tiene un par de años, si no más. Supongo que quizás no sea el mejor hardware. Qué piensas ?
dotminic 27/10/10

Respuestas:

9

Si desea acelerar las cosas, puede usar algo llamado atlas de texturas.

Wikipedia : un atlas de texturas es una imagen grande o "atlas" que contiene muchas subimágenes más pequeñas, cada una de las cuales es una textura para alguna parte de un objeto 3D. Las sub texturas se pueden representar modificando las coordenadas de textura del mapa uv del objeto en el atlas, esencialmente diciéndole en qué parte de la imagen se encuentra su textura. En una aplicación donde se usan con frecuencia muchas texturas pequeñas, a menudo es más eficiente almacene las texturas en un atlas de texturas que el hardware de gráficos trata como una unidad.

Es más eficiente que una GPU muestree una sola textura grande 4 veces frente a 4 imágenes muestreadas una vez cada una. Aquí hay un ejemplo de un atlas de texturas de terreno.

texto alternativo

zfedoran
fuente
1
Gracias por el consejo, he implementado mi sombreador usando un atlas de texturas, "solo" estoy obteniendo 109 fps ahora, pero es una mejora clara de los 55 fps que estaba obteniendo. ¡Gracias!
dotminic
1
+1 para una buena respuesta. ¿Puedo preguntar de dónde sacaste esa imagen de atlas de textura? ¿Es propietario o gratuito para cualquier uso?
Cameron
4

Otra cosa a considerar es el formato de textura. ¿Es una textura cruda de 32bpp? Si es así, considere usar una textura DXT1 comprimida, que es de 4 bits / píxel (ocupando 1/8 del espacio), o DXT5 si necesita el canal alfa, a 8 bits / píxel.

La reducción del tamaño de los datos de textura debería reducir los requisitos de ancho de banda de memoria de textura y mejorar el rendimiento de la memoria caché de textura.

Además, verifique que no haya configurado un filtro anisotrópico de máxima calidad, que puede agregar un poco de costo.

bluescrn
fuente
Gracias por el consejo, lo intentaré la próxima vez.
dotminic
3

¿Tus texturas tienen mipmaps?

Sin mipmapping, el muestreo de textura puede ser particularmente costoso (cargas de errores de caché)

bluescrn
fuente
Sí, las texturas tienen mapas MIP, las exporté como * .dds desde la herramienta de textura DirectX. Pero, ¿cómo usan las texturas en los juegos comerciales donde hay muchas texturas de alta definición por todo el lugar? Solo estoy probando 1 atlas de textura y obtengo una velocidad de cuadro de 109 fps mientras renderizo un terreno, todo en la gpu.
dotminic 27/10/10