В OpenGL есть три типа источников света: направленный, точечный и «прожекторный». В этом уроке мы будем работать с направленным светом. Сначала мы рассмотрим способ, позволяющий в GLSL скопировать способ освещения OpenGL.

Мы создадим шейдер, со временем переходящий от ambient-света к specular.


Ambient Ambient + Diffuse Specular

Далее для получения лучших результатов перейдем к попикселному освещению:

Далее применим попикселное точечное и прожекторное освещение. Эти последние уроки будут основаны на  уроке направленного света, так как основной код останется без изменений.



Point Light Spot Light

Как говорилось в уроках toon-шейдеров, GLSL имеет доступ к параметрам освещения OpenGL. Эти данные описывают как индивидуальные параметры источников, так и глобальные параметры освещения.

struct gl_LightSourceParameters {
vec4 ambient;
vec4 diffuse;
vec4 specular;
vec4 position;
vec4 halfVector;
vec3 spotDirection;
float spotExponent;
float spotCutoff; // (range: [0.0,90.0], 180.0)
float spotCosCutoff; // (range: [1.0,0.0],-1.0)
float constantAttenuation;
float linearAttenuation;
float quadraticAttenuation;
};

uniform gl_LightSourceParameters gl_LightSource[gl_MaxLights];

struct gl_LightModelParameters {
vec4 ambient;
};

uniform gl_LightModelParameters gl_LightModel;

Свойства материалов также доступны в GLSL:

struct gl_MaterialParameters {
vec4 emission;
vec4 ambient;
vec4 diffuse;
vec4 specular;
float shininess;
};

uniform gl_MaterialParameters gl_FrontMaterial;
uniform gl_MaterialParameters gl_BackMaterial;

Большинство этих параметров по названиям понятны и аналогичны тем, что используются для описания освещения и материалов в OpenGL. Мы будем их использовать для программирования направленного света.