screen.fs
#version 330
out vec4 FragColor;
in vec2 TexCoord;
uniform sampler2D gPosition;
uniform sampler2D gNormalAndShadow;
uniform sampler2D gColor;
uniform sampler2D ssao;
uniform vec3 Ambient;
uniform vec3 LightColor;
uniform vec3 LightDirection;
uniform vec3 halfVector;
uniform float shininess;
uniform float strength;
uniform bool isShadowMap;
uniform bool isAo;
void main()
{
// Retrieve data from g-buffer
vec2 texelSize = 1.0 / textureSize(gColor, 0);
vec3 rgb = vec3(0.0);
float Alpha = 0.0;
/*ssaa (Super Sample Anti-aliasing)*/
for(int i=0;i<2;i++)
for(int j=0;j<2;j++)
{
vec2 TexCoord1 = TexCoord + vec2(i, j) * texelSize;
//vec3 FragPos = texture(gPosition, TexCoord1).rgb; //FragPos is used for point light source
vec3 Normal = texture(gNormalAndShadow, TexCoord1).rgb;
vec3 color = texture(gColor, TexCoord1).rgb;
float AmbientOcclusion = isAo ? texture(ssao, TexCoord1).r : 1;
float shadow = isShadowMap ? texture(gNormalAndShadow, TexCoord1).w : 0.0;
float diffuse = max(0.0,dot(Normal,LightDirection));
float specular = max(0.0,dot(Normal,normalize(halfVector)));
if (diffuse == 0.0)
{
specular = 0.0;
}
else
{
specular = pow(specular, shininess);
}
vec3 ambientLight = AmbientOcclusion * Ambient;
vec3 diffuseLight = LightColor * diffuse;
vec3 specularLight = LightColor * specular * strength;
rgb += min(color*(ambientLight + (1.0 - shadow)*(diffuseLight + specularLight)),vec3(1.0,1.0,1.0));
Alpha += texture(gColor, TexCoord1).w;
}
rgb /= 4.0;
Alpha /= 4.0;
FragColor = vec4(rgb,Alpha);
}