Qual é a extensão de arquivo correta para os shaders GLSL? [fechadas]

127

Estou aprendendo o glsl shading e me deparei com diferentes formatos de arquivo. Vi pessoas dando seus shaders .verte .fragextensões de vértice e fragmento . Mas também tenho visto .vshe .fshextensões, e até mesmo ambos os shaders juntos em um único .glslarquivo. Então, eu estou querendo saber se existe um formato de arquivo padrão, ou qual o caminho 'correto'?

Samssonart
fonte
10
Até onde eu sei, eles não têm extensões "corretas", pois o OpenGL não as lê do disco.
zneak
2
Algumas pessoas os chamam de .vs e .fs (e .gs) para explicitar o que está dentro. Mas, como o zneak disse, isso realmente não importa, não há nada "correto".
Damon
11
O GEdit usa .glslve .glslfao escolher o realce da sintaxe. Esse é o único lugar que eu vi onde importa.
Piotr Praszmo

Respostas:

90

Não há extensão de arquivo padrão para shaders GLSL. Os mais comuns são provavelmente .verte .frag, como essas são as extensões que o 3D Labs usou em algumas de suas ferramentas. Mas é isso para qualquer forma de extensão padrão.

Nicol Bolas
fonte
20
Eu não acho que .vert | .frag são bons nomes de extensão para shaders. A extensão é algo que identifica a classe geral de um arquivo. Eles provavelmente deveriam tê-los chamado de vertex.glsl e fragment.glsl.
Autodidata
5
Também fiquei surpreso, mas não há uma pequena diferença na sintaxe entre os vértices e os shaders de fragmentos, @SandeepDatta? Da mesma forma que. He. C podem compartilhar muito em comum, mas são usados ​​de maneiras diferentes.
Joseph Humfrey
7
@SandeepDatta .hppvs. .cpp? .hvs. .c? Existem mais diferenças de sintaxe e semântica entre os sombreadores de vértices e fragmentos do que entre os arquivos de cabeçalho e de origem do C / C ++.
Miles Rout
1
@MilesRout Nem mesmo para falar sobre .cc
42
O GLSLang, também conhecido como Analisador de Referência GLSL ou Compilador de Referência , é uma das ferramentas desenvolvidas pelo 3Dlabs . Ele está listado como uma ferramenta SDK no opengl.org e no khronos.org. O README lista as extensões que espera para arquivos shader: .vert(vértice), .frag(fragmento), .tesc(controle de mosaico), .tese(avaliação de mosaico), .geom(geometria) e .comp(computação).
TachyonVortex
93

Não há extensão oficial nas especificações. O OpenGL não suporta carregar shaders de arquivos; basta passar o código do sombreador como uma string, para que não haja um formato de arquivo específico.

No entanto, glslang , o compilador / validador de referência GLSL da Khronos, usa as seguintes extensões para determinar que tipo de sombreador serve para o arquivo:

  • .vert - um vertex shader
  • .tesc - um shader de controle de mosaico
  • .tese - um shader de avaliação de mosaico
  • .geom - um sombreador de geometria
  • .frag - um shader de fragmento
  • .comp - um sombreador de computação
Coronel Trinta e Dois
fonte
18

Identificar o tipo de arquivo por extensão é algo específico do Windows. Todos os outros sistemas operacionais usam abordagens diferentes: o MacOS X armazena o tipo de arquivo em uma estrutura de metadados especial nas entradas do sistema de arquivos. A maioria dos * nixes identifica arquivos testando sua estrutura interna em um banco de dados de "bytes mágicos" conhecidos; no entanto, os editores de texto usam a extensão.

De qualquer forma, as fontes GLSL são como qualquer outro arquivo de origem do programa: texto simples, e esse é o tipo de arquivo.

A extensão que você pode escolher como desejar. Eu uso a seguinte nomeação:

  • ts.glsl
  • gs.glsl
  • vs.glsl
  • fs.glsl

mas essa é minha escolha e tecnicamente meus programas nem impõem nenhum esquema de nomenclatura ou extensão. O nome é para os humanos lerem e saberem o que há nele; ter uma extensão principal comum exige que eu tenha uma regra de destaque de sintaxe para apenas um conjunto de extensões de arquivo.

