2015-05-03 19 views
5

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?

+1

Skyboxes są łatwe do wdrożenia i łatwy do określenia współrzędnych tekstur. Dlatego jest bardziej powszechny. –

+0

Cóż, nie potrzebujesz współrzędnych tekstury. Domyślam się, że pozycja wierzchołka jest trochę trudna. – Pikaju

Odpowiedz

4

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

5
  1. 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:

    cube distortion example enter image description here

    jest to spowodowane zmianą odległości między skybox i kamery. Jeśli porównać go bezpośrednio świadczonych gwiazda:

    rendered sky (no skybox)

    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.

  2. 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 .

  3. sferyczne skyboxes

    potrzebują innego rodzaju tekstury. Półkolista struktura wygląda następująco:

    hemisphericall texture

+1

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

+0

@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

+0

@Pikaju dodał obraz półkulistego przykładu tekstury do końca odpowiedzi – Spektre

Powiązane problemy