In addition to using Cg/HSL shader programs, OpenGL Shading Language (GLSL) shaders can be written directly.
However, use of raw GLSL is only recommended for testing, or when you know you will only target Mac OS X, OpenGL ES mobile devices or Linux. In all normal cases, Unity will cross-compile Cg/HLSL into optimized GLSL when needed.
GLSL program snippets are written between
In GLSL, all shader function entry points have to be called
main(). When Unity loads the GLSL shader, it loads the source once for the vertex program, with the
VERTEX preprocessor define, and once more for the fragment program, with the
FRAGMENT preprocessor define. So the way to separate vertex and fragment program parts in GLSL snippet is to surround them with
#ifdef VERTEX .. #endif and
#ifdef FRAGMENT .. #endif. Each GLSL snippet must contain both a vertex program and a fragment program.
Standard include files match those provided for Cg/HLSL shaders; they just have a
Vertex shader inputs come from predefined GLSL variables (
gl_MultiTexCoord0, …) or are user defined attributes. Usually only the tangent vector needs a user defined attribute:
attribute 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