GLSL in Unity
If a platform supports OpenGL Core and OpenGL ES, you can write OpenGL Shading Language (GLSL) shader programs in Unity.
読み終わるまでの所要時間 2 分最終更新 23日前
As well as writing HLSL shader programs, you can also write raw OpenGL Shading Language (GLSL) shader programs in Unity. This is only supported on OpenGL Core and OpenGL ES platforms.
GLSL snippets
GLSL program snippets are written between and keywords.
GLSLPROGRAMENDGLSLIn GLSL, all shader function entry points have to be called . When Unity loads the GLSL shader, it loads the source once for the vertex program, with the preprocessor define, and once more for the fragment program, with the preprocessor define. So the way to separate vertex and fragment program parts in GLSL snippet is to surround them with and . Each GLSL snippet must contain both a vertex program and a fragment program.
main()VERTEXFRAGMENT#ifdef VERTEX .. #endif#ifdef FRAGMENT .. #endifStandard include files match those provided for Cg/HLSL shaders; they just have a extension:
.glslincUnityCG.glslinc
Vertex shader inputs come from predefined GLSL variables (, , ...) or are user defined attributes. Usually only the tangent vector needs a user defined attribute:
gl_Vertexgl_MultiTexCoord0attribute vec4 Tangent;
Data from vertex to fragment programs is passed through varying variables, for example:
varying vec3 lightDir; // vertex shader computes this, fragment shader uses this
External OES textures
Unity does some preprocessing during Shader compilation; for example, functions may be replaced to , based on graphics API (GlES3, GLCore). Some extensions don't support new convention, most notably .
texture2D/texture2DProjtexture/textureProjGL_OES_EGL_image_externalIf you want to sample external textures in GLSL shaders, use calls instead of .
textureExternal/textureProjExternaltexture2D/texture2DProjExample:
gl_FragData[0] = textureExternal(_MainTex, uv);