Version: 6000.3
语言: 中文
为不同的图形 API 编写着色器
在GPU上设置渲染状态

Unity 中的 GLSL

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

注意:不建议或不需要将其作为正常工作流程的一部分;Unity 会在需要时将 HLSL 交叉编译为优化的 GLSL。仅建议将原始 GLSL 用于测试或某些特殊用例。

GLSL 代码段

GLSL 程序片段写入GLSLPROGRAMENDGLSL关键字。

在 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

外部 OES 纹理

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);
为不同的图形 API 编写着色器
在GPU上设置渲染状态