Symulator/MaSzyna/Odwracanie tekstur
Po wprowadzeniu do MaSzyny tekstur DDS w 2009 roku okazało się, że podczas konwersji z BMP czy TGA na DDS należy odbić teksturę w pionie. Drugi problem z odbiciem pionowym objawił się na początku roku 2015 przy okazji tablic kierunkowych dla taboru: tekstury TGA wyświetlały się prawidłowo, a zrobione standardowo DDS (odwrócone) wyświetlały się błędnie.
Spis treści
Różnice między DirectX a OpenGL
System Windows dorobił się dwóch środowisk graficznych, różniących się szczegółami. DirectX jest związany bezpośrednio z Windows i tylko na tym systemie działa (w tym na konsolach Xbox), natomiast OpenGL jest standardem obecnym na wielu platformach.
Tekstury DDS pochodzą z DirectX, który ma punkt zerowy mapowania OUV w lewym górnym rogu tekstury. Natomiast OpenGL ma punkt zerowy w lewym dolnym rogu. Oznacza to, że aby model wyświetlał się prawidłowo w obu systemach graficznych, trzeba albo zmieniać znak współrzędnej V mapowania albo odbijać tekstury w pionie.
Różne formaty tekstur
Dla formatu zapisu grafiki 2D (tekstur) nie ma czegoś takiego jak punkt zerowy — może on być przyjęty w dowolnym rogu. Istnieje natomiast kryterium określające, od którego rogu dane są umieszczane w pliku. Poszczególne formaty mogą mieć tę organizację na stałe albo w formie konfigurowalnej.
Chociaż MaSzyna nie wczytuje wszystkich formatów, większość formatów plików graficznych zaczyna się od lewego górnego rogu. Na tym tle odstają formaty BMP oraz TGA w domyślnej konfiguracji, jednak obydwa umożliwiają odwrotne ułożenie danych (najpierw góra).
Pliki BMP
Dane w pliku BMP zaczynają się od lewego dolnego rogu. Źródła podają, że jeśli podana w nagłówku wysokość będzie ujemna, wtedy plik zaczyna się od lewego górnego rogu obrazka. Domyślać się można, że większość narzędzi edycyjnych zapisuje dodatnią wysokość (np. XnView 2.25 nie ma opcji konfiguracyjnej, pozwalającej zapisać obrazek odwrotnie).
Format BMP był ongiś bazowym formatem dla MaSzyny, jeśli tekstura nie musiała mieć przezroczystości.
Pliki TEX
Format opracowany na potrzeby MaSzyny, głównie chyba dla obrazków z przezroczystością, pliki wycofane z użycia przy okazji PC2009 z uwagi na trudności w korygowaniu tekstur. Początek, analogicznie do domyślnego dla BMP, znajdował się w lewym dolnym rogu.
Pliki TGA
Trzeci format zastosowany w MaSzynie, obecnie głównie z przeznaczeniem dla twórców (tekstury TGA wczytują się dłużej i potrzebują więcej pamięci w karcie graficznej). W domyślnym układzie na początku pliku jest lewy dolny róg obrazka. Jednak możliwe jest przeniesienie początku do innego rogu, co jest oznaczane w 18. bajcie nagłówka. Dla początku w lewym dolnym rogu 18. bajt nagłówka ma wartość 0x00, natomiast dla początku w lewym górnym rogu — 0x20 (pozostałe 2 rogi są poza zainteresowaniem). XnView 2.25 pozwala wybrać, w którym z lewych rogów będzie początek.
Pliki DDS
Wedle dostępnych danych początek jest w lewym górnym rogu i nie ma opcji konfiguracji.
Pliki JPG
Obecnie nie obsługiwany, początek w lewym górnym rogu.
Pliki PNG
Obecnie nie obsługiwany, początek w lewym górnym rogu.
Pliki GIF
Obecnie nie obsługiwany, początek w lewym górnym rogu.
Problem z odwróconymi TGA
Tablice kierunkowe
Pierwotnie problem objawił się przy tworzeniu tekstury DDS tablicy kierunkowej dla EN57-2000 podczas przygotowania paczki całościowej MaSzyna 15.04. W związku z wykreowanym wówczas chaosem problem nie został wtedy dogłębnie zbadany. Istniała tylko jedna tablica kierunkowa dla scenerii Quark, więc jedynie plik DDS został odbity w pionie na zasadzie wyjątku o nieokreślonej przyczynie.
Ów plik TGA tablicy kierunkowej został zapisany w grudniu 2014 z flagą odwrócenia w pionie (czyli jako górna najpierw). Być może ustawienie tej flagi pochodziło z generatora użytego do stworzenia pierwszej tekstury, być może przyczynił się program XnView. Jednak efektem tej zmiany było nieprawidłowe ustawienie mapowania dla EN57, a następnie powielenie flagi odwrócenia w teksturach dla kolejnych kierunków. Odwrócenie plików TGA nie było widoczne na podglądzie (nawet podgląd tekstur w Rainsted prawidłowo wykrywał odwrócenie), jednak uruchomienie symulatora pokazywało, że inaczej się wyświetlają tekstury TGA, a inaczej standardowo (z odwróceniem) utworzone z nich DDS. Na tym etapie można było jeszcze wycofać flagi odwrócenia z tekstury TGA oraz odwrócić mapowanie V (w osi pionowej) w modelu.
Problem powrócił w grudniu 2016 przy okazji przygotowania tekstur tablic kierunkowych dla scenerii "Kaliska". Okazało się, że dopiero zapisanie tekstur z XnView powoduje ich nieodwrócone wyświetlanie w symulacji. Po głębszym rozpoznaniu sytuacji wykryta została flaga odwrócenia w nagłówku (która powodowała, że plik z zapisaną górą najpierw wyświetlał się normalnie w większości użytych narzędzi, podczas gdy symulacja nie brała pod uwagę tej flagi).
Oznakowanie poziome na drogach
Drugim miejscem ujawnienia się odwróconych tekstur TGA były znaki poziome na jezdniach. Podczas prac nad linią 61 na początku 2015 roku przygotowane zostały tekstury z napisem STOP na jezdni. Napis znajdował się u góry tekstury (TGA, z niezauważoną flagą odwrócenia). Przyjęte zostało, że napis będzie się znajdował od strony punktu 1 drogi, czyli punkt 2 będzie bliżej jej dolnej krawędzi (odcinek drogi musi być krótszy niż długość mapowania tekstury — domyślnie 6m — aby napis nie pojawił się ponownie). Mapowanie odcinków dróg zostało odpowiednio przerobione w EU07.EXE. Wcześniej tekstura z oznakowaniem poziomym mapowała się na lewo, więc napis STOP musiałby być dodatkowo odbity w poziomie — wobec dotychczasowego braku oznaczeń poziomych na drogach i względnej obojętności tekstur nawierzchni względem symetrii, zmiana mapowania nie pociągała poważniejszych konsekwencji, wymagających dostosowania innych tekstur w paczce.
Dopiero stworzenie standardowo odbitych tekstur DDS do pacza MaSzyna 16.08 spowodowało, że w przerabianej Linii 61 oznakowanie poziome zaczęło się błędnie wyświetlać.
Proponowane rozwiązanie
1. Wobec tego, że większość formatów graficznych zapisuje górę najpierw, a pliki TGA (i ewentualnie BMP) mają opcję ustawienia początku u góry, proponowane jest dalsze ignorowanie flagi odwrócenia przy wczytywaniu plików TGA w symulatorze.
2. Narzędzia do automatycznej konwersji TGA na DDS powinny być rozbudowane o uwzględnianie flagi odwrócenia (wartość 0x20 w 18. bajcie nagłówka) z nagłówka TGA i w takim przypadku plik DDS nie powinien być odbijany w pionie.
3. W przypadku plików DDS tworzonych ręcznie z TGA, koniecznością będzie weryfikacja wizualna, czy wyświetlanie z DDS nie zostało odwrócone.
4. Do Rainsted powinna być dodana opcja wyszukiwania i listowania do pliku tekstowego nazw plików TGA, które mają ustawioną flagę odwrócenia (czyli które odbiegają od dotychczas standardowej konfiguracji tekstury TGA). Ewentualnie, w przypadku przechodzenia na odbite mapowanie w modelach, potrzebna będzie też lista plików pozostających w poprzedniej konfiguracji. Lista takich plików powinna między innymi pomóc w sprawdzeniu prawidłowości mapowania obiektów z wymienionymi na niej teksturami.
5. Programy narzędziowe do edycji modeli (3DS Max, Blender) powinny być sprawdzone pod kątem zastosowania odbitych tekstur TGA (i ewentualnie nieodbitych DDS). Być może odbijanie TGA pozwoli używać zamiennie tekstur DDS podczas edycji.
6. W przypadku rozbudowy MaSzyny o wczytywanie formatów PNG, JPG, GIF należy sprawdzić, czy nie jest wygodniej używać odbitych TGA (z początkiem u góry) w celu uzyskania zgodności z innymi formatami.