Jakie jest prawidłowe rozszerzenie pliku dla shaderów GLSL? [Zamknięte]


129

Uczę się cieniowania GLSL i natknąłem się na różne formaty plików. Widziałem ludzi, którzy nadawali swoje shadery .verti .fragrozszerzenia wierzchołków i fragmentów . Ale widziałem też .vshi .fshrozszerzenia, a nawet oba shadery razem w jednym .glslpliku. Zastanawiam się więc, czy istnieje standardowy format pliku, czy też w jaki sposób jest „prawidłowy”?


10
O ile wiem, nie mają "poprawnych" rozszerzeń, ponieważ OpenGL i tak nie odczyta ich z dysku.
zneak

2
Niektórzy nazywają je .vs i .fs (i .gs), aby wyraźnie określić, co jest w środku. Ale jak powiedział zneak, to naprawdę nie ma znaczenia, nie ma „poprawnej” rzeczy.
Damon

11
GEdit używa .glslvi .glslfprzy wyborze podświetlania składni. To jedyne miejsce, które widziałem, gdzie ma to znaczenie.
Piotr Praszmo

Odpowiedzi:


90

Nie ma standardowego rozszerzenia pliku dla shaderów GLSL. Najczęstsze to prawdopodobnie .verti .frag, ponieważ są to rozszerzenia, które 3D Labs użyło w niektórych swoich narzędziach. Ale to wszystko w przypadku dowolnej formy standardowego rozszerzenia.


21
Nie sądzę, by .vert | .frag były dobrymi nazwami rozszerzeń dla shaderów. Rozszerzenie to coś, co identyfikuje ogólną klasę pliku. Prawdopodobnie powinni byli nazwać je vertex.glsl i fragment.glsl.
Autodidact

5
Byłem również zaskoczony, ale czy nie ma niewielkiej różnicy w składni między modułami cieniującymi wierzchołki i fragmentami, @SandeepDatta? W ten sam sposób, że .h i .c mogą mieć wiele wspólnego, ale są używane na różne sposoby.
Joseph Humfrey

7
@SandeepDatta .hppvs. .cpp? .hvs. .c? Istnieje więcej różnic składniowych i semantycznych między Vertex Shaderami i Fragment Shaderami niż między plikami nagłówkowymi C / C ++ a plikami źródłowymi.
Przebieg mil

1
@MilesRout Nawet nie mówić o .cc

43
GLSLang, znany również jako GLSL Reference Parser lub Reference Compiler , jest jednym z narzędzi opracowanych przez 3Dlabs . Jest wymieniony jako narzędzie SDK zarówno na opengl.org, jak i khronos.org. W README zawiera listę rozszerzeń plików spodziewa plików cieniujących: .vert(Vertex), .frag(fragment), .tesc(kontrola teselacji) .tese(ocena teselacji), .geom(geometria), .comp(obliczeniowe).
TachyonVortex,

96

W specyfikacji nie ma oficjalnego rozszerzenia. OpenGL nie obsługuje ładowania shaderów z plików; po prostu przekazujesz kod modułu cieniującego jako ciąg, więc nie ma określonego formatu pliku.

Jednak glslang , referencyjny kompilator / walidator GLSL firmy Khronos, używa następujących rozszerzeń do określenia typu modułu cieniującego, dla którego jest przeznaczony plik:

  • .vert - Vertex Shader
  • .tesc - moduł cieniujący kontroli mozaikowania
  • .tese - moduł cieniujący oceny mozaikowania
  • .geom - Geometry Shader
  • .frag - Fragment Shader
  • .comp - moduł obliczeniowy

18

Identyfikowanie typu pliku według rozszerzenia jest czynnością charakterystyczną dla systemu Windows. Wszystkie inne systemy operacyjne stosują różne podejścia: MacOS X przechowuje typ pliku w specjalnej strukturze metadanych we wpisach systemu plików. Większość * nixów identyfikuje pliki, testując ich strukturę wewnętrzną w bazie danych znanych „magicznych bajtów”; jednak edytory tekstu używają rozszerzenia.

W każdym razie źródła GLSL są takie same, jak każdy inny plik źródłowy programu: zwykły tekst i taki jest ich typ pliku.

Rozszerzenie, które możesz wybrać, jak chcesz. Używam następującego nazewnictwa:

  • ts.glsl
  • gs.glsl
  • w porównaniu z GLSL
  • fs.glsl

ale to mój wybór i technicznie rzecz biorąc, moje programy nawet nie wymuszają żadnego schematu nazewnictwa ani rozszerzeń. Nazewnictwo jest dla ludzi, aby mogli czytać i wiedzieć, co w nim jest; posiadanie wspólnego głównego rozszerzenia wymaga ode mnie stosowania reguły podświetlania składni tylko dla jednego zestawu rozszerzeń plików.


5
Obniżony, ponieważ OS X od lat używa głównie rozszerzenia pliku.
Frederik Slijkerman

