e2r 0.10.0

experimental rendering engine in rust
Documentation
#version 330
//#version 410

// Declare any uniforms needed for the Phong shading model
uniform sampler2DShadow ShadowMap;
//uniform sampler2D Tex1;

uniform mat4 LightViewMatrix;

in vec4 Position;
in vec3 Normal;
in vec4 ShadowCoord;
//in vec2 TexCoord;

out vec4 FragColor;

struct LightInfo {
    vec4 Position; // Light position in eye coords.
    vec3 La; // Ambient light intensity
    vec3 Ld; // Diffuse light intensity
    vec3 Ls; // Specular light intensity
};

uniform LightInfo Light;

struct MaterialInfo {
    vec3 Ka; // Ambient reflectivity
    vec3 Kd; // Diffuse reflectivity
    vec3 Ks; // Specular reflectivity
    float Shininess; // Specular shininess factor
};

uniform MaterialInfo Material;

vec3 phongModel( vec4 position, vec3 norm )
{
    vec4 LightViewPos = LightViewMatrix * Light.Position;
    vec3 s = normalize(vec3(LightViewPos - position));
    
    //vec3 s = normalize(vec3(Light.Position - position));
    vec3 v = normalize(-position.xyz);
    vec3 r = reflect( -s, norm );
    float sDotN = max( dot(s,norm), 0.0 );
    vec3 diffuse = Light.Ld * Material.Kd * sDotN;
    vec3 spec = vec3(0.0);
    if( sDotN > 0.0 )
        spec = Light.Ls * Material.Ks * pow( max( dot(r,v), 0.0 ), Material.Shininess );
    return diffuse + spec;
}

uniform int bShadeShadow;

// subroutine void RenderPassType();
// subroutine uniform RenderPassType RenderPass;

//subroutine (RenderPassType)
void shadeWithShadow()
{
  // Do the shadow-map look-up
//  float shadow = textureProj(ShadowMap, ShadowCoord);
  // If the fragment is in shadow, use ambient light only.
  vec3 ambient = Light.La * Material.Ka;

  // The sum of the comparisons with nearby texels
  float sum = 0; 

  // Sum contributions from texels around ShadowCoord
  sum += textureProjOffset( ShadowMap, ShadowCoord, ivec2( -1, 0 ) );
  sum += textureProjOffset( ShadowMap, ShadowCoord, ivec2( 1, 0 ) );
  sum += textureProjOffset( ShadowMap, ShadowCoord, ivec2( 0, -1 ) );
  sum += textureProjOffset( ShadowMap, ShadowCoord, ivec2( 0, 1 ) );
  sum += textureProjOffset( ShadowMap, ShadowCoord, ivec2( 0, 0 ) );

  // if( sum < ShadowCoord.z + 0.01 ){
  //     sum = 0.5;
  // }else{
  //     sum = 1;
  // }
  float shadow = sum * 0.2;
  //float shadow = sum;

  vec3 DiffSpec = phongModel( Position, Normal );
  //vec4 texColor = texture( Tex1, TexCoord );
  //FragColor = vec4( shadow * DiffSpec * vec3(texColor) + ambient, 1.0 );
  FragColor = vec4( shadow * DiffSpec + ambient, 1.0 );  
}

//subroutine (RenderPassType)
void recordDepth()
{
  // Do nothing, depth will be written automatically
}

void main() {
  // This will call either shadeWithShadow or recordDepth

    if( bShadeShadow == 1 )
    {
        shadeWithShadow();
    }
    else
    {
        recordDepth();
    }
//  RenderPass();
}