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.
Respuestas:
Si desea acelerar las cosas, puede usar algo llamado atlas de texturas.
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.
fuente
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.
fuente
¿Tus texturas tienen mipmaps?
Sin mipmapping, el muestreo de textura puede ser particularmente costoso (cargas de errores de caché)
fuente