I'm learning glsl shading and I've come across different file formats. I've seen people giving their vertex and fragment shaders .vert
and .frag
extensions. But I've also seen .vsh
and .fsh
extensions, and even both shaders together in a single .glsl
file. So I'm wondering if there is a standard file format, or which way is the 'correct' one?
There is no standard file extension for GLSL shaders. The most common ones are probably .vert
and .frag
, as these are the extensions that 3D Labs used in some of their tools. But that's about it for any form of standard extension.
There's no official extension in the spec. OpenGL doesn't handle loading shaders from files; you just pass in the shader code as a string, so there's no specific file format.
However, glslang, Khronos' reference GLSL compiler/validator, uses the following extensions to determine what type of shader that the file is for:
- .vert - a vertex shader
- .tesc - a tessellation control shader
- .tese - a tessellation evaluation shader
- .geom - a geometry shader
- .frag - a fragment shader
- .comp - a compute shader
Identifying file type by extension is a thing specific to Windows. All other operating systems use different approaches: MacOS X stores the file type in a special metadata structure in the file system entries. Most *nixes identify files by testing their internal structure against a database of known "magic bytes"; however text editors use the extension.
Anyway, GLSL sources are just like any other program source file: plain text, and that's their file type.
The extension you may choose as you wish. I use the following naming:
- ts.glsl
- gs.glsl
- vs.glsl
- fs.glsl
but that's my choice and technically my programs don't even enforce any naming or extension scheme. The naming is for humans to read and know what's in it; having a common major extension requires me to have an syntax highlighing rule for only one file extension set.
As others have mentioned there isn't a correct answer in the strictest sense. It does bear mentioning that Sublime (confirmed for v2 and v3) also expects .vert and .frag for syntax highlighting and validation.
There are two ways of writing shaders.
You can store the vertex shader and fragment shader content in a char *
variable and compile, link and attach the shader to a program.
Another way is to write the seperate vertex and fragment shader file with whatever extension you like and read it to compile, link and attach the shader to the program.
So the naming convention, like .vert/.frag, .vsdr/.fsdr, etc. are all valid as long as you know how to read it...
As has already been covered by multiple responses, there really isn't a standard; it's up to you to adopt the approach that is most helpful to you.
I can see the benefit in using type-specific shader extensions but my preference is to use the .glsl extension for all types of shader, since you only need to define how shell uses the file once.
Similarly, this is also a good option if you edit your shader files in Notepad++, since you can configure it to automatically apply the language-specific syntax highlighting to all of your shader files by only specifying one file extension.
The downside to this approach is that you need to utilise your own naming convention in order to determine the type of shader by its file name but, for me, the benefits outweigh the cost.
来源:https://stackoverflow.com/questions/6432838/what-is-the-correct-file-extension-for-glsl-shaders