This file precomputes the atmosphere textures and saves them to disk. It also saves to disk the shaders necessary for the demo. For this a C++ Demo instance is created (which precomputes the textures and creates the shaders), its shaders and textures are read back using the OpenGL API, and are saved to disk:
#include <glad/glad.h> #include <GL/freeglut.h> #include <memory> #include <fstream> #include "atmosphere/demo/demo.h" #include "atmosphere/constants.h" using atmosphere::demo::Demo; void SaveShader(const GLuint shader, const std::string& filename) { GLint sourceLength; glGetShaderiv(shader, GL_SHADER_SOURCE_LENGTH, &sourceLength); GLsizei actualLength; std::unique_ptr<GLchar[]> buffer(new GLchar[sourceLength]); glGetShaderSource(shader, sourceLength, &actualLength, buffer.get()); std::ofstream output_stream(filename, std::ofstream::out); output_stream << std::string(buffer.get()); output_stream.close(); } void SaveTexture(const GLenum texture_unit, const GLenum texture_target, const int texture_size, const std::string& filename) { std::unique_ptr<float[]> pixels(new float[texture_size * 4]); glActiveTexture(texture_unit); glGetTexImage(texture_target, 0, GL_RGBA, GL_FLOAT, pixels.get()); std::ofstream output_stream( filename, std::ofstream::out | std::ofstream::binary); output_stream.write((const char*) pixels.get(), texture_size * 16); output_stream.close(); } int main(int argc, char** argv) { glutInitContextVersion(3, 3); glutInitContextProfile(GLUT_CORE_PROFILE); glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); std::unique_ptr<Demo> demo(new Demo(0, 0)); demo->model().SetProgramUniforms(demo->program(), 0, 1, 2); const std::string output_dir(argv[1]); SaveShader(demo->model().shader(), output_dir + "atmosphere_shader.txt"); SaveShader(demo->vertex_shader(), output_dir + "vertex_shader.txt"); SaveShader(demo->fragment_shader(), output_dir + "fragment_shader.txt"); SaveTexture( GL_TEXTURE0, GL_TEXTURE_2D, atmosphere::TRANSMITTANCE_TEXTURE_WIDTH * atmosphere::TRANSMITTANCE_TEXTURE_HEIGHT, output_dir + "transmittance.dat"); SaveTexture( GL_TEXTURE1, GL_TEXTURE_3D, atmosphere::SCATTERING_TEXTURE_WIDTH * atmosphere::SCATTERING_TEXTURE_HEIGHT * atmosphere::SCATTERING_TEXTURE_DEPTH, output_dir + "scattering.dat"); SaveTexture( GL_TEXTURE2, GL_TEXTURE_2D, atmosphere::IRRADIANCE_TEXTURE_WIDTH * atmosphere::IRRADIANCE_TEXTURE_HEIGHT, output_dir + "irradiance.dat"); return 0; }