From b66d918af80940674ef4a0180f8480d1dc8876c4 Mon Sep 17 00:00:00 2001 From: Gwendolyn Date: Wed, 3 May 2023 17:30:39 +0200 Subject: [PATCH] got SSBO working --- .gitignore | 2 + CMakeLists.txt | 11 ++++ main | Bin 0 -> 15416 bytes main.cpp | 162 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 175 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100755 main create mode 100644 main.cpp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9869d33 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.idea +/cmake-* diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..c49f8da --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.24) +project(shader-automaton) + +find_package(OpenGL REQUIRED) +find_package(GLEW REQUIRED) +find_package(glfw3 3.3 REQUIRED) + + + +add_executable(shader-automaton main.cpp) +target_link_libraries(shader-automaton PRIVATE OpenGL::GL GLEW::GLEW glfw) \ No newline at end of file diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..d5826754c326784229ed4efd11c991f32deaff6d GIT binary patch literal 15416 zcmeHOU2Ggz6~4Pp8i&^FO{u|2+GYd+B@|EWwPRdTll5=L;QZh?qDT$Hcz10t+8=j! zOg9BlOKG5?iUdLego>0PA@YJ0i3mmTvXN0B6%Q@&Q1OCQQppv6sVJxgDZ@E;&NmrP zHx=*z2+gr}zk9xWzI*SSnc123oPBCydNP?vC|H~Nh+;3B_L;17Tp5rCK~@c^4tjr3 zJ)rI)f0O3?{;Utw>)T7ojo2=H8zJkuxzPge_h|*h3K>~|9TQ#J(8H)G?)GT~#C#too$OkPczeKZ zo{{!e#`2@;gp!SuDbAto>O8K5rv9jFgX$%ea3=Wv}s+rLf^SXNJ#mCg4BPUdH zMKzg&KA{pD{G|94qK#wkqZg;0^&?N;`0|%tKJcNf_kZ`B)9W+GAKRJw702*)@R%IK z#vH$3+=myqe+Exd(0f`0evG(#Tkw;2;CX#Ui+EmBEB=Fb;FWDJl&clH?m9Kswv|0K zd)UqwYK4Vj-7VB+5090qmBOquS1R~@Eqj)h-8zj#`z|LVm7QXRm|VlL=Zh7mRD80a zsJrgwa}PblyK|7;a?o1Hk&?YW=5s!OXnJaN%+8qo0}9QIxu3QqN&AoXto|dHEJ6O) z2yy&f{_5B1ux(S{7H)Y*aVzUCaxfV_7jQoIZu9wza^8bqlL6CNzaKpO=0Tt5bA)pb z`&o#WLtS^h5aPqf(@P;UA=ZW^-_j7vh+?Ayk`-|N7 z>YC?ytnd57)Y%t5Wu1N5I(_5jvDt~fX5V$|-0-g{#_P&a`0Mj#=dP#qc*I{I#yYq8 zTMQ4s;dar~lia4Mw|Z-xyH+@GRgmHz*YW#5!?5?3b@rxp^^XUwt8cVfiEGx2x7_<^ zfG!!J-CLXQ+%k3ipIogP`W zIJtUzy{q%L+r0fe-m41~dxFNGt!Sorw4biuxaE0Qc;P2kb&SqwkVWo@EzUrkfj9$k z2I36F8Hh6wXCTf%oPjt4aR%ZH{P!}z&#M*-rBc;+qFO8ERbpq`f!(wmewLHI>3NS5 z_7Y|Z_rB(ND}-$P?2;|<+HDF#Fh;WL~3flxcRCjIa5X?0ofZozKB zENRg8>wB$ufB$a_>cF9UfEo$arK0QR|0yJBuVVir{t;@VRk!NS zg7NW(1P1Z#5q^w#nw2}X$>FJH$ZJ&>T_*lsl~NDOd4ltxM*Oy9w?f|ZVD$DB$0s`# z&MWX|n1>U>A89@n{O&^k?}WJTFrTEeHnN{C63_ESx0lZ&&O>y2uWEj~GP2YN*)?jX z)%LfH^9$lzt@F3U8}y1A?{FhZlAlVn<`oxao4KVWD$b^(%$~69$(fPE6Sg%zqwMid z9vL}2HKy!C(?>@~rtPDXlgB4!?b(sh=?SV0FXSE9p)&BJROFp6R_x_^As;F7&V~!M zr3gG)goI;QL31CwKF@JRXzajcjiNpN~5P4!f-@`=p7l`AWVEo|v zAlC`pw^4|;=>C6>*s$IZU4Wtk;PM0fUPPaj4&XZ@I}AFE_x*?-*GVAmOA#Mk{|`iu z{3}Bu1*7vt^*@g2)6fa-rv9)+_1CGBHxcs>8GbbI^S&FrWB-BpB{ldMmD4u(9T0w} z7LA7w{0(V4LwekgU+f{03~|19+Xw$U>fmDs^W#1XzdOY53;FnGgARFpojBfp=<)lb z=01*AYL5@WJM_ResVA(*{oK0fjX>!)paUjJ9M0R TrF-Aj`t$w1;9U_x#8v+QvQJ;z literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..d3a98af --- /dev/null +++ b/main.cpp @@ -0,0 +1,162 @@ +#include + +#include +#include +#include +#include +#include + +GLuint loadShader(const char *source, GLenum shader_type) { + GLuint shaderId = glCreateShader(shader_type); + GLint result = GL_FALSE; + int infoLogLength; + // Compile Vertex Shader + glShaderSource(shaderId, 1, &source, nullptr); + glCompileShader(shaderId); + glGetShaderiv(shaderId, GL_COMPILE_STATUS, &result); + glGetShaderiv(shaderId, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + std::vector VertexShaderErrorMessage(infoLogLength + 1); + glGetShaderInfoLog(shaderId, infoLogLength, nullptr, + &VertexShaderErrorMessage[0]); + printf("%s\n", &VertexShaderErrorMessage[0]); + exit(-1); + } + return shaderId; +} + +GLuint loadProgram(const std::vector &shaders) { + GLuint programId = glCreateProgram(); + for (const auto &item : shaders) { + glAttachShader(programId, item); + } + glLinkProgram(programId); + + GLint result = GL_FALSE; + int infoLogLength; + + glGetProgramiv(programId, GL_LINK_STATUS, &result); + glGetProgramiv(programId, GL_INFO_LOG_LENGTH, &infoLogLength); + if (infoLogLength > 0) { + std::vector ProgramErrorMessage(infoLogLength + 1); + glGetProgramInfoLog(programId, infoLogLength, nullptr, + &ProgramErrorMessage[0]); + printf("%s\n", &ProgramErrorMessage[0]); + } + return programId; +} + +static const char *vertex_shader = + "#version 460\n" + "layout(location = 0) in vec3 vertexPosition_modelspace;\n" + "out vec2 coord;\n" + "void main(){\n" + " gl_Position.xyz = vertexPosition_modelspace;\n" + " gl_Position.w = 1.0;\n" + " coord.xy = vertexPosition_modelspace.xy;\n" + "}"; + +static const char *fragment_shader = "#version 460\n" + "out vec3 color;\n" + "in vec2 coord;\n" + "layout (std430, binding = 2) restrict readonly buffer shader_data\n" + "{\n" + " int c[];\n" + "};\n" + + "void main(){\n" + " int x = int(255. * (coord.x + 1.) / 2.);" + " color = vec3(c[x]/255., 0.5,0.5);\n" + "}"; + +int main() { + glewExperimental = true; + if (!glfwInit()) { + fprintf(stderr, "Failed to initialize GLFW\n"); + return -1; + } + + glfwWindowHint(GLFW_SAMPLES, 0); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + GLFWwindow *window = + glfwCreateWindow(1024, 768, "Tutorial 01", nullptr, nullptr); + if (window == nullptr) { + fprintf(stderr, + "Failed to open GLFW window. If you have an Intel GPU, they are " + "not 3.3 compatible. Try the 2.1 version of the tutorials.\n"); + glfwTerminate(); + return -1; + } + glfwMakeContextCurrent(window); // Initialize GLEW + glewExperimental = true; // Needed in core profile + if (glewInit() != GLEW_OK) { + fprintf(stderr, "Failed to initialize GLEW\n"); + return -1; + } + + glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE); + + GLuint VertexArrayID; + glGenVertexArrays(1, &VertexArrayID); + glBindVertexArray(VertexArrayID); + const GLfloat g_vertex_buffer_data[] = { + -1.0f, -1.0f, 0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, + }; + GLuint vertexbuffer; + glGenBuffers(1, &vertexbuffer); + glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(g_vertex_buffer_data), + g_vertex_buffer_data, GL_STATIC_DRAW); + + GLuint programId = loadProgram({ + loadShader(vertex_shader, GL_VERTEX_SHADER), + loadShader(fragment_shader, GL_FRAGMENT_SHADER), + }); + + int c[256]; + + for (size_t i = 0; i < 256; ++i) { + c[i] = i; + } + + GLuint ssbo = 0; + glGenBuffers(1, &ssbo); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); + glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(int)*256, &c,GL_DYNAMIC_COPY); + glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0); + + unsigned int block_index = glGetProgramResourceIndex(programId, GL_SHADER_STORAGE_BLOCK, "shader_data"); + GLuint ssbo_binding_point_index = 2; + glBindBufferBase(GL_SHADER_STORAGE_BUFFER, ssbo_binding_point_index, ssbo); + glShaderStorageBlockBinding(programId, block_index, ssbo_binding_point_index); + + do { + glClear(GL_COLOR_BUFFER_BIT); + glUseProgram(programId); + + for (int & i : c) { + i = (i + 1) % 256; + } + + glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo); + GLvoid *p = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY); + std::memcpy(p, &c, sizeof(int) * 256); + glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); + + glEnableVertexAttribArray(0); + glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); + glDrawArrays(GL_TRIANGLES, 0,3); + glDisableVertexAttribArray(0); + + glfwSwapBuffers(window); + glfwPollEvents(); + + } // Check if the ESC key was pressed or the window was closed + while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS && + glfwWindowShouldClose(window) == 0); +} \ No newline at end of file