Program Listing for File RandomNumbers.cpp
↰ Return to documentation for file (Src/GraphicsEngineOpenGL/util/RandomNumbers.cpp
)
#include "util/RandomNumbers.hpp"
#include "hostDevice/bindings.hpp"
#include "hostDevice/host_device_shared.hpp"
#include "hostDevice/GlobalValues.hpp"
#include <random>
RandomNumbers::RandomNumbers()
{
generate_random_numbers();
glGenTextures(1, &random_number_id);
glBindTexture(GL_TEXTURE_2D, random_number_id);
// i think we won't need nearest option; so stick to linear
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);
// assuming full HD will be maximum resolution
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()
{
glActiveTexture(GL_TEXTURE0 + (GLenum)RANDOM_NUMBERS_SLOT);
glBindTexture(GL_TEXTURE_2D, random_number_id);
}
void RandomNumbers::generate_random_numbers()
{
random_number_data = std::shared_ptr<GLfloat[]>(new 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 index = (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); }