summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Froehlich <Mathias.Froehlich@web.de>2011-02-01 21:04:58 +0100
committerMathias Froehlich <Mathias.Froehlich@web.de>2011-02-01 21:04:58 +0100
commitc6f3646d756bf4a1107f3e41470e598bd427e942 (patch)
tree90c0893455cce99ddf4cffa87442ade0ed738b6a
parentea51ea7230c08a3927dbbb1096eee501c542e5bd (diff)
x
-rw-r--r--Main.cpp267
1 files changed, 47 insertions, 220 deletions
diff --git a/Main.cpp b/Main.cpp
index ee4b29a..b5cef40 100644
--- a/Main.cpp
+++ b/Main.cpp
@@ -232,9 +232,21 @@ void loadData()
void precompute()
{
-// #define LOAD_TEXTURE
+#define LOAD_TEXTURE
// #define DUMP_TEXTURE
#ifdef LOAD_TEXTURE
+ vector<string> files;
+ files.push_back("Main.h");
+ files.push_back("common.glsl");
+ files.push_back("earth.glsl");
+ drawProg = loadProgram(files);
+ glUseProgram(drawProg);
+
+ void* pixels;
+ FILE* f;
+
+ glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
+
glActiveTexture(GL_TEXTURE0 + transmittanceUnit);
glGenTextures(1, &transmittanceTexture);
glBindTexture(GL_TEXTURE_2D, transmittanceTexture);
@@ -242,8 +254,15 @@ void precompute()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, TRANSMITTANCE_W, TRANSMITTANCE_H, 0, GL_RGB, GL_FLOAT, NULL);
+
+ pixels = malloc(sizeof(float)*3*TRANSMITTANCE_W*TRANSMITTANCE_H);
+ f = fopen("transmittanceTexture.bin", "rb");
+ fread(pixels, sizeof(float), 3*TRANSMITTANCE_W*TRANSMITTANCE_H, f);
+ fclose(f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, TRANSMITTANCE_W, TRANSMITTANCE_H, 0, GL_RGB, GL_FLOAT, pixels);
+ free(pixels);
+
+
glActiveTexture(GL_TEXTURE0 + irradianceUnit);
glGenTextures(1, &irradianceTexture);
@@ -252,8 +271,14 @@ void precompute()
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, SKY_W, SKY_H, 0, GL_RGB, GL_FLOAT, NULL);
+
+ pixels = malloc(sizeof(float)*3*SKY_W*SKY_H);
+ f = fopen("irradianceTexture.bin", "rb");
+ fread(pixels, sizeof(float), 3*SKY_W*SKY_H, f);
+ fclose(f);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, SKY_W, SKY_H, 0, GL_RGB, GL_FLOAT, pixels);
+ free(pixels);
+
glActiveTexture(GL_TEXTURE0 + inscatterUnit);
glGenTextures(1, &inscatterTexture);
@@ -263,224 +288,20 @@ void precompute()
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);
-
- glActiveTexture(GL_TEXTURE0 + deltaEUnit);
- glGenTextures(1, &deltaETexture);
- glBindTexture(GL_TEXTURE_2D, deltaETexture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, SKY_W, SKY_H, 0, GL_RGB, GL_FLOAT, NULL);
-
- glActiveTexture(GL_TEXTURE0 + deltaSRUnit);
- glGenTextures(1, &deltaSRTexture);
- glBindTexture(GL_TEXTURE_3D, deltaSRTexture);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);
-
- glActiveTexture(GL_TEXTURE0 + deltaSMUnit);
- glGenTextures(1, &deltaSMTexture);
- glBindTexture(GL_TEXTURE_3D, deltaSMTexture);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);
-
- glActiveTexture(GL_TEXTURE0 + deltaJUnit);
- glGenTextures(1, &deltaJTexture);
- glBindTexture(GL_TEXTURE_3D, deltaJTexture);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);
-
- vector<string> files;
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("transmittance.glsl");
- transmittanceProg = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("irradiance1.glsl");
- irradiance1Prog = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("inscatter1.glsl");
- inscatter1Prog = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("copyIrradiance.glsl");
- copyIrradianceProg = loadProgram(files);
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("copyInscatter1.glsl");
- copyInscatter1Prog = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("inscatterS.glsl");
- jProg = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("irradianceN.glsl");
- irradianceNProg = loadProgram(files);
-
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("inscatterN.glsl");
- inscatterNProg = loadProgram(files);
+ pixels = malloc(sizeof(float)*4*RES_MU_S*RES_NU*RES_MU*RES_R);
+ f = fopen("inscatterTexture.bin", "rb");
+ fread(pixels, sizeof(float), 4*RES_MU_S*RES_NU*RES_MU*RES_R, f);
+ fclose(f);
+ glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGBA, GL_FLOAT, pixels);
+ free(pixels);
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("copyInscatterN.glsl");
- copyInscatterNProg = loadProgram(files);
- files.clear();
- files.push_back("Main.h");
- files.push_back("common.glsl");
- files.push_back("earth.glsl");
- drawProg = loadProgram(files);
- glUseProgram(drawProg);
glUniform1i(glGetUniformLocation(drawProg, "reflectanceSampler"), reflectanceUnit);
glUniform1i(glGetUniformLocation(drawProg, "transmittanceSampler"), transmittanceUnit);
glUniform1i(glGetUniformLocation(drawProg, "irradianceSampler"), irradianceUnit);
glUniform1i(glGetUniformLocation(drawProg, "inscatterSampler"), inscatterUnit);
- cout << "precomputations..." << endl;
-
- glGenFramebuffersEXT(1, &fbo);
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
- glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
- glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
-
- // computes transmittance texture T (line 1 in algorithm 4.1)
- glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, transmittanceTexture, 0);
- glViewport(0, 0, TRANSMITTANCE_W, TRANSMITTANCE_H);
- glUseProgram(transmittanceProg);
- drawQuad();
-
- // computes irradiance texture deltaE (line 2 in algorithm 4.1)
- glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaETexture, 0);
- glViewport(0, 0, SKY_W, SKY_H);
- glUseProgram(irradiance1Prog);
- glUniform1i(glGetUniformLocation(irradiance1Prog, "transmittanceSampler"), transmittanceUnit);
- drawQuad();
-
- // computes single scattering texture deltaS (line 3 in algorithm 4.1)
- // Rayleigh and Mie separated in deltaSR + deltaSM
- glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaSRTexture, 0);
- glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, deltaSMTexture, 0);
- unsigned int bufs[2] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
- glDrawBuffers(2, bufs);
- glViewport(0, 0, RES_MU_S * RES_NU, RES_MU);
- glUseProgram(inscatter1Prog);
- glUniform1i(glGetUniformLocation(inscatter1Prog, "transmittanceSampler"), transmittanceUnit);
- for (int layer = 0; layer < RES_R; ++layer) {
- setLayer(inscatter1Prog, layer);
- drawQuad();
- }
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
- glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
-
- // copies deltaE into irradiance texture E (line 4 in algorithm 4.1)
- // glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, irradianceTexture, 0);
- // glViewport(0, 0, SKY_W, SKY_H);
- // glUseProgram(copyIrradianceProg);
- // glUniform1f(glGetUniformLocation(copyIrradianceProg, "k"), 0.0);
- // glUniform1i(glGetUniformLocation(copyIrradianceProg, "deltaESampler"), deltaEUnit);
- // drawQuad();
-
- // copies deltaS into inscatter texture S (line 5 in algorithm 4.1)
- glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, inscatterTexture, 0);
- glViewport(0, 0, RES_MU_S * RES_NU, RES_MU);
- glUseProgram(copyInscatter1Prog);
- glUniform1i(glGetUniformLocation(copyInscatter1Prog, "deltaSRSampler"), deltaSRUnit);
- glUniform1i(glGetUniformLocation(copyInscatter1Prog, "deltaSMSampler"), deltaSMUnit);
- for (int layer = 0; layer < RES_R; ++layer) {
- setLayer(copyInscatter1Prog, layer);
- drawQuad();
- }
-
-
- glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
-
- glFinish();
- cout << "ready." << endl;
-
-
-
-
-
-
- void* pixels;
- FILE* f;
-
- glActiveTexture(GL_TEXTURE0 + irradianceUnit);
- // glGenTextures(1, &irradianceTexture);
- // glBindTexture(GL_TEXTURE_2D, irradianceTexture);
- // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- // glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_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);
- // glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
-
- pixels = malloc(sizeof(float)*3*SKY_W*SKY_H);
- f = fopen("irradianceTexture.bin", "rb");
- fread(pixels, sizeof(float), 3*SKY_W*SKY_H, f);
- fclose(f);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F_ARB, SKY_W, SKY_H, 0, GL_RGB, GL_FLOAT, pixels);
- free(pixels);
-
- glActiveTexture(GL_TEXTURE0 + inscatterUnit);
- // glGenTextures(1, &inscatterTexture);
- // glBindTexture(GL_TEXTURE_3D, inscatterTexture);
- // glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- // glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- // glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
- // glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- // glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
- // glBindBuffer(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
-
- pixels = malloc(sizeof(float)*3*RES_MU_S*RES_NU*RES_MU*RES_R);
- f = fopen("inscatterTexture.bin", "rb");
- fread(pixels, sizeof(float), 3*RES_MU_S*RES_NU*RES_MU*RES_R, f);
- fclose(f);
- glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA16F_ARB, RES_MU_S * RES_NU, RES_MU, RES_R, 0, GL_RGB, GL_FLOAT, NULL);
- free(pixels);
-
-
-
-
-
- glUseProgram(drawProg);
#else
glActiveTexture(GL_TEXTURE0 + transmittanceUnit);
@@ -749,8 +570,15 @@ void precompute()
#ifdef DUMP_TEXTURE
void* pixels;
FILE* f;
+ glActiveTexture(GL_TEXTURE0 + transmittanceUnit);
+ pixels = malloc(sizeof(float)*3*TRANSMITTANCE_W*TRANSMITTANCE_H);
+ glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, pixels);
+ f = fopen("transmittanceTexture.bin", "wb");
+ fwrite(pixels, sizeof(float), 3*TRANSMITTANCE_W*TRANSMITTANCE_H, f);
+ fclose(f);
+ free(pixels);
+
glActiveTexture(GL_TEXTURE0 + irradianceUnit);
- // glBindTexture(GL_TEXTURE_2D, irradianceTexture);
pixels = malloc(sizeof(float)*3*SKY_W*SKY_H);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGB, GL_FLOAT, pixels);
f = fopen("irradianceTexture.bin", "wb");
@@ -759,11 +587,10 @@ void precompute()
free(pixels);
glActiveTexture(GL_TEXTURE0 + inscatterUnit);
- // glBindTexture(GL_TEXTURE_3D, inscatterTexture);
- pixels = malloc(sizeof(float)*3*RES_MU_S*RES_NU*RES_MU*RES_R);
- glGetTexImage(GL_TEXTURE_3D, 0, GL_RGB, GL_FLOAT, pixels);
+ pixels = malloc(sizeof(float)*4*RES_MU_S*RES_NU*RES_MU*RES_R);
+ glGetTexImage(GL_TEXTURE_3D, 0, GL_RGBA, GL_FLOAT, pixels);
f = fopen("inscatterTexture.bin", "wb");
- fwrite(pixels, sizeof(float), 3*RES_MU_S*RES_NU*RES_MU*RES_R, f);
+ fwrite(pixels, sizeof(float), 4*RES_MU_S*RES_NU*RES_MU*RES_R, f);
fclose(f);
free(pixels);
#endif