Game Development Reference
In-Depth Information
We start our calculation by initializing the iDiffuse and iSpecular components
to 0 . Then, we iterate over the list of directional/positional lights to calculate
the diffuse/specular component. We then add their corresponding values to the
iDiffuse and iSpecular variables to get the sum total of all the lights in the scene.
The code snippet for the fragment shader is as follows:
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
varying vec3 transformedNormal;
varying vec3 vertexPos;
const int NUM_DIRECTIONAL_LIGHTS = 1;
uniform vec3 uLightDirection[NUM_DIRECTIONAL_LIGHTS];
const int NUM_POSITIONAL_LIGHTS = 2;
varying vec3 uLightRay[NUM_POSITIONAL_LIGHTS];
uniform vec3 uAmbientColor;
uniform vec3 uDirectionalDiffuseColor[NUM_DIRECTIONAL_LIGHTS];
uniform vec3 uDirectionalSpecularColor[NUM_DIRECTIONAL_LIGHTS];
uniform vec3 uPositionalDiffuseColor[NUM_POSITIONAL_LIGHTS];
uniform vec3 uPositionalSpecularColor[NUM_POSITIONAL_LIGHTS];
uniform vec3 materialDiffuseColor;
uniform vec3 materialAmbientColor;
uniform vec3 materialSpecularColor;
void main(void) {
vec3 normal=normalize(transformedNormal);
vec3 eyeVector=normalize(-vertexPos);
vec3 iAmbient=uAmbientColor*materialAmbientColor;
vec3 iDiffuse=vec3(0.0,0.0,0.0);
vec3 iSpecular=vec3(0.0,0.0,0.0);
float specular = 0.0;
for(int i = 0; i < NUM_DIRECTIONAL_LIGHTS ; i++){
vec3 lightDirection = normalize(uLightDirection[i]);
float directionalLightWeighting = max(dot(normal, -
lightDirection), 0.0);
iDiffuse+=uDirectionalDiffuseColor[i] *materialDiffuseColor
* directionalLightWeighting;
if(directionalLightWeighting>0.0)
{
vec3 halfDir = normalize(-lightDirection + eyeVector);
float specAngle = max(dot(halfDir, normal), 0.0);
specular = pow(specAngle, 4.0);
iSpecular+=uDirectionalSpecularColor[i]*
materialSpecularColor*specular;
}
}
 
Search WWH ::




Custom Search