6
@FrederikSlijkerman: Nie, tak nie jest. MacOS X jest w swej istocie Uniksem, a rozszerzenia plików nigdy nie były tam używane do identyfikacji rzeczy. Tak, standardowe typy mają standardowe rozszerzenia plików, ale to tylko kwestia czytelności dla człowieka. Może Finder może polegać na rozszerzeniach plików jako heurystyce dla niektórych typów. Ale jeśli może zidentyfikować plik wyłącznie na podstawie jego nagłówka lub kilku magicznych bajtów, użyje tego. Jak każdy system oparty na Uniksie.
datenwolf

3
+1 Nazywam je jako nazwa-efektu -fs.glsl lub nazwa-efektu -vs.glsl.
legends2k

9
Zdaję sobie sprawę, że spóźniłem się dwa lata na argument OS X, ale czułem, że powinienem dorzucić swoje dwa centy. Wszystko powyżej warstwy UNIX używa LaunchServices do określenia skojarzeń plików. Każdy plik ma identyfikator typu com.stackoverflow.file, taki jak , który jest przechowywany jako metadane. LaunchServices najpierw próbuje odgadnąć go na podstawie typu MIME, jeśli istnieje wpis metadanych. Jeśli nie, będzie szukał rozszerzenia. Jeśli nie może go dopasować, będzie szukał kodu twórcy HFS. Jeśli nie ma, poddaje się. LaunchServices nigdy nie próbuje zidentyfikować pliku na podstawie jego nagłówka lub magicznych bajtów.
zneak

2
Oznacza to, że najczęstszym sposobem określenia typu pliku w systemie OS X jest jego rozszerzenie. Służy to jednak tylko do określenia, której aplikacji należy użyć do otwarcia danego pliku. Gdy aplikacja otworzy plik, może sama zdecydować, co chce z nim zrobić, niezależnie od tego, czy rozszerzenie jest poprawne dla typu zawartości.
zneak

7

Jak wspominali inni, nie ma właściwej odpowiedzi w ścisłym tego słowa znaczeniu. Należy wspomnieć, że Sublime (potwierdzone dla wersji 2 i 3) oczekuje również .vert i .frag do podświetlania składni i walidacji.


2
Uważam, że jest to prawdą tylko wtedy, gdy masz zainstalowaną bibliotekę GLSL w Sublime, np. Github.com/WebGLTools/GL-Shader-Validator - mój domyślny Sublime nie rozpoznaje rozszerzeń.
Air

Biblioteka, którą połączyłeś, jest zdecydowanie najpopularniejszą (i prawdopodobnie jedyną?) Biblioteką GLSL dla wzniosłych, a to, czego oczekuje, nazwałem tym, czego oczekuje wzniosłe. Jeśli nazwiesz to przesadą, przyznam się do winy. Ale tak, masz rację przynajmniej w takim stopniu, w jakim subtelny edytor tekstu otworzy każdy dokument tekstowy, ignorując rozszerzenia, o których nie wie.
Weavermount

1
Na dzień dzisiejszy wysublimowanej-GLSL ( github.com/euler0/sublime-glsl ) jest najbardziej popularny plugin GLSL i przyjmuje następujący zestaw rozszerzeń: vs, fs, gs, vsh, fsh, gsh, vshader, fshader, gshader, vert, frag, geom, tesc, tese, comp, glsl. Jest więc wiele do wyboru :)
F Lekschas

0

Istnieją dwa sposoby pisania shaderów.

Możesz przechowywać Vertex Shader i Fragment Shader w char *zmiennej i kompilować, łączyć i dołączać moduł cieniujący do programu.

Innym sposobem jest zapisanie oddzielnego pliku Vertex Shader i Fragment Shadera z dowolnym rozszerzeniem i odczytanie go w celu skompilowania, połączenia i dołączenia modułu cieniującego do programu.

Zatem konwencja nazewnictwa, taka jak .vert / .frag, .vsdr / .fsdr itp., Są ważne, o ile wiesz, jak je czytać ...


-3

Jak już zostało omówione w wielu odpowiedziach, tak naprawdę nie ma standardu; to od Ciebie zależy, czy zastosujesz podejście, które jest dla Ciebie najbardziej pomocne.

Widzę korzyści płynące z używania rozszerzeń shaderów specyficznych dla typu, ale wolę używać rozszerzenia .glsl dla wszystkich typów shaderów, ponieważ wystarczy zdefiniować, w jaki sposób powłoka używa pliku tylko raz.

Podobnie jest to również dobra opcja, jeśli edytujesz pliki shaderów w Notepad ++, ponieważ możesz skonfigurować je tak, aby automatycznie stosować podświetlanie składni specyficzne dla języka do wszystkich plików shaderów, określając tylko jedno rozszerzenie pliku.

Wadą tego podejścia jest to, że musisz użyć własnej konwencji nazewnictwa, aby określić typ modułu cieniującego na podstawie jego nazwy pliku, ale dla mnie korzyści przewyższają koszty.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.