Unity 5.4 (derzeit in der Beta) wird eine mit Spannung erwartete Funktion (seit 2013) enthalten, nämlich Array-Texturen - genauso vergeblich wie OpenGLs ArrayTexture . Nachdem ich etwas über Arrays-Texturen und Textur-Atlanten gelesen habe, kann ich die technischen Unterschiede bei der Verwendung durch CPUs und GPUs immer noch nicht ganz verstehen.
Um genauer zu sein, möchte ich um eine Erklärung zu den Hauptunterschieden bitten, wie Texturatlas und Texturarrays von CPU und GPU behandelt werden und vor allem, wie sich solche Unterschiede auf die Leistung und die Speicherbehandlung auswirken können (z wie Textur-Arrays leistungsfähiger sein können als Textur-Atlanten usw.).
Wenn technische Details zur Implementierung von Unity aufgrund der unglücklichen geschlossenen Ressourcen fehlen, würde ich mich über eine Antwort bezüglich OpenGL.s ArrayTexture freuen.
quelle
Antworten:
Wie in den obigen Kommentaren erwähnt, hängt die Leistung von der Implementierung, Ihrer speziellen Hardware und dem, was Sie mit den Texturen versuchen, ab. Die einzig verlässliche Antwort besteht darin, jede Alternative zu profilieren.
Es gibt jedoch einige Unterschiede in Bezug auf die Verwendung der einzelnen Optionen, die konsistent gelten:
Ein großer Unterschied besteht darin, dass bei Array-Texturen jede Textur separat behandelt wird, um beispielsweise Texturkoordinaten zu verpacken oder Mipmapping durchzuführen.
Dies vermeidet häufige Probleme mit Texturatlanten, bei denen zwischen benachbarten Texturmustern eine Polsterung hinzugefügt werden muss, um zu verhindern, dass Proben an ihren Rändern zusammenbluten, insbesondere in tieferen Mip-Levels.
Dies bedeutet auch, dass Sie, wenn Sie möchten, dass Ihre Texturen gekachelt werden, die Textur-Sampling-Hardware verwenden können, um dies genau wie bei einer Vanille-Textur zu tun. Bei Atlanten müssen wir normalerweise die Kachelberechnung in unserem Fragment-Shader durchführen, da der Sampler nur Texturkoordinaten über den gesamten Atlas umwickelt / spiegelt / klemmt / umrandet, nicht einzelne Kacheln darin.
Die Haupteinschränkung bei Array-Texturen besteht darin, dass alle ihre Texturen die gleiche Auflösung und Anzahl von Mip-Levels haben müssen. Wenn Sie versuchen, Texturen mit sehr unterschiedlichen Auflösungsanforderungen zu stapeln (z. B. Speichern von Geländekacheln, deren LoD mit der Entfernung in einer virtuellen Textur abnimmt ), möchten Sie möglicherweise stattdessen die Flexibilität eines Atlas.
quelle
GL_MAX_ARRAY_TEXTURE_LAYERS
. Auf meiner semi-modernen GPU ist dies 2048. Wenn Sie also Tonnen winziger Texturen möchten, ist diese Grenze möglicherweise zu niedrig.