除了编写HLSL 着色器程序之外,您还可以编写原始 OpenGL 着色语言 (GLSL)着色器在 GPU 上运行的程序。 更多信息
参见 术语表程序在 Unity 中。这仅在 OpenGL Core 和 OpenGL ES 平台上受支持。
注意:在正常工作流程中,不建议或不需要这样做;Unity 会根据需要将您的 HLSL 跨编译成优化的 GLSL。仅建议在测试或某些特殊用例中使用原始 GLSL。
GLSL 程序代码片段写在GLSLPROGRAM
和ENDGLSL
关键字之间。
在 GLSL 中,所有着色器函数入口点都必须称为main()
。当 Unity 加载 GLSL 着色器时,它会为顶点程序加载一次源代码,并使用VERTEX
预处理器定义,并再次为片段程序加载源代码,并使用FRAGMENT
预处理器定义。因此,在 GLSL 代码片段中分离顶点和片段程序部分的方法是用#ifdef VERTEX .. #endif
和#ifdef FRAGMENT .. #endif
将其括起来。每个 GLSL 代码片段都必须包含顶点程序和片段程序。
标准包含文件与为 Cg/HLSL 着色器提供的包含文件匹配;它们只是具有.glslinc
扩展名。
UnityCG.glslinc
顶点着色器输入来自预定义的 GLSL 变量(gl_Vertex
、gl_MultiTexCoord0
等)或用户定义的属性。通常,只有切线向量需要用户定义的属性。
attribute vec4 Tangent;
来自顶点到片段程序的数据通过varying变量传递,例如
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
Unity 在着色器编译期间进行一些预处理;例如,texture2D/texture2DProj
函数可能会替换为texture/textureProj
,具体取决于图形 API(GlES3、GLCore)。某些扩展不支持新的约定,最值得注意的是GL_OES_EGL_image_external
。
如果要在 GLSL 着色器中采样外部纹理,请使用textureExternal/textureProjExternal
调用而不是texture2D/texture2DProj
。
示例
gl_FragData[0] = textureExternal(_MainTex, uv);