Let’s take a look at our next example program, DiffuseLight. This program demonstrates a simple diffuse lighting shader on a blue sphere. It uses a point light source so you can also see how we determine this in a shader. Of course using a directional light source would be simpler since we’d already supply this vector, but we, as they say, leave that as an exercise for the reader. Listing 6.7 shows the complete DiffuseLight.vp vertex shader.
В openGL Superbible описывается шейдер диффузного затенения. На каждом проходе вычисляется вектор направления света по отношению к данной вершине. Как я понял, чтобы сделать источник света направленным, нужно вычислять вектор источника независимо от текущей вершины. Сделал нормализацию только самого вектора положения источника, но визуально это ничем не отличалось от первого варианта. Или нужно было вне шейдера взять среднюю точку сферы и отнять её от положения источника?
...
uniform vec4 diffuseColor;
uniform vec3 vLightPosition;
uniform mat4 mvpMatrix;
uniform mat4 mvMatrix;
uniform mat3 normalMatrix;
// Color to fragment program
smooth out vec4 vVaryingColor;
void main(void)
{
// Get surface normal in eye coordinates
vec3 vEyeNormal = normalMatrix * vNormal;
// Get vertex position in eye coordinates
vec4 vPosition4 = mvMatrix * vVertex;
vec3 vPosition3 = vPosition4.xyz / vPosition4.w;
// Get vector to light source
vec3 vLightDir = normalize(vLightPosition - vPosition3);
//я сделал vec3 vLightDir = normalize(vLightPosition);
...