我正在学习GLSL着色器,并遇到不同的文件格式。我看到有人给他们的顶点和片段着色器分别使用.vert
和.frag
扩展名。但我也见过.vsh
和.fsh
扩展名,甚至是两个着色器在一个单独的.glsl
文件中。所以我想知道是否有标准的文件格式,或哪一种方式是“正确”的?
规范中没有官方扩展。OpenGL 不会从文件中加载着色器代码,你只需要将着色器代码以字符串形式传递,因此没有特定的文件格式。
然而,glslang,Khronos 的参考 GLSL 编译器/验证器,使用以下扩展来确定文件所属的着色器类型:
.vert
- 顶点着色器.tesc
- 曲面细分控制着色器.tese
- 曲面细分评估着色器.geom
- 几何着色器.frag
- 片段着色器.comp
- 计算着色器
Khronos创建的glslang编译器根据扩展名做出关于着色器阶段的假设,但除此之外没有标准扩展名(许多项目都会自己创造)。glslang编译器会根据 .vert
, .tesc
(曲面细分控制着色器), .tese
(曲面细分评估着色器), .geom
, .frag
和 .comp
这些扩展名进行关键词匹配。
但这就是所有标准扩展名的内容了。
.hpp
和 .cpp
有什么区别?.h
和 .c
呢?顶点着色器和片元着色器之间的语法和语义差异比 C/C++ 的头文件和源文件之间的差异更大。 - Miles Rout.vert
(顶点shader),.frag
(片元shader),.tesc
(镶嵌控制shader),.tese
(镶嵌评估shader),.geom
(几何shader),.comp
(计算shader)。请注意,翻译的结果可能略有不同于原始的英文文本,但意思不变。 - TachyonVortex通过扩展名识别文件类型是Windows系统特有的方法。其他操作系统使用不同的方法:MacOS X将文件类型存储在文件系统入口的特殊元数据结构中。大多数*nix通过将文件的内部结构与已知“magic bytes”数据库进行比较来确定文件类型,但是文本编辑器使用扩展名。
无论如何,GLSL源代码就像任何其他程序源文件一样:纯文本,这就是它们的文件类型。
您可以根据自己的喜好选择扩展名。我使用以下命名:
但那是我的选择,从技术上讲,我的程序甚至不强制执行任何命名或扩展方案。这种命名是为了让人们读取和知道其中的内容,拥有共同的主要扩展名要求我仅为一个文件扩展名集合设置语法高亮规则。
com.stackoverflow.file
,它被存储为元数据。如果这个元数据项存在,LaunchServices会首先尝试从MIME类型猜测它。如果没有,它将查找扩展名。如果仍然找不到匹配项,它将查找HFS创建者码。如果还是找不到,它就放弃了。LaunchServices从不尝试通过文件头或魔术字节来识别文件。 - zneak正如其他人提到的那样,在严格意义上,没有正确的答案。值得一提的是,Sublime(已确认适用于v2和v3)还期望使用.vert和.frag进行语法高亮和验证。
编写着色器有两种方法。
您可以将顶点着色器和片段着色器内容存储在char *
变量中,并将其编译、链接和附加到程序中。
另一种方法是编写单独的顶点和片段着色器文件,使用任何您喜欢的扩展名并读取它以编译、链接和附加到程序中。
因此,像.vert/.frag、.vsdr/.fsdr等命名约定都是有效的,只要您知道如何读取它...
cpp
。在这种情况下,你只需说没有扩展名。这个问题并没有错。 - Jaacko Torus