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