datenwolf
fonte
5
Diminuiu a votação porque o OS X usa principalmente a extensão de arquivo há anos.
Frederik Slijkerman
6
@FrederikSlijkerman: Não, não. O MacOS X é um Unix em sua essência e as extensões de arquivo nunca foram usadas lá para identificar coisas. Sim, os tipos padrão obtêm extensões de arquivo padrão, mas isso é apenas uma questão de legibilidade humana. Talvez o Finder possa confiar em extensões de arquivo como heurística para alguns tipos. Mas se ele puder identificar um arquivo apenas pelo cabeçalho ou por alguns bytes mágicos, ele o usará. Como qualquer sistema baseado em Unix.
datenwolf
3
+1 Eu os nomeio como nome-efeito- fs.glsl ou nome-efeito -vs.glsl.
Legends2k
9
Percebo que estou dois anos atrasada para o argumento do OS X, mas senti que deveria dedicar meus dois centavos. Tudo acima da camada UNIX usa LaunchServices para determinar associações de arquivos. Cada arquivo possui um identificador de tipo com.stackoverflow.file, que é armazenado como metadados. O LaunchServices tenta adivinhar do tipo MIME primeiro, se a entrada de metadados existir. Caso contrário, ele procurará a extensão. Se não conseguir, ele procurará um código de criador de HFS. Se não houver, desiste. O LaunchServices nunca tenta identificar um arquivo pelo cabeçalho ou bytes mágicos.
zneak
2
Isso significa que a maneira mais comum de determinar o tipo de arquivo no OS X é sua extensão. Isso é apenas para o objetivo de identificar qual aplicativo deve ser usado para abrir qual arquivo. Depois que o aplicativo abre o arquivo, ele pode decidir por si mesmo o que deseja fazer com ele, independentemente de a extensão estar correta para o tipo de conteúdo.
zneak
7

Como outros já mencionaram, não existe uma resposta correta no sentido mais estrito. É importante mencionar que o Sublime (confirmado para v2 e v3) também espera .vert e .frag para destaque e validação de sintaxe.

Weavermount
fonte
2
Eu acredito que isso só é verdade se você tiver uma biblioteca GLSL instalada no Sublime, por exemplo, github.com/WebGLTools/GL-Shader-Validator - meu Sublime padrão não reconhece as extensões.
Air
A lib que você vinculou é de longe a mais popular (e possivelmente apenas?) GLSL lib para sublime, e chamei o que isso espera como o que sublime espera. Se você chamar isso de exagero, eu me declararei culpado. Mas sim, você está certo em pelo menos o sublime que um editor de texto obediente abrirá qualquer documento de texto, ignorando as extensões desconhecidas.
Weavermount
1
A partir de hoje sublime-GLSL ( github.com/euler0/sublime-glsl ) é o mais plug-in GLSL popular e aceita o seguinte conjunto de extensões: vs, fs, gs, vsh, fsh, gsh, vshader, fshader, gshader, vert, frag, geom, tesc, tese, comp, glsl. Portanto, há uma variedade para escolher :)
F Lekschas
-1

Existem duas maneiras de escrever shaders.

Você pode armazenar o conteúdo do shader de vértice e do fragmento de shader em uma char *variável e compilar, vincular e anexar o shader a um programa.

Outra maneira é escrever o arquivo separado do vértice e do shader de fragmento com qualquer extensão que você desejar e lê-lo para compilar, vincular e anexar o shader ao programa.

Portanto, a convenção de nomenclatura, como .vert / .frag, .vsdr / .fsdr, etc., é válida desde que você saiba como lê-la ...

user2439483
fonte
-2

Como já foi coberto por várias respostas, realmente não existe um padrão; depende de você adotar a abordagem mais útil para você.

Posso ver o benefício no uso de extensões de shader específicas do tipo, mas minha preferência é usar a extensão .glsl para todos os tipos de shader, pois você só precisa definir como o shell usa o arquivo uma vez.

Da mesma forma, essa também é uma boa opção se você editar seus arquivos de sombreador no Notepad ++, pois poderá configurá-lo para aplicar automaticamente a sintaxe específica do idioma realçada a todos os seus arquivos de sombreador, especificando apenas uma extensão de arquivo.

A desvantagem dessa abordagem é que você precisa utilizar sua própria convenção de nomenclatura para determinar o tipo de sombreador pelo nome do arquivo, mas, para mim, os benefícios superam o custo.

Lewis
fonte