From 1bbe0db68dad190d619e362794b7b2bb047dbd21 Mon Sep 17 00:00:00 2001 From: unknown Date: Fri, 23 May 2014 17:00:57 -0430 Subject: [PATCH] Added modified directional light shader. --- .../directionalPerPixel_frag.glsl | 60 ++++++++++++++++ .../directionalPerPixel_vert.glsl | 70 +++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_frag.glsl create mode 100644 assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_vert.glsl diff --git a/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_frag.glsl b/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_frag.glsl new file mode 100644 index 0000000..02c8fa3 --- /dev/null +++ b/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_frag.glsl @@ -0,0 +1,60 @@ +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifdef GL_ES +precision mediump float; +#endif + +// Ambient light color. +uniform vec4 u_ambient; + +// Specular light color. +uniform vec4 u_specular; + +// Shininess. +uniform float u_shiny; + +// Fragment normal. +varying vec3 v_normal; + +// Fragment shaded diffuse color. +varying vec4 v_diffuse; + +// Vector from the fragment to the light source. +varying vec3 v_lightVector; + +// Vector from the fragment to the camera. +varying vec3 v_eyeVector; + +// The light vector reflected around the fragment normal. +varying vec3 v_reflectedVector; + +void main(){ + // Normalize the input varyings. + vec3 normal = normalize(v_normal); + vec3 lightVector = normalize(v_lightVector); + vec3 eyeVector = normalize(v_eyeVector); + vec3 reflectedVector = normalize(v_reflectedVector); + + // Specular Term: + vec4 specular = u_specular * pow(max(dot(reflectedVector, eyeVector), 0.0), u_shiny); + + // Aggregate light color. + vec4 finalColor = clamp(vec4(u_ambient.rgb + v_diffuse.rgb + specular.rgb, 1.0), 0.0, 1.0); + + // Final color. + gl_FragColor = finalColor; +} diff --git a/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_vert.glsl b/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_vert.glsl new file mode 100644 index 0000000..e15b749 --- /dev/null +++ b/assets/shaders/directionalPerPixelSingleLight/directionalPerPixel_vert.glsl @@ -0,0 +1,70 @@ +/* + * Copyright (C) 2014 Miguel Angel Astor Romero + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Model-view matrix. +uniform mat4 u_projTrans; + +// The world space geometric transformation to apply to this vertex. +uniform mat4 u_geomTrans; + +// Light source position +uniform vec3 u_lightPos; + +// Diffuse light color. +uniform vec4 u_lightDiffuse; + +// Camera world space position. +uniform vec3 u_cameraPos; + +// Vertex color. +uniform vec4 u_materialDiffuse; + +// Vertex position in world coordinates. +attribute vec4 a_position; + +// Vertex normal. +attribute vec4 a_normal; + +// Fragment normal. +varying vec3 v_normal; + +// Diffuse shaded color to pass to the fragment shader. +varying vec4 v_diffuse; + +// The vector from the vertex to the light source. +varying vec3 v_lightVector; + +// The vector from the vertex to the camera. +varying vec3 v_eyeVector; + +// The light vector reflected around the vertex normal. +varying vec3 v_reflectedVector; + +void main(){ + // Apply the geometric transformation to the original position of the vertex. + vec4 transformedPosition = u_geomTrans * a_position; + + // Set the varyings. + v_normal = normalize(a_normal.xyz); + v_lightVector = normalize(transformedPosition.xyz - u_lightPos.xyz); + v_eyeVector = normalize(u_cameraPos.xyz - transformedPosition.xyz); + v_reflectedVector = normalize(reflect(-v_lightVector, a_normal.xyz)); + + // Diffuse Term. + v_diffuse = u_lightDiffuse * u_materialDiffuse * max(dot(a_normal.xyz, v_lightVector), 0.0); + + gl_Position = u_projTrans * transformedPosition; +}