From 6a874a01bb5f9361bbaf47736f9518ae069ff80c Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sun, 9 Nov 2025 11:59:46 +0100 Subject: [PATCH] now in 3D --- Shaders/Compute.glsl | 28 ++++++++++++++++++++-------- Shaders/Vertex.glsl | 8 ++++++-- src/Main.cpp | 20 +++++++++++++++----- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/Shaders/Compute.glsl b/Shaders/Compute.glsl index a94ab8d..cfa3368 100644 --- a/Shaders/Compute.glsl +++ b/Shaders/Compute.glsl @@ -1,7 +1,7 @@ #version 460 core layout(std430, binding = 3) buffer layoutName { - vec2 o_Points[]; + float o_Points[]; }; layout(local_size_x = 64) in; @@ -16,23 +16,35 @@ highp float rand(vec2 co) return fract(sin(sn) * c); } +vec3 unpack(uint index) { + return vec3(o_Points[index * 3], o_Points[index * 3 + 1], o_Points[index * 3 + 2]); +} + +void store(vec3 vect, uint index) { + o_Points[index * 3] = vect.x; + o_Points[index * 3 + 1] = vect.y; + o_Points[index * 3 + 2] = vect.z; +} + void main() { const uint total = gl_NumWorkGroups.x * gl_WorkGroupSize.x; - uint currentPoint = gl_GlobalInvocationID.x; - uint index = uint(rand(o_Points[currentPoint] + currentPoint) * 69); - mat3 transformation; + uint currentIndex = gl_GlobalInvocationID.x; + vec3 currentPoint = unpack(currentIndex); + uint index = uint(rand(currentPoint.xy + currentPoint.z + currentIndex) * 69); + mat4 transformation; switch (index % 3) { case 0: - transformation = mat3(0.5, 0, 0, 0, 0.5, 0, 0, 0.36, 1); + transformation = mat4(0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0, 0.36, 0, 1); break; case 1: - transformation = mat3(0.5, 0, 0, 0, 0.5, 0, -0.5, -0.5, 1); + transformation = mat4(0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, -0.5, -0.5, 0, 1); break; case 2: - transformation = mat3(0.5, 0, 0, 0, 0.5, 0, 0.5, -0.5, 1); + transformation = mat4(0.5, 0, 0, 0, 0, 0.5, 0, 0, 0, 0, 0, 0, 0.5, -0.5, 0, 1); break; } - o_Points[currentPoint] = (transformation * vec3(o_Points[currentPoint], 1.0)).xy; + vec3 result = (transformation * vec4(currentPoint, 1.0)).xyz; + store(result, currentIndex); } \ No newline at end of file diff --git a/Shaders/Vertex.glsl b/Shaders/Vertex.glsl index d86e4b0..56fdf50 100644 --- a/Shaders/Vertex.glsl +++ b/Shaders/Vertex.glsl @@ -2,10 +2,14 @@ layout(std430, binding = 3) buffer layoutName { - vec2 data_SSBO[]; + float data_SSBO[]; }; +vec3 unpack(uint index) { + return vec3(data_SSBO[index * 3], data_SSBO[index * 3 + 1], data_SSBO[index * 3 + 2]); +} + void main() { - gl_Position = vec4(data_SSBO[gl_InstanceID], 0.0, 1.0); + gl_Position = vec4(unpack(gl_InstanceID), 1.0); } \ No newline at end of file diff --git a/src/Main.cpp b/src/Main.cpp index 34b6c2f..6488118 100644 --- a/src/Main.cpp +++ b/src/Main.cpp @@ -54,7 +54,7 @@ static void KeyCallback(GLFWwindow* window, int key, int scancode, int action, i if (key == GLFW_KEY_R) { s_ComputeShader = ReloadComputeShader(s_ComputeShader, s_ComputeShaderPath); s_GraphicsShader = ReloadGraphicsShader(s_GraphicsShader, s_VertexShaderPath, s_FragmentShaderPath); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * PARTICLE_COUNT * 2, nullptr, GL_DYNAMIC_COPY); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * PARTICLE_COUNT * 3, nullptr, GL_DYNAMIC_COPY); } } @@ -66,11 +66,11 @@ static GLuint CreateDummyVAO() { glCreateBuffers(1, &vertexBuffer); // Buffer with just one point - float vertices[] = {0.0f, 0.0f}; + float vertices[] = {0.0f, 0.0f, 0.0f}; glNamedBufferData(vertexBuffer, sizeof(vertices), vertices, GL_STATIC_DRAW); - glVertexArrayVertexBuffer(vertexArray, 0, vertexBuffer, 0, sizeof(float) * 2); + glVertexArrayVertexBuffer(vertexArray, 0, vertexBuffer, 0, sizeof(float) * 3); glEnableVertexArrayAttrib(vertexArray, 0); - glVertexArrayAttribFormat(vertexArray, 0, 2, GL_FLOAT, GL_FALSE, 0); + glVertexArrayAttribFormat(vertexArray, 0, 3, GL_FLOAT, GL_FALSE, 0); glVertexArrayAttribBinding(vertexArray, 0, 0); return vertexArray; @@ -81,7 +81,7 @@ static void CreateGpuBuffer() { glGenBuffers(1, &ssbo); glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 3, ssbo); - glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * 2 * PARTICLE_COUNT, nullptr, + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(float) * 3 * PARTICLE_COUNT, nullptr, GL_DYNAMIC_COPY); // sizeof(data) only works for statically sized C/C++ arrays. } @@ -174,6 +174,16 @@ int main() { glClear(GL_COLOR_BUFFER_BIT); glClearColor(0, 0, 0, 1); + // float positions[3 * PARTICLE_COUNT]; + // glGetBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, sizeof(float) * 3 * PARTICLE_COUNT, positions); + + // std::cout << "Positions :\n"; + // for (size_t i = 0; i < PARTICLE_COUNT; i++) + // { + // std::cout << "\t" << positions[i * 3] << " " << positions[i * 3 + 1] << " " << positions[i * 3 + 2] << "\n"; + // } + + fps++; }