diff --git a/Arona/entry/windows/main.cpp b/Arona/entry/windows/main.cpp index c5462fc..97df5cb 100644 --- a/Arona/entry/windows/main.cpp +++ b/Arona/entry/windows/main.cpp @@ -26,7 +26,7 @@ public: static float f = 0.0f; static int counter = 0; - // ImGui::DockSpaceOverViewport(); + ImGui::DockSpaceOverViewport(); ImGui::Begin("Hello, world!"); // Create a window called "Hello, world!" and append into it. @@ -35,17 +35,16 @@ public: ImGui::SliderFloat("float", &f, 0.0f, 1.0f); // Edit 1 float using a slider from 0.0f to 1.0f + // Buttons return true when clicked (most widgets return true when edited/activated) if (ImGui::Button("按钮")) - // Buttons return true when clicked (most widgets return true when edited/activated) counter++; + ImGui::SameLine(); ImGui::Text("counter = %d", counter); ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate); - if (!texture_) - texture_ = load_texture(R"(Z:\NanakoDisk\可爱二次元\IMG_2745(20230507-020428).JPG)"); - texture_->draw(); + render_target_->draw(); // const bool width_changed = ImGui::SliderInt("test_width", &width, 1, 1024); // const bool height_changed = ImGui::SliderInt("test_height", &height, 1, 1024); @@ -74,35 +73,42 @@ public: // drawer_ = create_pixel_shader_drawer(); // drawer_->init(128, 128, pixel_shader_); - return; - texture_ = create_texture(nullptr, width, height, vk::Format::eR8G8B8A8Unorm); + // texture_ = load_texture(R"(Z:\NanakoDisk\可爱二次元\35966078_p0_waifu2x_art_noise2_scale.png)"); + // return; - audio_samples_.create_storage(sizeof(float) * 1024); + render_target_ = create_render_target(width, height, vk::Format::eR8G8B8A8Unorm); + audio_samples_ = std::make_shared(); + param_ = std::make_shared(); + + audio_samples_->create_storage(sizeof(float) * 1024); float samples[1024] = {}; for (int i = 0; i < 1024; i++) { samples[i] = sinf(i * 0.1f); } - audio_samples_.update(samples, sizeof(samples)); + audio_samples_->update(samples, sizeof(float) * 1024); - param_.create_storage(sizeof(test_param)); + param_->create_storage(sizeof(test_param)); test_param param = {}; param.WaveColor = ImVec4(1.0f, 0.0f, 0.0f, 1.0f); param.BgColor = ImVec4(0.0f, 0.0f, 0.0f, 1.0f); param.LineUV = 0.5f; - param_.update(param); + param_->update(param); compute_pipeline pipeline; pipeline.set_shader(WAVEFORMCS_COMP, sizeof(WAVEFORMCS_COMP)); pipeline.add_storage_buffer(0, audio_samples_); pipeline.add_storage_buffer(1, param_); - pipeline.add_uniform_image(2, texture_); + pipeline.add_storage_image(2, render_target_); pipeline.create(); pipeline.dispatch(width, height, 1); } void shutdown() override { + render_target_ = nullptr; texture_ = nullptr; + audio_samples_ = nullptr; + param_ = nullptr; // compute_shader_ = nullptr; // pixel_shader_ = nullptr; @@ -112,16 +118,14 @@ public: private: bool show_another_window_ = true; - std::shared_ptr texture_ = nullptr; - std::shared_ptr drawer_ = nullptr; int width = 512; int height = 512; - std::shared_ptr render_target_ = nullptr; - buffer_vk audio_samples_; - buffer_vk param_; - buffer_vk result_; + std::shared_ptr render_target_ = nullptr; + std::shared_ptr texture_ = nullptr; + std::shared_ptr audio_samples_ = nullptr; + std::shared_ptr param_ = nullptr; }; int main(int argc, char* argv[]) { diff --git a/Arona/shader_src/WaveformCS.comp b/Arona/shader_src/WaveformCS.comp index 0e599f1..b75e44b 100644 --- a/Arona/shader_src/WaveformCS.comp +++ b/Arona/shader_src/WaveformCS.comp @@ -2,11 +2,6 @@ layout (local_size_x = 1,local_size_y = 1,local_size_z = 1) in; -vec4 lerp(vec4 a, vec4 b, float x) -{ - return a + x * (b - a); -} - layout (std430, binding = 0) buffer Samples { float AudioSamples[]; @@ -17,7 +12,12 @@ layout (std430, binding = 1) buffer Params vec4 BgColor; float LineUV; }; -layout (rgba8, binding = 2) writeonly uniform image2D Result; +layout (binding = 2) writeonly uniform image2D Result; + +vec4 lerp(vec4 a, vec4 b, float x) +{ + return a + x * (b - a); +} void main() { @@ -25,13 +25,13 @@ void main() ivec2 pos = ivec2(gl_GlobalInvocationID.xy); int X = pos.x; - int Y = pos.y; + int Y = pos.y; float height = size.y; float Top = AudioSamples[X * 2] + 1; // -1; - float Bottom = AudioSamples[X * 2 + 1] + 1; // 1; + float Bottom = AudioSamples[X * 2 + 1] + 1; // 1; Top = min(Top, 1); - Bottom = max(Bottom, 0); + Bottom = max(Bottom, 0); Top *= height; Top *= 0.5; Bottom *= height; @@ -39,9 +39,9 @@ void main() // (id.y >= Top && id.y <= Bottom) - float b1 = min(step(Top, Y), step(Y , Bottom)); - // (Y == height / 2) - float b2 = step(Y, height * LineUV) * step(height * LineUV, Y); - float b3 = max(b1, b2); + float b1 = min(step(Top, Y), step(Y , Bottom)); + // (Y == height / 2) + float b2 = step(Y, height * LineUV) * step(height * LineUV, Y); + float b3 = max(b1, b2); imageStore(Result, pos, lerp(BgColor, WaveColor, b3)); } diff --git a/AronaCore b/AronaCore index 45bd309..b996cf2 160000 --- a/AronaCore +++ b/AronaCore @@ -1 +1 @@ -Subproject commit 45bd309e8d58c19c81545a07e0d1faac68a5b771 +Subproject commit b996cf26bb7cfa5b690b46ae3d290ddcb5733b37