Program Listing for File RandomNumbers.module.cpp#
↰ Return to documentation for file (Src/GraphicsEngineOpenGL/util/RandomNumbers.module.cpp)
module;
#include "host_device/GlobalValues.hpp"
#include "host_device/bindings.hpp"
#include <glad/glad.h>
#include <memory>
#include <random>
module kataglyphis.opengl.random_numbers;
RandomNumbers::RandomNumbers()
{
generate_random_numbers();
glGenTextures(1, &random_number_id);
glBindTexture(GL_TEXTURE_2D, random_number_id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA32F, MAX_RESOLUTION_X, MAX_RESOLUTION_Y, 0, GL_RGBA, GL_FLOAT, random_number_data.get());
glBindTexture(GL_TEXTURE_2D, 0);
}
void RandomNumbers::read() const
{
glActiveTexture(GL_TEXTURE0 + static_cast<GLenum>(RANDOM_NUMBERS_SLOT));
glBindTexture(GL_TEXTURE_2D, random_number_id);
}
void RandomNumbers::generate_random_numbers()
{
random_number_data = std::make_unique<GLfloat[]>(MAX_RESOLUTION_X * MAX_RESOLUTION_Y * 4);
std::mt19937_64 gen64(25121995);
std::uniform_real_distribution<float> dis(0, 1);
for (int i = 0; i < MAX_RESOLUTION_X; i++) {
for (int k = 0; k < MAX_RESOLUTION_Y; k++) {
const GLfloat random_offset[4] = { dis(gen64), dis(gen64), dis(gen64), dis(gen64) };
GLuint const index = static_cast<GLuint>((MAX_RESOLUTION_Y * i + k) * 4);
*(random_number_data.get() + index) = random_offset[0];
*(random_number_data.get() + index + 1) = random_offset[1];
*(random_number_data.get() + index + 2) = random_offset[2];
*(random_number_data.get() + index + 3) = random_offset[3];
}
}
}
RandomNumbers::~RandomNumbers() { glDeleteTextures(1, &random_number_id); }