В 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. Мы будем их использовать для программирования направленного света.