Podczas renderowania nieba ze stałą teksturą w grach 3D, ludzie często najpierw tworzą 6 tekstur na mapie kostki, a następnie renderują kostkę wokół aparatu. W GLSL można uzyskać dostęp do pikseli w teksturach za pomocą normalnej zamiast współrzędnej tekstury i można łatwo uzyskać to normalnie, normalizując położenie fragmentu względem kamery. Jednak ten proces można wykonać za pomocą dowolnego kształtu, który otacza kamerę, ponieważ gdy znormalizujesz każdą pozycję, zawsze będzie to skutkować kulą. Teraz się zastanawiam: Dlaczego to zawsze jest sześcian, a nie czworościan? Renderowanie sześcianu zajmuje 12 trójkątów, czworościan tylko 4. Jak już powiedziałem, każdy kształt otaczający aparat działa. Tak więc czworościany pobierają mniej VRAM i są szybsze do renderowania, bez żadnych wad? Dlaczego ich nie używać?Dlaczego ludzie nie używają czworościanów do skyboxów?
Odpowiedz
Nie trzeba trochę geometrii środowiska w ogóle. Wszystko, co musisz zrobić, to narysować pełny ekran quad i obliczyć dla niego poprawne współrzędne tekstury. Teraz z nowoczesnym GL, my nawet nie trzeba dostarczyć dane wierzchołków do tego, możemy użyć attributless rendering:
Vertex Shader:
#version 330 core
out vec3 dir;
uniform mat4 invPV;
void main()
{
vec2 pos = vec2((gl_VertexID & 2)>>1, 1 - (gl_VertexID & 1)) * 2.0 - 1.0;
vec4 front= invPV * vec4(pos, -1.0, 1.0);
vec4 back = invPV * vec4(pos, 1.0, 1.0);
dir=back.xyz/back.w - front.xyz/front.w;
gl_Position = vec4(pos,1.0,1.0);
}
gdzie invPV
jest inverse(Projection*View)
, więc to zajmie swoje orientacja aparatu oraz rzutowanie pod uwagę. Może to być w zasadzie jeszcze bardziej uproszczone, w zależności od tego, ile ograniczeń można umieścić na macierzy projekcji.
Fragment Shader:
#version 330 core
in vec3 dir;
out color;
uniform samplerCube uTexEnv;
void main()
{
color=texture(uTexEnv, dir);
}
Aby to wykorzystać, wystarczy związać pusty vào i swoją konsystencję, wrzuć swoje matrycę invPV
i zadzwonić glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)
.
Takie podejście może oczywiście być stosowany do sferycznego mapowania tekstur zamiast mapy kostki
jest to kwestia głębokości Wygląd i kształt
najlepszą Skybox kształt kuli (pół), ponieważ jego powierzchnia jest renderowane wystających do przestrzeni kamery niemal bez zakłóceń. Jeśli użyjesz innego kształtu, wtedy artefakty rzutowania pojawią się szczególnie na rogach, na przykład większość aplikacji/gier korzysta z kostki skybox. Spójrz na słońce o skończonym promieniu (nie tylko na pojedynczą kropkę) i obróć widok, aby Słońce docierało ze środka na bok. Wtedy zwykle słońce zostaje zniekształcony od kształtu kolistego/płyty do eliptycznej/owalny kształt:
jest to spowodowane zmianą odległości między skybox i kamery. Jeśli porównać go bezpośrednio świadczonych gwiazda:
następnie można zobaczyć różnicę. Pierwszy obraz to pierwsze istotne obraz znaleziony przez google (z jakiejś gry) drugi jest zrzut ekranu forma przestrzeni Inżynierów myślę, a ostatni jest renderowany przez kopalni astro aplikacji zobaczyć
Tak im więcej, tym bardziej od kształtu, tym więcej zniekształceń dostaniesz.
używanie 4-stronnej piramidy jest jeszcze gorsze niż sześcian, ponieważ kąty między bokami są gorsze, tworząc jeszcze większe artefakty. Kolejny problem polega na tym, że potrzebujesz większego rozmiaru piramidy, aby pokryć tę samą przestrzeń. Jeśli użyjesz Depth Buffer do pewnego celu podczas renderowania skybox, możesz znacząco wpłynąć na precyzję, zwiększając płaszczyznę Z_far.
Overhead
diference między 6 i 4 wielokątów nie jest dużo, ponieważ Skybox jest ogromny (pokrywa cały wgląd) prędkość jest określana głównie przez hrabiego pikseli/Texel złożony nie ekran liczba wierzchołków. Zatem piramida może być nawet wolniejsza niż kostka, ponieważ musi mieć większe powierzchnie (potrzebna jest więcej interpolacji).Ale jeśli chcesz użyć sferycznego skybox, potrzebujesz również sferycznej tekstury, ponieważ jeśli użyjesz standardowej tekstury kostki, zniekształcenie będzie nadal obecne, a te są trudniejsze do utrzymania, ... i dlatego kostki są bardziej używane .
sferyczne skyboxes
potrzebują innego rodzaju tekstury. Półkolista struktura wygląda następująco:
Jesteś tego pewien? Gdybym użył 6 standardowych tekstur i zamapował je na sześcian o normalnych współrzędnych tekstury, to tak, zostałby zniekształcony. Ale ponieważ normalizuję położenia wierzchołków w cieniowanym ciele, otrzymuję kulę, a jak już powiedziałeś, kula jest idealna dla nieba. Także interpolacja twarzy naprawdę nie powinna mieć znaczenia, ponieważ rozmiar modelu jest zupełnie nieistotny (jeśli bufor głębokości jest wyłączony) ... – Pikaju
@Pikaju Zgadzam się, ale żeby to działało potrzebujesz sferycznie odwzorowanej tekstury zamiast sześciennej jeden, albo gdybyś miał idealne sferyczne skybox z zniekształconą fakturą na nim, który ma podobne wyniki, jak sześcian skybox – Spektre
@Pikaju dodał obraz półkulistego przykładu tekstury do końca odpowiedzi – Spektre
- 1. Dlaczego ludzie używają ProjectData
- 2. HTML5: Dlaczego ludzie nie używają "ContentEditable" w swoich witrynach Wprowadzanie komentarzy?
- 3. Dlaczego niektórzy ludzie używają klasy bazowej List do tworzenia instancji nowej tablicy ArrayList?
- 4. Co ludzie używają zamiast IMultiValueConverters w Windows 8?
- 5. Dlaczego ludzie umieszczają {""} w swoim React/JSX?
- 6. Dlaczego Web Sockets nie używają SOAP?
- 7. Dlaczego ludzie nazywają alias jQuery $ "fabryką"?
- 8. Paski przewijania ukryte w Lion. Jak ludzie przewijają w poziomie, jeśli nie używają gładzika?
- 9. Dlaczego ludzie nie zalecają używania usługi Amazon RDS?
- 10. Dlaczego ludzie dodają własny folder do standardowej ścieżki dołączania?
- 11. Dlaczego ludzie tworzą virtualenv w kontenerze Docker?
- 12. Dlaczego obiekty .NET w PowerShell nie używają bieżącego katalogu?
- 13. Dlaczego Google i Twitter używają układu tabeli?
- 14. Dlaczego typy Rusta `Atomic *` używają niemodulujących funkcji do mutowania wartości?
- 15. Dlaczego pliki .sln nie używają formatu XML w .NET?
- 16. Dlaczego styl i układ nie używają przestrzeni nazw Android?
- 17. Dlaczego dokumenty AngularJS nie używają kropki w dyrektywie modelowej?
- 18. Dlaczego Puppet i Chef używają Ruby?
- 19. Dlaczego przykłady przesyłania plików używają nazwy "qqfile"?
- 20. Dlaczego ludzie wysyłają logi do Logstash za pomocą NXLog, a nie samego Logstash?
- 21. Włókna w języku C#: czy są szybsze niż iteratory i czy ludzie ich używają?
- 22. Dlaczego główne strony internetowe używają gzip?
- 23. Dlaczego ludzie grupują rspec w testach i rozwoju w Gemfile?
- 24. Dlaczego ludzie tworzą struktury katalogów, takie jak edu.mit.stk w Javie?
- 25. Liczba tablic, które nie używają odr?
- 26. Dlaczego biblioteki Java używają wartości stałych większych niż wyliczenia?
- 27. Dlaczego pandy toczące się używają pojedynczego wymiaru ndarray
- 28. Dlaczego dane sprężyn wciąż używają odwołań zerowych jako wartości zwracanych?
- 29. Dlaczego wyniki powłoki często używają "mixed_characters" w swoich wyjściach?
- 30. Dlaczego niektóre aplikacje internetowe używają strony pośredniej przed przekierowaniem?
Skyboxes są łatwe do wdrożenia i łatwy do określenia współrzędnych tekstur. Dlatego jest bardziej powszechny. –
Cóż, nie potrzebujesz współrzędnych tekstury. Domyślam się, że pozycja wierzchołka jest trochę trudna. – Pikaju