From 2f63ff0f5ea33068466293f514ec726e7ee99916 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 16 Nov 2025 11:56:07 +0100 Subject: [PATCH] remove memory fetch of vertex shader --- Shaders/Vertex.glsl | 11 ++--------- src/Main.cpp | 36 ++++++++++++++---------------------- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/Shaders/Vertex.glsl b/Shaders/Vertex.glsl index 165d3f2..7eb59e5 100644 --- a/Shaders/Vertex.glsl +++ b/Shaders/Vertex.glsl @@ -1,18 +1,11 @@ #version 460 core -layout(std430, binding = 3) buffer layoutName -{ - float data_SSBO[]; -}; - layout(location = 0) uniform mat4 viewMatrix; layout(location = 1) uniform mat4 projectionMatrix; -vec3 unpack(uint index) { - return vec3(data_SSBO[index * 3], data_SSBO[index * 3 + 1], data_SSBO[index * 3 + 2]); -} +layout(location = 0) in vec3 position; void main() { - gl_Position = projectionMatrix * viewMatrix * vec4(unpack(gl_InstanceID), 1.0); + gl_Position = projectionMatrix * viewMatrix * vec4(position, 1.0); } \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 21bd67f..ccb10a3 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -169,31 +169,22 @@ static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, i } } -static GLuint CreateDummyVAO() { + +static std::tuple CreateVAO() { GLuint vertexArray; glCreateVertexArrays(1, &vertexArray); GLuint vertexBuffer; glCreateBuffers(1, &vertexBuffer); - // Buffer with just one point - float vertices[] = {0.0f, 0.0f, 0.0f}; - glNamedBufferData(vertexBuffer, sizeof(vertices), vertices, GL_STATIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(float) * PARTICLE_COUNT * 3, nullptr, GL_DYNAMIC_DRAW); glVertexArrayVertexBuffer(vertexArray, 0, vertexBuffer, 0, sizeof(float) * 3); glEnableVertexArrayAttrib(vertexArray, 0); glVertexArrayAttribFormat(vertexArray, 0, 3, GL_FLOAT, GL_FALSE, 0); glVertexArrayAttribBinding(vertexArray, 0, 0); - return vertexArray; -} - -static void CreateGpuBuffer() { - GLuint ssbo; - glGenBuffers(1, &ssbo); - glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); - glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * 3 * PARTICLE_COUNT, nullptr, - GL_DYNAMIC_COPY); // sizeof(data) only works for statically sized C/C++ arrays. + return {vertexArray, vertexBuffer}; } static std::vector GetTransformMatrixBlended(float dt) { @@ -264,9 +255,7 @@ int main() { if (!window) return -1; - auto vertexArray = CreateDummyVAO(); - - CreateGpuBuffer(); + auto [vertexArray, vertexBuffer] = CreateVAO(); float lastTime = (float)glfwGetTime(); @@ -274,14 +263,17 @@ int main() { float secondsTimer = 0.0f; float animationTimer = 0.0f; - glBindVertexArray(vertexArray); - // ApplyTransforms(SIERPINSKI_TRIANGLE); s_T1 = GenRandomFractal(); s_T2 = GenRandomFractal(); glClearColor(0.4f, 0.4f, 0.4f, 1.0f); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, vertexBuffer); + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, vertexBuffer); + + glBindVertexArray(vertexArray); + while (!glfwWindowShouldClose(window)) { // ScopedTimer timer("Main Loop"); @@ -311,14 +303,14 @@ int main() { glUniformMatrix4fv(1, matricies.size(), false, glm::value_ptr(matricies[0])); glDispatchCompute(PARTICLE_COUNT / WORK_GROUP_SIZE, 1, 1); - + // Ensure all writes to the image are complete glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT); - + // Graphics glUseProgram(s_GraphicsShader); - glDrawArraysInstanced(GL_POINTS, 0, 1, PARTICLE_COUNT); + glDrawArrays(GL_POINTS, 0, PARTICLE_COUNT); glfwSwapBuffers(window); glfwPollEvents();