53 lines
1.4 KiB
GLSL
53 lines
1.4 KiB
GLSL
#version 120
|
|
|
|
attribute vec3 a_position;
|
|
attribute vec3 a_normal;
|
|
attribute vec2 a_texcoord;
|
|
|
|
varying vec3 v_position;
|
|
varying vec3 v_normal;
|
|
varying vec2 v_texcoord;
|
|
varying vec3 v_finalColor;
|
|
|
|
uniform mat4 u_modelMatrix;
|
|
uniform mat4 u_viewMatrix;
|
|
uniform mat4 u_projectionMatrix;
|
|
uniform mat4 u_modelViewProjection;
|
|
uniform vec4 u_sunDirection;
|
|
uniform vec4 u_sunColor;
|
|
uniform vec4 u_sunAmbientColor;
|
|
uniform vec4 u_cameraPos;
|
|
|
|
// #TODO: should use own uniforms
|
|
#define u_ligthPosition u_sunDirection.xyz
|
|
#define u_ligthRadius u_sunDirection.w
|
|
|
|
// Calculate blinn-phong per-vertex lighting
|
|
float CalcPhongLighting( vec3 worldPos, vec3 normal, vec3 lightPos ) {
|
|
vec3 lightDir = normalize( lightPos - worldPos );
|
|
vec3 viewDir = normalize( u_cameraPos.xyz - worldPos );
|
|
vec3 halfVec = normalize( lightDir + viewDir );
|
|
|
|
float diff = max( dot( normal, lightDir ), 0.0 );
|
|
|
|
v_finalColor.x = diff;
|
|
|
|
float spec = pow( max( dot( normal, halfVec ), 0.0 ), 128.0 ) * 1.0;
|
|
|
|
v_finalColor.y = spec;
|
|
|
|
return diff + spec;
|
|
}
|
|
|
|
void main() {
|
|
v_position = vec3( u_modelMatrix * vec4(a_position, 1.0) );
|
|
v_normal = vec3( mat3(u_modelMatrix) * a_normal );
|
|
v_texcoord = a_texcoord;
|
|
|
|
CalcPhongLighting( v_position, v_normal, u_ligthPosition );
|
|
|
|
//v_finalColor = u_sunAmbientColor.rgb + CalcPhongLighting( v_position, v_normal, u_ligthPosition );
|
|
|
|
|
|
gl_Position = u_modelViewProjection * vec4(a_position, 1);
|
|
} |