buffer mesh working

This commit is contained in:
2020-03-10 13:33:32 -04:00
parent a0803a3727
commit 54ea5dbd53
5 changed files with 35 additions and 66 deletions

View File

@@ -78,7 +78,7 @@ namespace cgl {
set_source(src); set_source(src);
if (!compile()) if (!compile())
throw shader_error(get_info_log()); throw shader_error<mode>(get_info_log());
} }
static shader<mode> file(const std::string &name) { static shader<mode> file(const std::string &name) {
@@ -188,7 +188,7 @@ namespace cgl {
attach(sh); attach(sh);
if (!link()) if (!link())
throw shader_error(get_info_log()); throw shader_error<mode>(get_info_log());
detach(sh); detach(sh);
} }

View File

@@ -15,6 +15,7 @@ public:
explicit gl_error(const char *string) : domain_error(string) {} explicit gl_error(const char *string) : domain_error(string) {}
}; };
template<GLenum mode>
class shader_error : public gl_error { class shader_error : public gl_error {
public: public:
explicit shader_error(const std::string &arg) : gl_error(arg) {} explicit shader_error(const std::string &arg) : gl_error(arg) {}
@@ -106,7 +107,7 @@ GLuint utilCompileFiles(const GLenum type, const std::vector<std::string> &files
if (getShaderCompileStatus(shader)) return shader; if (getShaderCompileStatus(shader)) return shader;
throw shader_error(getShaderInfoLog(shader)); throw shader_error<GL_VERTEX_SHADER>(getShaderInfoLog(shader));
} }
GLuint utilLinkProgram(const std::vector<GLuint> &shaders) { GLuint utilLinkProgram(const std::vector<GLuint> &shaders) {

View File

@@ -1,16 +0,0 @@
#version 430
layout(std140, binding=0) uniform globals {
mat4 proj;
float time;
};
layout(location=0) in vec4 pos;
out gl_PerVertex{
vec4 gl_Position;
};
void main() {
gl_Position = proj * pos;
}

View File

@@ -1,15 +0,0 @@
#version 430
layout(std140, binding=0) uniform globals {
mat4 proj;
float time;
};
out vec4 diffuse;
void main() {
vec3 hue = vec3(time) + vec3(0, 2, 4) * 3.1415 / 6.0;
vec3 rgb = cos(hue) * 0.3 + vec3(0.7);
diffuse = vec4(rgb, 1);
}

View File

@@ -30,34 +30,27 @@ struct Matrices {
template<unsigned N, class V> template<unsigned N, class V>
struct BufferMesh { struct BufferMesh {
GLenum mode; GLenum mode{};
std::shared_ptr<cgl::vertexarray> vao; cgl::vertexarray vao{};
std::shared_ptr<cgl::buffer<Primitive<N>>> ibo; cgl::buffer<Primitive<N>> ibo{};
std::shared_ptr<cgl::buffer<V>> vbo; cgl::buffer<V> vbo{};
BufferMesh() = delete; BufferMesh(GLenum mode) : mode(mode), vao(), ibo(), vbo() {}
BufferMesh(BufferMesh &) = delete; BufferMesh(BufferMesh &) = delete;
BufferMesh(BufferMesh &&) = delete; BufferMesh(BufferMesh &&) = delete;
explicit BufferMesh(
GLenum mode,
std::shared_ptr<cgl::vertexarray> vao,
std::shared_ptr<cgl::buffer<Primitive<N>>> ibo,
std::shared_ptr<cgl::buffer<V>> vbo
) : mode(mode), vao(vao), ibo(ibo), vbo(vbo) {}
void draw_deferred() { void draw_deferred() {
vao->bound([&]() { vao.bound([&]() {
glDrawArrays(GL_POINTS, 0, ibo->count() * N); glDrawArrays(GL_POINTS, 0, ibo.count() * N);
}); });
} }
void draw_direct() { void draw_direct() {
vao->bound([&]() { vao.bound([&]() {
ibo->bound(GL_ELEMENT_ARRAY_BUFFER, [&]() { ibo.bound(GL_ELEMENT_ARRAY_BUFFER, [&]() {
glDrawElements(mode, ibo->count() * N, GL_UNSIGNED_INT, nullptr); glDrawElements(mode, ibo.count() * N, GL_UNSIGNED_INT, nullptr);
}); });
}); });
} }
@@ -159,13 +152,8 @@ void run(GLFWwindow *window) {
auto group = tc::group::F4(); auto group = tc::group::F4();
auto wire_data = merge(poly_parts<2>(group)); auto wire_data = merge(poly_parts<2>(group));
BufferMesh<2, float> wires( auto wires = BufferMesh<2, float>(GL_LINES);
GL_LINES, wires.ibo.put(wire_data.prims);
std::make_shared<cgl::vertexarray>(),
std::make_shared<cgl::buffer<Primitive<2>>(wire_data.prims()),
std::make_shared<cgl::buffer<float>>()
);
// DirectMesh<2> wires(GL_LINES, wire_data);
const auto slice_dark = glm::vec3(.5, .3, .7); const auto slice_dark = glm::vec3(.5, .3, .7);
const auto slice_light = glm::vec3(.9, .9, .95); const auto slice_light = glm::vec3(.9, .9, .95);
@@ -173,18 +161,29 @@ void run(GLFWwindow *window) {
const auto slice_parts = poly_parts<4>(group); const auto slice_parts = poly_parts<4>(group);
auto slice_data = merge(slice_parts); auto slice_data = merge(slice_parts);
auto slice_colors = std::vector<glm::vec4>(slice_data.size()); auto slice_colors = std::vector<glm::vec3>(slice_data.size());
for (int i = 0, k = 0; i < slice_parts.size(); ++i) { for (int i = 0, k = 0; i < slice_parts.size(); ++i) {
auto fac = factor(i, slice_parts.size()); auto fac = factor(i, slice_parts.size());
glm::vec3 color = glm::mix(slice_dark, slice_light, fac); glm::vec3 color = glm::mix(slice_dark, slice_light, fac);
for (int j = 0; j < slice_parts[i].size(); ++j, ++k) { for (int j = 0; j < slice_parts[i].size(); ++j, ++k) {
slice_colors[k] = glm::vec4(color, 1); slice_colors[k] = color;
} }
} }
cgl::buffer<glm::vec4> slice_colors_buf(slice_colors);
// DeferredMesh<4> slices(slice_data, slice_colors_buf); BufferMesh<4, glm::vec3> slices(GL_POINTS);
slices.ibo.put(slice_data.prims);
slices.vbo.put(slice_colors);
slices.vao.bound([&]() {
slices.ibo.bound(GL_ARRAY_BUFFER, [&]() {
glEnableVertexAttribArray(0);
glVertexAttribIPointer(0, 4, GL_UNSIGNED_INT, 0, nullptr);
slices.vbo.bound(GL_ARRAY_BUFFER, [&]() {
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, nullptr);
});
});
});
auto vbo = cgl::buffer<glm::vec4>(points(group)); auto vbo = cgl::buffer<glm::vec4>(points(group));
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, vbo); glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 1, vbo);
@@ -207,12 +206,12 @@ void run(GLFWwindow *window) {
glProgramUniform3f(sh.solid, 2, 0.3, 0.3, 0.3); glProgramUniform3f(sh.solid, 2, 0.3, 0.3, 0.3);
proj_pipe.bound([&]() { proj_pipe.bound([&]() {
wires.draw(); wires.draw_direct();
}); });
// slice_pipe.bound([&]() { slice_pipe.bound([&]() {
// slices.draw(); slices.draw_deferred();
// }); });
glfwSwapInterval(2); glfwSwapInterval(2);
glfwSwapBuffers(window); glfwSwapBuffers(window);