diff --git a/shader/audio/resampler.comp b/shader/audio/resampler.comp index 22318fb..8df52bf 100644 --- a/shader/audio/resampler.comp +++ b/shader/audio/resampler.comp @@ -3,7 +3,7 @@ layout (local_size_x = 128, local_size_y = 1, local_size_z = 1) in; layout (r16i, binding = 0) readonly uniform iimageBuffer ImageIn; -layout (r16i, binding = 1) writeonly uniform iimageBuffer ImageOut; +layout (rg16i, binding = 1) writeonly uniform iimageBuffer ImageOut; layout (location = 0) uniform int GlobalOffset; layout (location = 1) uniform int WindowLength; @@ -14,14 +14,14 @@ void main() int offset = GlobalOffset + x * WindowLength; - float sum = 0; - //int sum = 0; + vec2 sum = vec2(0, 0); + float scale = 1.0 / float(WindowLength); for (int i = 0; i < WindowLength; i++) { ivec4 v = imageLoad(ImageIn, offset + i); - sum += float(abs(v.x)) * scale; - //sum = max(abs(v.x), sum); + float value = float(v.x); + sum += vec2(clamp(value, 0.0, 32767.0), clamp(value, -32768.0, 0.0)) * scale; } - imageStore(ImageOut, x, ivec4(int(sum))); + imageStore(ImageOut, x, ivec4(int(sum.x), int(sum.y), 0, 0)); } diff --git a/shader/audio/visualizer.frag b/shader/audio/visualizer.frag index 917c71e..b198c6c 100644 --- a/shader/audio/visualizer.frag +++ b/shader/audio/visualizer.frag @@ -6,21 +6,26 @@ in VS_OUT { layout (location = 0) out vec4 Color; -layout (r16i, binding = 0) readonly uniform iimageBuffer Image; +layout (rg16i, binding = 0) readonly uniform iimageBuffer Image; -float get_sample(int coordinate) +vec2 get_sample(int coordinate) { - int red = imageLoad(Image, coordinate).r; - return float(red) * (1.0 / 32768.0); + ivec2 v = imageLoad(Image, coordinate).xy; + return vec2(float(v.x), float(v.y)) * (1.0 / 32768.0); } void main() { - float value = get_sample(int(gl_FragCoord.x)); + vec2 v = get_sample(int(gl_FragCoord.x)); float y = -(fs_in.Texture.y * 2 - 1); - float c = float(abs(y) < abs(value)); + float c; + if (y > 0) { + c = float(y < v.x); + } else { + c = float(y > v.y); + } Color = vec4(c, 0, 0, 1); } diff --git a/src/audio/resampler.cpp b/src/audio/resampler.cpp index 7afee31..4fc167a 100644 --- a/src/audio/resampler.cpp +++ b/src/audio/resampler.cpp @@ -68,7 +68,7 @@ namespace audio::resampler { */ // output - int output_size = max_output_pixels * 2; + int output_size = max_output_pixels * 2 * 2; glGenBuffers(1, &output.buffer); glGenTextures(1, &output.texture); glBindBuffer(GL_TEXTURE_BUFFER, output.buffer); @@ -76,7 +76,7 @@ namespace audio::resampler { glBindBuffer(GL_TEXTURE_BUFFER, 0); glBindTexture(GL_TEXTURE_BUFFER, output.texture); - glTexBuffer(GL_TEXTURE_BUFFER, GL_R16I, output.buffer); + glTexBuffer(GL_TEXTURE_BUFFER, GL_RG16I, output.buffer); glBindTexture(GL_TEXTURE_BUFFER, 0); } @@ -130,7 +130,7 @@ namespace audio::resampler { GL_FALSE, 0, GL_WRITE_ONLY, - GL_R16I); + GL_RG16I); int groups = window::width / local_size; if (groups == 0) diff --git a/src/audio/visualizer.cpp b/src/audio/visualizer.cpp index 051ea8a..827c8a6 100644 --- a/src/audio/visualizer.cpp +++ b/src/audio/visualizer.cpp @@ -79,7 +79,7 @@ namespace audio::visualizer { GL_FALSE, 0, GL_READ_ONLY, - GL_R16I); + GL_RG16I); glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, (void *)0); }