Physics Simulation & Visualization Tool 0.1
A C++ physics simulation engine with real-time 3D visualization
Loading...
Searching...
No Matches
ComputeShader.cpp
Go to the documentation of this file.
1#include "ComputeShader.h"
2#include <fstream>
3#include <sstream>
4
5ComputeShader::ComputeShader(const std::string& computePath, QOpenGLFunctions_4_5_Core* glFuncs)
6 : funcs(glFuncs)
7{
8 std::string source = loadFile(computePath);
9 unsigned int comp = compileShader(GL_COMPUTE_SHADER, source);
10
11 ID = funcs->glCreateProgram();
12 funcs->glAttachShader(ID, comp);
13 funcs->glLinkProgram(ID);
14
15 funcs->glDeleteShader(comp);
16}
17
19 funcs->glDeleteProgram(ID);
20 for (auto ssbo : ssboIDs) {
21 funcs->glDeleteBuffers(1, &ssbo);
22 }
23}
24
25void ComputeShader::use() const {
26 funcs->glUseProgram(ID);
27}
28
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);
34
35 GLint success;
36 funcs->glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
37 if (!success) {
38 char infoLog[512];
39 funcs->glGetShaderInfoLog(shader, 512, nullptr, infoLog);
40 std::cerr << "ERROR::COMPUTE_SHADER::COMPILATION_FAILED\n" << infoLog << std::endl;
41 }
42
43 return shader;
44}
45
46std::string ComputeShader::loadFile(const std::string &path) const {
47 std::ifstream file(path);
48 if (!file) {
49 std::cerr << "Error: Could not open file " << path << std::endl;
50 return "";
51 }
52 std::stringstream buffer;
53 buffer << file.rdbuf();
54 return buffer.str();
55}
56
57unsigned int ComputeShader::createSSBO(const void *data, unsigned int size, unsigned int bindingPoint) {
58 unsigned int ssbo;
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);
64 return ssbo;
65}
66
67void ComputeShader::dispatch(GLuint groupsX, GLuint groupsY, GLuint groupsZ) const {
68 funcs->glDispatchCompute(groupsX, groupsY, groupsZ);
69 funcs->glMemoryBarrier(GL_SHADER_STORAGE_BARRIER_BIT);
70}
71
72void ComputeShader::setBool(const std::string& name, bool value) const {
73 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), (int)value);
74}
75
76void ComputeShader::setInt(const std::string& name, int value) const {
77 funcs->glUniform1i(funcs->glGetUniformLocation(ID, name.c_str()), value);
78}
79
80void ComputeShader::setFloat(const std::string& name, float value) const {
81 funcs->glUniform1f(funcs->glGetUniformLocation(ID, name.c_str()), value);
82}
83
84void ComputeShader::setMat4(const std::string& name, const glm::mat4& mat) const {
85 funcs->glUniformMatrix4fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, GL_FALSE, &mat[0][0]);
86}
87
88void ComputeShader::setVec3(const std::string& name, const glm::vec3& vec) const {
89 funcs->glUniform3fv(funcs->glGetUniformLocation(ID, name.c_str()), 1, &vec[0]);
90}
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 use() const
void setInt(const std::string &name, int value) const