SSAO now working. Changed in DrawFinalePass so that th AOTexture is on texture position 0 and only get binded once.
Changed so that the picking pass get drawn once in the beginning so that the AO shatde could calculate AO from the depthbuffer generated during pthe pickingpass. In the ImGUI debugg window there is now sliders to change the behavior of the AO shader. Only the minimum ambient lightning is HardCoded in to the frowardPlus fragmentshaders with a define in the begining.
This commit is contained in:
@@ -4,7 +4,6 @@ layout (binding = 0) uniform sampler2D SceneTexture;
|
||||
layout (binding = 1) uniform sampler2D BloomTexture;
|
||||
layout (binding = 2) uniform sampler2D SceneTextureLowRes;
|
||||
layout (binding = 3) uniform sampler2D BloomTextureLowRes;
|
||||
layout (binding = 4) uniform sampler2D SSAOTexture;
|
||||
uniform float Exposure;
|
||||
uniform float Gamma;
|
||||
|
||||
@@ -20,10 +19,8 @@ void main()
|
||||
vec4 bloomColor = texture(BloomTexture, Input.TextureCoordinate);
|
||||
vec4 hdrColorLowRes = texture(SceneTextureLowRes, Input.TextureCoordinate);
|
||||
vec4 bloomColorLowRes = texture(BloomTextureLowRes, Input.TextureCoordinate);
|
||||
vec4 SSAO = texture(SSAOTexture, Input.TextureCoordinate);
|
||||
|
||||
//hdrColor = hdrColor * SSAO;
|
||||
SSAO = clamp(SSAO, 0.1f, 1.0f);
|
||||
hdrColor += bloomColor;
|
||||
hdrColorLowRes;
|
||||
|
||||
@@ -38,7 +35,6 @@ void main()
|
||||
|
||||
//gamme correction
|
||||
result = pow(result, vec3(1.0 / Gamma));
|
||||
result = result * SSAO.rgb;
|
||||
fragmentColor = vec4(result, 1.0);
|
||||
//fragmentColor = hdrColor;
|
||||
//fragmentColor = bloomColor;
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#version 430
|
||||
|
||||
#define MIN_AMBIENT_LIGHT 0.3
|
||||
|
||||
uniform mat4 M;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
@@ -14,10 +16,11 @@ uniform vec2 DiffuseUVRepeat;
|
||||
uniform vec2 NormalUVRepeat;
|
||||
uniform vec2 SpecularUVRepeat;
|
||||
uniform vec2 GlowUVRepeat;
|
||||
layout (binding = 0) uniform sampler2D DiffuseTexture;
|
||||
layout (binding = 1) uniform sampler2D NormalMapTexture;
|
||||
layout (binding = 2) uniform sampler2D SpecularMapTexture;
|
||||
layout (binding = 3) uniform sampler2D GlowMapTexture;
|
||||
layout (binding = 0) uniform sampler2D AOTexture;
|
||||
layout (binding = 1) uniform sampler2D DiffuseTexture;
|
||||
layout (binding = 2) uniform sampler2D NormalMapTexture;
|
||||
layout (binding = 3) uniform sampler2D SpecularMapTexture;
|
||||
layout (binding = 4) uniform sampler2D GlowMapTexture;
|
||||
|
||||
#define TILE_SIZE 16
|
||||
|
||||
@@ -119,6 +122,8 @@ vec4 CalcNormalMappedValue(vec3 normal, vec3 tangent, vec3 bitangent, vec2 textu
|
||||
|
||||
void main()
|
||||
{
|
||||
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy), 0).r;
|
||||
ao = (clamp(1.0 - (1.0 - ao), 0.0, 1.0) + MIN_AMBIENT_LIGHT) / (1.0 + MIN_AMBIENT_LIGHT);
|
||||
vec4 diffuseTexel = texture2D(DiffuseTexture, Input.TextureCoordinate * DiffuseUVRepeat);
|
||||
vec4 glowTexel = texture2D(GlowMapTexture, Input.TextureCoordinate * GlowUVRepeat);
|
||||
vec4 specularTexel = texture2D(SpecularMapTexture, Input.TextureCoordinate * SpecularUVRepeat);
|
||||
@@ -133,7 +138,7 @@ void main()
|
||||
tilePos.y = int(gl_FragCoord.y/TILE_SIZE);
|
||||
|
||||
LightResult totalLighting;
|
||||
totalLighting.Diffuse = vec4(AmbientColor.rgb, 1.0);
|
||||
totalLighting.Diffuse = vec4(AmbientColor.rgb * ao, 1.0);
|
||||
int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE)));
|
||||
|
||||
int start = int(LightGrids.Data[currentTile].Start);
|
||||
@@ -151,8 +156,8 @@ void main()
|
||||
} else if (light.Type == 2) { //Directional
|
||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||
}
|
||||
totalLighting.Diffuse += light_result.Diffuse;
|
||||
totalLighting.Specular += light_result.Specular;
|
||||
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
||||
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
||||
}
|
||||
|
||||
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
#version 430
|
||||
|
||||
#define MIN_AMBIENT_LIGHT 0.3
|
||||
|
||||
uniform mat4 M;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
@@ -23,19 +25,20 @@ uniform vec2 SpecularUVRepeat3;
|
||||
uniform vec2 GlowUVRepeat1;
|
||||
uniform vec2 GlowUVRepeat2;
|
||||
uniform vec2 GlowUVRepeat3;
|
||||
layout (binding = 0) uniform sampler2D SplatMapTexture;
|
||||
layout (binding = 1) uniform sampler2D DiffuseTexture1;
|
||||
layout (binding = 2) uniform sampler2D DiffuseTexture2;
|
||||
layout (binding = 3) uniform sampler2D DiffuseTexture3;
|
||||
layout (binding = 4) uniform sampler2D NormalMapTexture1;
|
||||
layout (binding = 5) uniform sampler2D NormalMapTexture2;
|
||||
layout (binding = 6) uniform sampler2D NormalMapTexture3;
|
||||
layout (binding = 7) uniform sampler2D SpecularMapTexture1;
|
||||
layout (binding = 8) uniform sampler2D SpecularMapTexture2;
|
||||
layout (binding = 9) uniform sampler2D SpecularMapTexture3;
|
||||
layout (binding = 10) uniform sampler2D GlowMapTexture1;
|
||||
layout (binding = 11) uniform sampler2D GlowMapTexture2;
|
||||
layout (binding = 12) uniform sampler2D GlowMapTexture3;
|
||||
layout (binding = 0) uniform sampler2D AOTexture;
|
||||
layout (binding = 1) uniform sampler2D SplatMapTexture;
|
||||
layout (binding = 2) uniform sampler2D DiffuseTexture1;
|
||||
layout (binding = 3) uniform sampler2D DiffuseTexture2;
|
||||
layout (binding = 4) uniform sampler2D DiffuseTexture3;
|
||||
layout (binding = 5) uniform sampler2D NormalMapTexture1;
|
||||
layout (binding = 6) uniform sampler2D NormalMapTexture2;
|
||||
layout (binding = 7) uniform sampler2D NormalMapTexture3;
|
||||
layout (binding = 8) uniform sampler2D SpecularMapTexture1;
|
||||
layout (binding = 9) uniform sampler2D SpecularMapTexture2;
|
||||
layout (binding = 10) uniform sampler2D SpecularMapTexture3;
|
||||
layout (binding = 11) uniform sampler2D GlowMapTexture1;
|
||||
layout (binding = 12) uniform sampler2D GlowMapTexture2;
|
||||
layout (binding = 13) uniform sampler2D GlowMapTexture3;
|
||||
|
||||
#define TILE_SIZE 16
|
||||
|
||||
@@ -174,6 +177,9 @@ vec4 CalcBlendedNormal(vec4 blendValue, sampler2D R, sampler2D G, sampler2D B,
|
||||
|
||||
void main()
|
||||
{
|
||||
float ao = texelFetch(AOTexture, ivec2(gl_FragCoord.xy), 0).r;
|
||||
ao = (clamp(1.0 - (1.0 - ao), 0.0, 1.0) + MIN_AMBIENT_LIGHT) / (1.0 + MIN_AMBIENT_LIGHT);
|
||||
|
||||
vec4 splatTexel = texture2D(SplatMapTexture, Input.TextureCoordinate);
|
||||
|
||||
vec4 diffuseTexel = CalcBlendedTexel(splatTexel, DiffuseTexture1, DiffuseTexture2, DiffuseTexture3,
|
||||
@@ -195,7 +201,7 @@ void main()
|
||||
tilePos.y = int(gl_FragCoord.y/TILE_SIZE);
|
||||
|
||||
LightResult totalLighting;
|
||||
totalLighting.Diffuse = vec4(AmbientColor.rgb, 1.0);
|
||||
totalLighting.Diffuse = vec4(AmbientColor.rgb * ao, 1.0);
|
||||
int currentTile = int(floor(gl_FragCoord.x/TILE_SIZE) + (floor(gl_FragCoord.y/TILE_SIZE) * int(ScreenDimensions.x/TILE_SIZE)));
|
||||
|
||||
int start = int(LightGrids.Data[currentTile].Start);
|
||||
@@ -213,8 +219,8 @@ void main()
|
||||
} else if (light.Type == 2) { //Directional
|
||||
light_result = CalcDirectionalLightSource(V * light.Direction, light.Color, light.Intensity, viewVec, normal);
|
||||
}
|
||||
totalLighting.Diffuse += light_result.Diffuse;
|
||||
totalLighting.Specular += light_result.Specular;
|
||||
totalLighting.Diffuse += vec4(light_result.Diffuse.rgb * ao, light_result.Diffuse.a);
|
||||
totalLighting.Specular += vec4(light_result.Specular.rgb * ao, light_result.Specular.a);
|
||||
}
|
||||
|
||||
vec4 color_result = mix((Color * diffuseTexel * DiffuseColor), Input.ExplosionColor, Input.ExplosionPercentageElapsed);
|
||||
|
||||
@@ -1,38 +1,37 @@
|
||||
#version 430
|
||||
|
||||
//Number of samples per pixel
|
||||
#define NUM_SAMPLES (24)
|
||||
uniform int uNumOfSamples;
|
||||
//#define NUM_SAMPLES (11)
|
||||
|
||||
//Number of turns around the cirle
|
||||
#define NUM_TURNS (7)
|
||||
uniform int uNumOfTurns;
|
||||
//#define NUM_TURNS (7)
|
||||
|
||||
uniform sampler2D ViewSpaceZ;
|
||||
layout (binding = 0) uniform sampler2D ViewSpaceZ;
|
||||
|
||||
uniform vec4 ProjInfo;
|
||||
uniform vec4 uProjInfo;
|
||||
|
||||
uniform float ProjScale;
|
||||
uniform float uProjScale;
|
||||
//#define ProjScale 500
|
||||
|
||||
uniform float Radius;
|
||||
uniform float uRadius;
|
||||
//#define Radius 1.0f
|
||||
|
||||
uniform float Bias;
|
||||
uniform float uBias;
|
||||
//#define Bias 0.012f
|
||||
|
||||
uniform float IntensityDivR6;
|
||||
uniform float uContrast;
|
||||
//#define IntensityDivR6 1
|
||||
|
||||
out vec4 fragmentColor;
|
||||
uniform float uIntensityScale;
|
||||
|
||||
vec3 reconstructVSPosition(vec2 ScreenSpaceCoord, float z){
|
||||
return vec3((ScreenSpaceCoord * ProjInfo.xy + ProjInfo.zw) * z, z);
|
||||
}
|
||||
out float AO;
|
||||
|
||||
vec3 getPosition(ivec2 ScreenSpaceCoord) {
|
||||
vec3 P;
|
||||
P.z = texelFetch(ViewSpaceZ, ScreenSpaceCoord, 0).r;
|
||||
vec3 getVSPosition(ivec2 ScreenSpaceCoord) {
|
||||
float z = texelFetch(ViewSpaceZ, ScreenSpaceCoord, 0).r;
|
||||
//Get the xy view space coordinates and add the z value from ViewSpaceZ buffer.
|
||||
return reconstructVSPosition(vec2(ScreenSpaceCoord) + vec2(0.5), P.z);
|
||||
return vec3((uProjInfo[0] + (ScreenSpaceCoord.x * uProjInfo[1])) * z, (uProjInfo[2] + (ScreenSpaceCoord.y * uProjInfo[3])) * z, z);
|
||||
}
|
||||
|
||||
vec3 getVSFaceNormal(vec3 ViewSpacePosition) {
|
||||
@@ -44,10 +43,10 @@ vec3 getVSFaceNormal(vec3 ViewSpacePosition) {
|
||||
|
||||
vec3 getSampleViewSpacePos(ivec2 ScreenSpaceCoord, int SampleIndex, float RotationAngle, float ScreenSpaceSampleRadius){
|
||||
// Pure Magic...
|
||||
float alpha = float(SampleIndex + 0.5) * (1.0 / NUM_SAMPLES);
|
||||
float alpha = float(SampleIndex) * (1.0 / uNumOfSamples);
|
||||
|
||||
// Angle to where to sample
|
||||
float angle = alpha * (NUM_TURNS * 6.28) + RotationAngle;
|
||||
float angle = alpha * (uNumOfTurns * 6.28) + RotationAngle;
|
||||
|
||||
//Lenght to were to sample
|
||||
ScreenSpaceSampleRadius = ScreenSpaceSampleRadius * alpha;
|
||||
@@ -57,50 +56,59 @@ vec3 getSampleViewSpacePos(ivec2 ScreenSpaceCoord, int SampleIndex, float Rotati
|
||||
// Get texel coordinate on where to sample by going screenSpaceSampleOffsetVecor direction in ScreenSpaceSampleRadius units from ScreenSpaceCoord (the point being shaded);
|
||||
ivec2 screenSpaceSampleTexel = ivec2(ScreenSpaceSampleRadius * screenSpaceSampleOffsetVecor) + ScreenSpaceCoord;
|
||||
|
||||
return getPosition(screenSpaceSampleTexel);
|
||||
return getVSPosition(screenSpaceSampleTexel);
|
||||
}
|
||||
|
||||
float Radius2 = Radius * Radius;
|
||||
|
||||
float sampleAO(ivec2 ScreenSpaceCoord, vec3 ShadedViewSpacePosition, vec3 ViewSpaceNormal, float ScreenSpaceSampleRadius, int SampleIndex, float RotationAngle) {
|
||||
|
||||
float sampleAO(ivec2 ScreenSpaceCoord, vec3 Origin, vec3 OriginNormal, float ScreenSpaceSampleRadius, int SampleIndex, float RotationAngle, float Radius) {
|
||||
float radius2 = Radius * Radius;
|
||||
vec3 sampleViewSpacePosition = getSampleViewSpacePos(ScreenSpaceCoord, SampleIndex, RotationAngle, ScreenSpaceSampleRadius);
|
||||
|
||||
vec3 sampleVector = ShadedViewSpacePosition - sampleViewSpacePosition;
|
||||
vec3 sampleVector = Origin - sampleViewSpacePosition;
|
||||
|
||||
// vv = sampleVectorLenght ^ 2
|
||||
float vv = dot(sampleVector, sampleVector);
|
||||
// vn = angle between sampleVector and Normal
|
||||
float vn = dot(sampleVector, ViewSpaceNormal);
|
||||
float vn = dot(sampleVector, OriginNormal);
|
||||
|
||||
const float epsilon = 0.01f;
|
||||
const float epsilon = 0.0001f;
|
||||
|
||||
// vv < radius2 if the vector is shorter then the radius;
|
||||
// vn - bias, offset the angle to reduse self occlusion.
|
||||
// epsilon is here to make divison by 0 impossible.
|
||||
return float(vv < Radius2) * max((vn - Bias) / (epsilon + vv), 0.0);
|
||||
//float f = max(Radius2 - vv, 0.0);
|
||||
//return f * f * f * max((vn - Bias) / (epsilon + vv), 0.0);
|
||||
return float(vv < radius2) * max((vn - uBias) / (epsilon + vv), 0.0);
|
||||
//float f = max(radius2 - vv, 0.0);
|
||||
//return f * f * f * max((vn - uBias) / (epsilon + vv), 0.0);
|
||||
}
|
||||
|
||||
|
||||
void main() {
|
||||
ivec2 originScreenCoord = ivec2(gl_FragCoord.xy);
|
||||
|
||||
vec3 origin = getPosition(originScreenCoord);
|
||||
vec3 origin = getVSPosition(originScreenCoord);
|
||||
|
||||
vec3 viewSpaceNormal = getVSFaceNormal(origin);
|
||||
float radius;
|
||||
if(origin.z < uRadius){
|
||||
radius = origin.z;
|
||||
} else {
|
||||
radius = uRadius;
|
||||
}
|
||||
|
||||
float screenSpaceSampleRadius = ProjScale * Radius / origin.z;
|
||||
|
||||
//Offset on what angle to start on so that not evry pixel start sampling in the same direction, AlchemyAO
|
||||
float rotationAngleOffset = (3 * originScreenCoord.x ^ originScreenCoord.y + originScreenCoord.x * originScreenCoord.y) * 10;
|
||||
vec3 originNormal = getVSFaceNormal(origin);
|
||||
|
||||
float screenSpaceSampleRadius = -uProjScale * radius / origin.z;
|
||||
|
||||
float rotationAngleOffset = 30 * originScreenCoord.x ^ originScreenCoord.y + 10 * originScreenCoord.x * originScreenCoord.y;
|
||||
|
||||
float sum = 0.0;
|
||||
for (int i = 0; i < NUM_SAMPLES; i++) {
|
||||
sum += sampleAO(originScreenCoord, origin, viewSpaceNormal, screenSpaceSampleRadius, i, rotationAngleOffset);
|
||||
for (int i = 0; i < uNumOfSamples; i++) {
|
||||
sum += sampleAO(originScreenCoord, origin, originNormal, screenSpaceSampleRadius, i, rotationAngleOffset, radius);
|
||||
}
|
||||
|
||||
float A = max(0.0, 1.0 - sum * (2.0f / NUM_SAMPLES));
|
||||
//fragmentColor= vec4(viewSpaceNormal, 1.0f);
|
||||
fragmentColor = vec4(A, A, A, 1.0f);
|
||||
//float A = max(0.0, 1.0 - sum * (2.0f / uNumOfSamples));
|
||||
float A = 1.0 - sum * (2.0f * uIntensityScale / float(uNumOfSamples));
|
||||
AO = clamp(pow(A, uContrast), 0.0f, 1.0f);
|
||||
//AO = vec4(originNormal, 1.0f);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#version 430
|
||||
|
||||
uniform sampler2D DepthBuffer;
|
||||
layout (binding = 0) uniform sampler2D DepthBuffer;
|
||||
uniform vec3 ClipInfo;
|
||||
|
||||
//out float depthLinear;
|
||||
out float depthLinear;
|
||||
//Just for Debug, should be depthLinear
|
||||
out vec4 fragmentColor;
|
||||
//out vec4 fragmentColor;
|
||||
void main() {
|
||||
float depthSample = texelFetch(DepthBuffer, ivec2(gl_FragCoord.xy), 0).r;
|
||||
float depthLinear = ClipInfo[0] / (ClipInfo[1] * depthSample + ClipInfo[2]);
|
||||
depthLinear = ClipInfo[0] / (ClipInfo[1] * depthSample + ClipInfo[2]);
|
||||
//float depthLinear = (NearClip) / ( -depthSample + 1.0f);
|
||||
fragmentColor = vec4(depthLinear, depthLinear, depthLinear, 1.0f);
|
||||
//fragmentColor = vec4(depthLinear, depthLinear, depthLinear, 1.0f);
|
||||
}
|
||||
@@ -7,8 +7,8 @@ uniform mat4 M;
|
||||
uniform mat4 V;
|
||||
uniform mat4 P;
|
||||
|
||||
layout (binding = 0) uniform sampler2D DiffuseTexture;
|
||||
layout (binding = 1) uniform sampler2D GlowMapTexture;
|
||||
layout (binding = 1) uniform sampler2D DiffuseTexture;
|
||||
layout (binding = 2) uniform sampler2D GlowMapTexture;
|
||||
|
||||
|
||||
in VertexData{
|
||||
|
||||
Reference in New Issue
Block a user