From 44f5ac32a68a617f93704d44c4339f7db13b323e Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Sat, 15 Dec 2018 23:09:32 +0100 Subject: Hacky D2Q9 BGK LBM on GPU using GLSL compute shaders Improvised on top of computicles's scaffolding. Works in a world where _works_ is defined as "displays stuff on screen that invokes thoughts of fluid movement". --- src/buffer/vertex/fluid_cell_buffer.cc | 33 ++++++++++++++++++++++++++ src/buffer/vertex/fluid_cell_buffer.h | 21 +++++++++++++++++ src/buffer/vertex/lattice_cell_buffer.cc | 40 ++++++++++++++++++++++++++++++++ src/buffer/vertex/lattice_cell_buffer.h | 19 +++++++++++++++ 4 files changed, 113 insertions(+) create mode 100644 src/buffer/vertex/fluid_cell_buffer.cc create mode 100644 src/buffer/vertex/fluid_cell_buffer.h create mode 100644 src/buffer/vertex/lattice_cell_buffer.cc create mode 100644 src/buffer/vertex/lattice_cell_buffer.h (limited to 'src/buffer/vertex') diff --git a/src/buffer/vertex/fluid_cell_buffer.cc b/src/buffer/vertex/fluid_cell_buffer.cc new file mode 100644 index 0000000..5056569 --- /dev/null +++ b/src/buffer/vertex/fluid_cell_buffer.cc @@ -0,0 +1,33 @@ +#include "fluid_cell_buffer.h" + +FluidCellBuffer::FluidCellBuffer(): + _data(3*128*128, GLfloat{}) { + glGenVertexArrays(1, &_array); + glGenBuffers(1, &_buffer); + + glBindVertexArray(_array); + glBindBuffer(GL_ARRAY_BUFFER, _buffer); + glBufferData( + GL_ARRAY_BUFFER, + _data.size() * sizeof(GLfloat), + _data.data(), + GL_DYNAMIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, nullptr); +} + +FluidCellBuffer::~FluidCellBuffer() { + glDeleteBuffers(1, &_buffer); + glDeleteVertexArrays(1, &_array); +} + +GLuint FluidCellBuffer::getBuffer() const { + return _buffer; +} + +void FluidCellBuffer::draw() const { + glBindVertexArray(_array); + glDrawArrays(GL_POINTS, 0, _data.size()); +} diff --git a/src/buffer/vertex/fluid_cell_buffer.h b/src/buffer/vertex/fluid_cell_buffer.h new file mode 100644 index 0000000..b2b880a --- /dev/null +++ b/src/buffer/vertex/fluid_cell_buffer.h @@ -0,0 +1,21 @@ +#pragma once + +#include + +#include + +class FluidCellBuffer { +private: + std::vector _data; + + GLuint _array; + GLuint _buffer; + +public: + FluidCellBuffer(); + ~FluidCellBuffer(); + + GLuint getBuffer() const; + + void draw() const; +}; diff --git a/src/buffer/vertex/lattice_cell_buffer.cc b/src/buffer/vertex/lattice_cell_buffer.cc new file mode 100644 index 0000000..7fb51d8 --- /dev/null +++ b/src/buffer/vertex/lattice_cell_buffer.cc @@ -0,0 +1,40 @@ +#include "lattice_cell_buffer.h" + +#include + +LatticeCellBuffer::LatticeCellBuffer(): + _data(9*128*128, GLfloat{1./9.}) { + glGenVertexArrays(1, &_array); + glGenBuffers(1, &_buffer); + + for (int x = 50; x < 128-50; x++) { + for (int y = 50; y < 128-50; y++) { + for ( int i = -1; i <= 1; ++i ) { + for ( int j = -1; j <= 1; ++j ) { + _data[9*128*y + 9*x + (i+1)*3 + j+1] = 1./128.; + } + } + } + } + + glBindVertexArray(_array); + glBindBuffer(GL_ARRAY_BUFFER, _buffer); + glBufferData( + GL_ARRAY_BUFFER, + _data.size() * sizeof(GLfloat), + _data.data(), + GL_DYNAMIC_DRAW + ); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 1, GL_FLOAT, GL_FALSE, 0, nullptr); +} + +LatticeCellBuffer::~LatticeCellBuffer() { + glDeleteBuffers(1, &_buffer); + glDeleteVertexArrays(1, &_array); +} + +GLuint LatticeCellBuffer::getBuffer() const { + return _buffer; +} diff --git a/src/buffer/vertex/lattice_cell_buffer.h b/src/buffer/vertex/lattice_cell_buffer.h new file mode 100644 index 0000000..c28319e --- /dev/null +++ b/src/buffer/vertex/lattice_cell_buffer.h @@ -0,0 +1,19 @@ +#pragma once + +#include + +#include + +class LatticeCellBuffer { +private: + std::vector _data; + + GLuint _array; + GLuint _buffer; + +public: + LatticeCellBuffer(); + ~LatticeCellBuffer(); + + GLuint getBuffer() const; +}; -- cgit v1.2.3