diff --git a/worldeditor/bin/editor/materials/outline.shader b/worldeditor/bin/editor/materials/outline.shader index 30db40fc6..bea783f7b 100644 --- a/worldeditor/bin/editor/materials/outline.shader +++ b/worldeditor/bin/editor/materials/outline.shader @@ -9,17 +9,11 @@ #pragma flags -#define NO_INSTANCE +const int _instanceOffset = 0; #include "ShaderLayout.h" #include "Functions.h" -layout(binding = LOCAL) uniform Uniforms { - mat4 model; - vec4 color; - float width; -} uni; - layout(binding = UNIFORM) uniform sampler2D outlineMap; layout(location = 0) in vec4 _vertex; @@ -29,8 +23,10 @@ layout(location = 2) in vec4 _color; layout(location = 0) out vec4 rgb; void main(void) { - vec2 up = vec2(0.0, screenSizeNorm().y) * uni.width; - vec2 right = vec2(screenSizeNorm().x, 0.0) * uni.width; +#pragma instance + + vec2 up = vec2(0.0, screenSizeNorm().y) * width; + vec2 right = vec2(screenSizeNorm().x, 0.0) * width; float c = dot(texture(outlineMap, _uv0), vec4(1)); float t = dot(texture(outlineMap, _uv0 - up), vec4(1)); @@ -41,7 +37,7 @@ void main(void) { vec2 n = vec2(-(t - b), (r - l)); float v = (length( n ) > 0.1) ? 1.0 : 0.0; - rgb = vec4(uni.color.xyz, v); + rgb = vec4(color.xyz, v); } ]]> diff --git a/worldeditor/bin/engine/materials/Blur.shader b/worldeditor/bin/engine/materials/Blur.shader index b07894bb5..6566bb99d 100644 --- a/worldeditor/bin/engine/materials/Blur.shader +++ b/worldeditor/bin/engine/materials/Blur.shader @@ -12,19 +12,10 @@ #pragma flags -#define NO_INSTANCE +const int _instanceOffset = 0; #include "ShaderLayout.h" -layout(std140, binding = LOCAL) uniform InstanceData { - mat4 model; - vec2 direction; - vec2 size; - vec4 curve[8]; - int steps; - float threshold; -} uni; - layout(binding = UNIFORM) uniform sampler2D rgbMap; layout(location = 0) in vec4 _vertex; @@ -33,16 +24,18 @@ layout(location = 2) in vec4 _color; layout(location = 0) out vec4 rgb; -void main (void) { - vec4 sum = texture(rgbMap, _uv0) * uni.curve[0].x; - for(int i = 1; i < uni.steps; i++) { - vec2 offset = vec2(float(i)) * uni.size * uni.direction; +void main(void) { +#pragma instance + + vec4 sum = texture(rgbMap, _uv0) * curve[0].x; + for(int i = 1; i < steps; i++) { + vec2 offset = vec2(float(i)) * size * direction; int r = i / 4; int b = int(mod(4, i)); - sum += texture(rgbMap, _uv0 - offset) * uni.curve[r][b]; - sum += texture(rgbMap, _uv0 + offset) * uni.curve[r][b]; + sum += texture(rgbMap, _uv0 - offset) * curve[r][b]; + sum += texture(rgbMap, _uv0 + offset) * curve[r][b]; } - rgb = max(sum - uni.threshold, 0.0); + rgb = max(sum - threshold, 0.0); } ]]> diff --git a/worldeditor/bin/engine/materials/DOF.shader b/worldeditor/bin/engine/materials/DOF.shader index b129065a2..09ad8914d 100644 --- a/worldeditor/bin/engine/materials/DOF.shader +++ b/worldeditor/bin/engine/materials/DOF.shader @@ -13,19 +13,11 @@ #pragma flags -#define NO_INSTANCE +const int _instanceOffset = 0; #include "ShaderLayout.h" #include "Functions.h" -layout(std140, binding = LOCAL) uniform InstanceData { - mat4 model; - float focusDistance; - float focusScale; - float blurSize; - float skyDistance; -} uni; - layout(binding = UNIFORM) uniform sampler2D highMap; layout(binding = UNIFORM + 1) uniform sampler2D lowMap; layout(binding = UNIFORM + 2) uniform sampler2D depthMap; @@ -51,32 +43,34 @@ const vec2 circleOffsets[] = { const float radScale = 0.5f; const float goldenAngle = 2.39996323f; -float cocSize(float depth) { - float coc = clamp((depth - uni.focusDistance) * uni.focusScale, -1.0f, 1.0f); - return abs(coc) * uni.blurSize; +float cocSize(float depth, float focusDistance, float focusScale, float blurSize) { + float coc = clamp((depth - focusDistance) * focusScale, -1.0f, 1.0f); + return abs(coc) * blurSize; } void main(void) { +#pragma instance + color = texture(highMap, _uv0); float centerDepth = getLinearDepth(texture(depthMap, _uv0).x, nearClipPlane(), farClipPlane()); - if(centerDepth < uni.skyDistance) { - float centerSize = cocSize(centerDepth); + if(centerDepth < skyDistance) { + float centerSize = cocSize(centerDepth, focusDistance, focusScale, blurSize); float t = 1.0f; float radius = radScale; - for(float ang = 0.0f; radius < uni.blurSize; ang += goldenAngle) { + for(float ang = 0.0f; radius < blurSize; ang += goldenAngle) { vec2 tc = _uv0 + vec2(cos(ang), sin(ang)) * screenSizeNorm() * radius; vec3 sampleColor = texture(lowMap, tc).xyz; float sampleDepth = getLinearDepth(texture(depthMap, tc).x, nearClipPlane(), farClipPlane()); - float sampleSize = cocSize(sampleDepth); + float sampleSize = cocSize(sampleDepth, focusDistance, focusScale, blurSize); if(sampleDepth > centerDepth) { - sampleSize = clamp(sampleSize, 0.0, centerSize * 2.0f); + sampleSize = clamp(sampleSize, 0.0f, centerSize * 2.0f); } - float m = smoothstep(radius - 0.5, radius + 0.5, sampleSize); + float m = smoothstep(radius - 0.5f, radius + 0.5f, sampleSize); color.xyz += mix(color.xyz / t, sampleColor, m); t += 1.0f; diff --git a/worldeditor/bin/engine/materials/DirectLight.shader b/worldeditor/bin/engine/materials/DirectLight.shader index 3cee7224f..9e5aff0ca 100644 --- a/worldeditor/bin/engine/materials/DirectLight.shader +++ b/worldeditor/bin/engine/materials/DirectLight.shader @@ -27,16 +27,13 @@ layout(location = 3) in vec3 normal; layout(location = 4) in vec3 tangent; layout(location = 0) out vec4 _vertex; -layout(location = 1) flat out int _instanceOffset; -layout(location = 2) flat out mat4 _screenToWorld; +layout(location = 1) flat out mat4 _screenToWorld; + +const int _instanceOffset = 0; #include "ShaderLayout.h" void main(void) { - _instanceOffset = 0; - -#pragma instance - _vertex = vec4(vertex * 2.0, 1.0); _screenToWorld = cameraScreenToWorld(); gl_Position = _vertex; @@ -48,8 +45,9 @@ void main(void) { #pragma flags layout(location = 0) in vec4 _vertex; -layout(location = 1) flat in int _instanceOffset; -layout(location = 2) flat in mat4 _screenToWorld; +layout(location = 1) flat in mat4 _screenToWorld; + +const int _instanceOffset = 0; #include "ShaderLayout.h" #include "Functions.h" diff --git a/worldeditor/bin/engine/materials/SSAO.shader b/worldeditor/bin/engine/materials/SSAO.shader index 8d29c1497..209d3357b 100644 --- a/worldeditor/bin/engine/materials/SSAO.shader +++ b/worldeditor/bin/engine/materials/SSAO.shader @@ -13,7 +13,7 @@ #pragma flags -#define NO_INSTANCE +const int _instanceOffset = 0; #include "ShaderLayout.h" @@ -42,19 +42,11 @@ void main(void) { #pragma flags -#define NO_INSTANCE +const int _instanceOffset = 0; #include "ShaderLayout.h" #include "Functions.h" -layout(std140, binding = LOCAL) uniform InstanceData { - mat4 model; - float radius; - float bias; - float power; - vec3 samplesKernel[MAX_SAMPLE_COUNT]; -} uni; - layout(binding = UNIFORM) uniform sampler2D depthMap; layout(binding = UNIFORM + 1) uniform sampler2D normalsMap; layout(binding = UNIFORM + 2) uniform sampler2D noiseMap; @@ -66,6 +58,8 @@ layout(location = 2) flat in mat4 _projectionInv; layout(location = 0) out vec4 color; void main(void) { +#pragma instance + vec2 scale = vec2(screenSize().x / 4.0f, screenSize().y / 4.0f); float depth = texture(depthMap, _uv0).x; @@ -85,8 +79,8 @@ void main(void) { float ssao = 0.0f; for(int i = 0; i < MAX_SAMPLE_COUNT; i++) { - vec3 samp = tbn * uni.samplesKernel[i]; - samp = viewPos + samp * uni.radius; + vec3 samp = tbn * samplesKernel[i]; + samp = viewPos + samp * radius; vec4 offset = projectionMatrix() * vec4(samp, 1.0f); offset.xyz /= offset.w; @@ -95,8 +89,8 @@ void main(void) { float sampleDepth = texture(depthMap, offset.xy).x; sampleDepth = getWorld(_projectionInv, offset.xy, sampleDepth).z; - float rangeCheck = smoothstep(0.0f, 1.0f, uni.radius / abs(viewPos.z - sampleDepth)); - ssao += step(samp.z + uni.bias, sampleDepth) * rangeCheck; + float rangeCheck = smoothstep(0.0f, 1.0f, radius / abs(viewPos.z - sampleDepth)); + ssao += step(samp.z + bias, sampleDepth) * rangeCheck; } color = vec4(vec3(1.0f - ssao / MAX_SAMPLE_COUNT), 1.0f); return;