GLSL着色器的正确文件扩展名是什么?

161

我正在学习GLSL着色器,并遇到不同的文件格式。我看到有人给他们的顶点和片段着色器分别使用.vert.frag扩展名。但我也见过.vsh.fsh扩展名,甚至是两个着色器在一个单独的.glsl文件中。所以我想知道是否有标准的文件格式,或哪一种方式是“正确”的?


12
据我所知,它们没有“正确”的扩展名,因为OpenGL无论如何都不会从磁盘上读取它们。 - zneak
2
有些人称它们为.vs和.fs(以及.gs),以明确其中的内容。但正如zneak所说,这并不重要,没有“正确”的事情。 - Damon
12
GEdit在选择语法高亮时使用".glslv"和".glslf"。这是我见过的唯一有用到的地方。 - Piotr Praszmo
6
我不明白为什么这个问题被标记为基于观点的。我知道GLSL没有正确的文件扩展名,但这是一个完全有效的非基于观点的问题。如果我针对C++文件问同样的事情,那么有人会告诉我它是 cpp。在这种情况下,你只需说没有扩展名。这个问题并没有错。 - Jaacko Torus
5个回答

143

规范中没有官方扩展。OpenGL 不会从文件中加载着色器代码,你只需要将着色器代码以字符串形式传递,因此没有特定的文件格式。

然而,glslang,Khronos 的参考 GLSL 编译器/验证器,使用以下扩展来确定文件所属的着色器类型:

  • .vert - 顶点着色器
  • .tesc - 曲面细分控制着色器
  • .tese - 曲面细分评估着色器
  • .geom - 几何着色器
  • .frag - 片段着色器
  • .comp - 计算着色器

104

Khronos创建的glslang编译器根据扩展名做出关于着色器阶段的假设,但除此之外没有标准扩展名(许多项目都会自己创造)。glslang编译器会根据 .vert, .tesc(曲面细分控制着色器), .tese(曲面细分评估着色器), .geom, .frag.comp 这些扩展名进行关键词匹配。

但这就是所有标准扩展名的内容了。


29
我认为.vert和.frag不是着色器的好扩展名。扩展名是用来识别文件类别的。他们应该把它们命名为vertex.glsl和fragment.glsl。 - Sandeep Datta
5
我也感到惊讶,但是在顶点着色器和片段着色器之间的语法上不是有一些细微差别吗,@SandeepDatta?就像.h和.c可能有很多共同点,但它们的使用方式不同一样。 - Joseph Humfrey
8
.hpp.cpp 有什么区别?.h.c 呢?顶点着色器和片元着色器之间的语法和语义差异比 C/C++ 的头文件和源文件之间的差异更大。 - Miles Rout
1
@MilesRout 更不用说 .cc 了。 - user896326
47
GLSLang,又称GLSL参考解析器或参考编译器,是由3Dlabs开发的工具之一。它被列为opengl.org和khronos.org上的SDK工具。README文件列出了它期望着色器文件的文件扩展名:.vert(顶点shader),.frag(片元shader),.tesc(镶嵌控制shader),.tese(镶嵌评估shader),.geom(几何shader),.comp(计算shader)。请注意,翻译的结果可能略有不同于原始的英文文本,但意思不变。 - TachyonVortex
显示剩余2条评论

22

通过扩展名识别文件类型是Windows系统特有的方法。其他操作系统使用不同的方法:MacOS X将文件类型存储在文件系统入口的特殊元数据结构中。大多数*nix通过将文件的内部结构与已知“magic bytes”数据库进行比较来确定文件类型,但是文本编辑器使用扩展名。

无论如何,GLSL源代码就像任何其他程序源文件一样:纯文本,这就是它们的文件类型。

您可以根据自己的喜好选择扩展名。我使用以下命名:

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

但那是我的选择,从技术上讲,我的程序甚至不强制执行任何命名或扩展方案。这种命名是为了让人们读取和知道其中的内容,拥有共同的主要扩展名要求我仅为一个文件扩展名集合设置语法高亮规则。


5
因为多年来OS X一直主要使用文件扩展名,所以被踩了。 - Frederik Slijkerman
7
不,它并不需要。MacOS X在其核心是Unix系统,文件扩展名从来没有被用来识别事物。是的,标准类型会得到标准的文件扩展名,但那只是为了方便人类阅读。也许Finder可能会依赖文件扩展名作为某些类型的启发式方法。但是,如果它可以仅通过文件头或一些特殊字节来识别文件,它将使用该方法。就像任何基于Unix系统的操作系统一样。 - datenwolf
3
+1 我将它们命名为_effect-name_-fs.glsl或_effect-name_-vs.glsl。 - legends2k
12
我知道我晚了两年才参与到关于OS X的讨论中,但我觉得我应该发表一下我的意见。在UNIX层之上的所有内容都使用LaunchServices来确定文件关联性。每个文件都有一个类型标识符,比如com.stackoverflow.file,它被存储为元数据。如果这个元数据项存在,LaunchServices会首先尝试从MIME类型猜测它。如果没有,它将查找扩展名。如果仍然找不到匹配项,它将查找HFS创建者码。如果还是找不到,它就放弃了。LaunchServices从不尝试通过文件头或魔术字节来识别文件。 - zneak
3
这意味着在OS X上确定文件类型最常见的方法是通过它的扩展名。但这只是为了识别应该使用哪个应用程序打开文件。一旦应用程序打开了文件,它可以自行决定如何处理文件,不受扩展名是否正确匹配内容类型的影响。 - zneak
@zneak 感谢您的解释,这可以解释macOS如何区分PDF和Adobe Illustrator文档,尽管它们最终是相同的格式... - user458541

8

正如其他人提到的那样,在严格意义上,没有正确的答案。值得一提的是,Sublime(已确认适用于v2和v3)还期望使用.vert和.frag进行语法高亮和验证。


3
我相信这只有在Sublime安装了GLSL库时才是正确的,例如https://github.com/WebGLTools/GL-Shader-Validator - 我默认的Sublime不识别这些扩展名。 - Air
你链接的库是迄今为止最受欢迎的(也可能是唯一的?)Sublime GLSL库,我称之为Sublime所期望的内容。如果你认为这是夸张的话,我会承认有罪。但是你说得对,至少Sublime作为一个尽职尽责的文本编辑器,会打开任何文本文档,而忽略它不知道的扩展名。 - Weavermount
2
截至今天,sublime-glsl(https://github.com/euler0/sublime-glsl)是最受欢迎的GLSL插件,它接受以下一组扩展名:`vs,fs,gs,vsh,fsh,gsh,vshader,fshader,gshader,vert,frag,geom,tesc,tese,comp,glsl`。因此,有多种选择 :) - F Lekschas

0

编写着色器有两种方法。

您可以将顶点着色器和片段着色器内容存储在char *变量中,并将其编译、链接和附加到程序中。

另一种方法是编写单独的顶点和片段着色器文件,使用任何您喜欢的扩展名并读取它以编译、链接和附加到程序中。

因此,像.vert/.frag、.vsdr/.fsdr等命名约定都是有效的,只要您知道如何读取它...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接