8 std::string source = loadFile(computePath);
9 unsigned int comp = compileShader(GL_COMPUTE_SHADER, source);
11 ID = funcs->glCreateProgram();
12 funcs->glAttachShader(ID, comp);
13 funcs->glLinkProgram(ID);
15 funcs->glDeleteShader(comp);
19 funcs->glDeleteProgram(ID);
20 for (
auto ssbo : ssboIDs) {
21 funcs->glDeleteBuffers(1, &ssbo);
26 funcs->glUseProgram(ID);
29unsigned int ComputeShader::compileShader(GLenum type,
const std::string& source)
const {
30 unsigned int shader = funcs->glCreateShader(type);
31 const char* src = source.c_str();
32 funcs->glShaderSource(shader, 1, &src,
nullptr);
33 funcs->glCompileShader(shader);
36 funcs->glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
39 funcs->glGetShaderInfoLog(shader, 512,
nullptr, infoLog);
40 std::cerr <<
"ERROR::COMPUTE_SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
46std::string ComputeShader::loadFile(
const std::string &path)
const {
47 std::ifstream file(path);
49 std::cerr <<
"Error: Could not open file " << path << std::endl;
52 std::stringstream buffer;
53 buffer << file.rdbuf();
59 funcs->glGenBuffers(1, &ssbo);
60 funcs->glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo);
61 funcs->glBufferData(GL_SHADER_STORAGE_BUFFER, size, data, GL_DYNAMIC_COPY);
62 funcs->glBindBufferBase(GL_SHADER_STORAGE_BUFFER, bindingPoint, ssbo);
63 ssboIDs.push_back(ssbo);
68 funcs->glDispatchCompute(groupsX, groupsY, groupsZ);
69 funcs->glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
73 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), (
int)value);
77 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), value);
81 funcs->glUniform1f(funcs->glGetUniformLocation(ID, name.c_str()), value);
85 funcs->glUniformMatrix4fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
89 funcs->glUniform3fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, &vec[0]);
unsigned int createSSBO(const void *data, unsigned int size, unsigned int bindingPoint)
void setVec3(const std::string &name, const glm::vec3 &vec) const
void setBool(const std::string &name, bool value) const
void setFloat(const std::string &name, float value) const
ComputeShader(const std::string &computePath, QOpenGLFunctions_4_5_Core *glFuncs)
void dispatch(unsigned int groupsX, unsigned int groupsY=1, unsigned int groupsZ=1) const
void setMat4(const std::string &name, const glm::mat4 &mat) const
void setInt(const std::string &name, int value) const