2013-05-19 8 views

Odpowiedz

9

WebGL musi egzekwować zachowanie OpenGL ES 2.0 i uniemożliwiać aplikacjom WebGL dostęp do danych, do których nie mają dostępu. Aby to zrobić, implementacje WebGL muszą sprawdzać wiele rzeczy, w tym, że wszystkie tekstury, z których będą czytane, są czytelne zgodnie ze specyfikacją OpenGL ES 2.0 bez rozszerzeń.

Tak więc przy każdym losowaniu muszą sprawdzić, czy wszystkie tekstury spełniają wszystkie wymagane kryteria, w tym sprawdzenie, czy każda tekstura ma "teksturę kompletną", jeśli jest to mapa cubmapowa, że ​​jest to "kostka kompletna" i "mipmap". kompletny sześcian ", jeśli nie ma mocy 2 wymiarów, filtrowanie tekstur jest ustawione poprawnie, itd ... Jeśli którykolwiek z tych warunków nie jest spełniony, implementacja WebGL zastąpi przezroczystą czarną teksturę, dzięki czemu zachowanie będzie zgodne ze specyfikacją i spójne dla różnych urządzeń.

Te kontrole są drogie, więc skrótem, który może zająć implementacja WebGL, jest śledzenie, czy jakiekolwiek tekstury są niemożliwe do odczytania. Jeśli nie można podać tekstur, nie jest wymagane sprawdzanie w czasie losowania. Powyższe ostrzeżenie jest takie, że niektóre tekstury są nie do zniesienia, co zasadniczo oznacza, że ​​WebGL musi wykonać wszystkie te kosztowne kontrole. Jeśli upewnisz się, że wszystkie tekstury są renderowalne, WebGL może pominąć tę kontrolę, a Twoja aplikacja może działać szybciej.

Definicje „tekstury całkowitego”, „kostka kompletna”, etc ... zobacz OpenGL ES 2.0 spec section 3.7.10

+6

Jeśli używasz Three.js, może to być spowodowane niewłaściwym wykorzystaniem THREE.ImageUtils.loadTexture. Powinieneś poczekać na wywołanie zwrotne loadTexture, zanim dodasz siatkę z tą teksturą do sceny. – dIsoVi

+0

@dIsoVi Bravo! Wszystkie przykłady, które do tej pory widziałem, nie używają wywołania zwrotnego, więc nawet nie wiedziałem, że jest on asynchroniczny. Dzięki! – krb686

+0

Nie znam szczegółów Three.JS, ale zazwyczaj zamiast czekać na załadowanie tekstury przed dodaniem siatki do sceny tworzę teksturę 1x1 pikseli i wczytam obraz do tej tekstury. W ten sposób mogę narysować siatkę natychmiast, ponieważ tekstura piksela 1x1 spełnia wszystkie wymagania dotyczące renderowania. Po załadowaniu obrazu zaktualizuję teksturę danymi obrazu, a następnie ustawię filtrowanie i/lub generowanie mipów. W ten sposób mogę rozpocząć renderowanie natychmiast. To rozwiązanie zależy od tego, czy to rozwiązanie pasuje do Twojej aplikacji. – gman