版本:Unity 6 (6000.0)
语言:English
为不同的图形 API 编写着色器
在 GPU 上设置渲染状态

Unity 中的 GLSL

除了编写HLSL 着色器程序之外,您还可以编写原始 OpenGL 着色语言 (GLSL)着色器在 GPU 上运行的程序。 更多信息
参见 术语表
程序在 Unity 中。这仅在 OpenGL Core 和 OpenGL ES 平台上受支持。

注意:在正常工作流程中,不建议或不需要这样做;Unity 会根据需要将您的 HLSL 跨编译成优化的 GLSL。仅建议在测试或某些特殊用例中使用原始 GLSL。

GLSL 代码片段

GLSL 程序代码片段写在GLSLPROGRAMENDGLSL关键字之间。

在 GLSL 中,所有着色器函数入口点都必须称为main()。当 Unity 加载 GLSL 着色器时,它会为顶点程序加载一次源代码,并使用VERTEX预处理器定义,并再次为片段程序加载源代码,并使用FRAGMENT预处理器定义。因此,在 GLSL 代码片段中分离顶点和片段程序部分的方法是用#ifdef VERTEX .. #endif#ifdef FRAGMENT .. #endif将其括起来。每个 GLSL 代码片段都必须包含顶点程序和片段程序。

标准包含文件与为 Cg/HLSL 着色器提供的包含文件匹配;它们只是具有.glslinc扩展名。

UnityCG.glslinc

顶点着色器输入来自预定义的 GLSL 变量(gl_Vertexgl_MultiTexCoord0等)或用户定义的属性。通常,只有切线向量需要用户定义的属性。

attribute vec4 Tangent;

来自顶点到片段程序的数据通过varying变量传递,例如

varying vec3 lightDir; // vertex shader computes this, fragment shader uses this

外部 OES 纹理

Unity 在着色器编译期间进行一些预处理;例如,texture2D/texture2DProj函数可能会替换为texture/textureProj,具体取决于图形 API(GlES3、GLCore)。某些扩展不支持新的约定,最值得注意的是GL_OES_EGL_image_external

如果要在 GLSL 着色器中采样外部纹理,请使用textureExternal/textureProjExternal调用而不是texture2D/texture2DProj

示例

gl_FragData[0] = textureExternal(_MainTex, uv);
为不同的图形 API 编写着色器
在 GPU 上设置渲染状态