mirror of
https://github.com/JoeyDeVries/LearnOpenGL.git
synced 2026-01-30 20:13:22 +08:00
48 lines
1.6 KiB
GLSL
48 lines
1.6 KiB
GLSL
#version 330 core
|
|
|
|
// This shader performs upsampling on a texture,
|
|
// as taken from Call Of Duty method, presented at ACM Siggraph 2014.
|
|
|
|
// Remember to add bilinear minification filter for this texture!
|
|
// Remember to use a floating-point texture format (for HDR)!
|
|
// Remember to use edge clamping for this texture!
|
|
uniform sampler2D srcTexture;
|
|
uniform float filterRadius;
|
|
|
|
in vec2 texCoord;
|
|
layout (location = 0) out vec3 upsample;
|
|
|
|
void main()
|
|
{
|
|
// The filter kernel is applied with a radius, specified in texture
|
|
// coordinates, so that the radius will vary across mip resolutions.
|
|
float x = filterRadius;
|
|
float y = filterRadius;
|
|
|
|
// Take 9 samples around current texel:
|
|
// a - b - c
|
|
// d - e - f
|
|
// g - h - i
|
|
// === ('e' is the current texel) ===
|
|
vec3 a = texture(srcTexture, vec2(texCoord.x - x, texCoord.y + y)).rgb;
|
|
vec3 b = texture(srcTexture, vec2(texCoord.x, texCoord.y + y)).rgb;
|
|
vec3 c = texture(srcTexture, vec2(texCoord.x + x, texCoord.y + y)).rgb;
|
|
|
|
vec3 d = texture(srcTexture, vec2(texCoord.x - x, texCoord.y)).rgb;
|
|
vec3 e = texture(srcTexture, vec2(texCoord.x, texCoord.y)).rgb;
|
|
vec3 f = texture(srcTexture, vec2(texCoord.x + x, texCoord.y)).rgb;
|
|
|
|
vec3 g = texture(srcTexture, vec2(texCoord.x - x, texCoord.y - y)).rgb;
|
|
vec3 h = texture(srcTexture, vec2(texCoord.x, texCoord.y - y)).rgb;
|
|
vec3 i = texture(srcTexture, vec2(texCoord.x + x, texCoord.y - y)).rgb;
|
|
|
|
// Apply weighted distribution, by using a 3x3 tent filter:
|
|
// 1 | 1 2 1 |
|
|
// -- * | 2 4 2 |
|
|
// 16 | 1 2 1 |
|
|
upsample = e*4.0;
|
|
upsample += (b+d+f+h)*2.0;
|
|
upsample += (a+c+g+i);
|
|
upsample *= 1.0 / 16.0;
|
|
}
|