summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias Froehlich <Mathias.Froehlich@web.de>2011-09-11 08:38:57 +0200
committerMathias Froehlich <Mathias.Froehlich@web.de>2012-02-11 12:41:42 +0100
commit3dcd6deee87a4c42b7f401fa82c697d6839208f7 (patch)
treef61184a9325e154ad50d1c8d2428210cbf20f930
parent72ffd0ea808b879bb723beecc881681beaef6f36 (diff)
Provide a non geometry shader variant.
-rw-r--r--Main.cpp56
1 files changed, 54 insertions, 2 deletions
diff --git a/Main.cpp b/Main.cpp
index b6197dc..149b669 100644
--- a/Main.cpp
+++ b/Main.cpp
@@ -49,6 +49,10 @@
#include "mat4.h"
#include "Main.h"
+// #define NO_GEOMETRY_SHADER
+// #define LOAD_TEXTURE
+// #define DUMP_TEXTURE
+
using namespace std;
// ----------------------------------------------------------------------------
@@ -114,9 +118,11 @@ unsigned int loadProgram(const vector<string> &files)
string* s = loadFile(files[i]);
strs[i] = s;
lines[i + 1] = s->c_str();
+#ifndef NO_GEOMETRY_SHADER
if (strstr(lines[i + 1], "_GEOMETRY_") != NULL) {
geo = true;
}
+#endif
}
lines[0] = "#define _VERTEX_\n";
@@ -124,6 +130,7 @@ unsigned int loadProgram(const vector<string> &files)
glCompileShader(vertexShaderId);
printShaderLog(vertexShaderId);
+#ifndef NO_GEOMETRY_SHADER
if (geo) {
unsigned geometryShaderId = glCreateShader(GL_GEOMETRY_SHADER_EXT);
glAttachShader(programId, geometryShaderId);
@@ -135,6 +142,7 @@ unsigned int loadProgram(const vector<string> &files)
glProgramParameteriEXT(programId, GL_GEOMETRY_OUTPUT_TYPE_EXT, GL_TRIANGLE_STRIP);
glProgramParameteriEXT(programId, GL_GEOMETRY_VERTICES_OUT_EXT, 3);
}
+#endif
lines[0] = "#define _FRAGMENT_\n";
glShaderSource(fragmentShaderId, n + 1, lines, NULL);
@@ -232,8 +240,6 @@ void loadData()
void precompute()
{
-#define LOAD_TEXTURE
-// #define DUMP_TEXTURE
#ifdef LOAD_TEXTURE
vector<string> files;
files.push_back("Main.h");
@@ -454,13 +460,21 @@ void precompute()
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
// computes transmittance texture T (line 1 in algorithm 4.1)
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, transmittanceTexture, 0);
+#else
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, transmittanceTexture, 0);
+#endif
glViewport(0, 0, TRANSMITTANCE_W, TRANSMITTANCE_H);
glUseProgram(transmittanceProg);
drawQuad();
// computes irradiance texture deltaE (line 2 in algorithm 4.1)
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, deltaETexture, 0);
+#else
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaETexture, 0);
+#endif
glViewport(0, 0, SKY_W, SKY_H);
glUseProgram(irradiance1Prog);
glUniform1i(glGetUniformLocation(irradiance1Prog, "transmittanceSampler"), transmittanceUnit);
@@ -468,14 +482,20 @@ void precompute()
// computes single scattering texture deltaS (line 3 in algorithm 4.1)
// Rayleigh and Mie separated in deltaSR + deltaSM
+#ifndef NO_GEOMETRY_SHADER
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaSRTexture, 0);
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, deltaSMTexture, 0);
+#endif
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) {
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_3D, deltaSRTexture, 0, layer);
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_3D, deltaSMTexture, 0, layer);
+#endif
setLayer(inscatter1Prog, layer);
drawQuad();
}
@@ -483,7 +503,11 @@ void precompute()
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
// copies deltaE into irradiance texture E (line 4 in algorithm 4.1)
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, irradianceTexture, 0);
+#else
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, irradianceTexture, 0);
+#endif
glViewport(0, 0, SKY_W, SKY_H);
glUseProgram(copyIrradianceProg);
glUniform1f(glGetUniformLocation(copyIrradianceProg, "k"), 0.0);
@@ -491,12 +515,17 @@ void precompute()
drawQuad();
// copies deltaS into inscatter texture S (line 5 in algorithm 4.1)
+#ifndef NO_GEOMETRY_SHADER
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, inscatterTexture, 0);
+#endif
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) {
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_3D, inscatterTexture, 0, layer);
+#endif
setLayer(copyInscatter1Prog, layer);
drawQuad();
}
@@ -505,7 +534,9 @@ void precompute()
for (int order = 2; order <= 4; ++order) {
// computes deltaJ (line 7 in algorithm 4.1)
+#ifndef NO_GEOMETRY_SHADER
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaJTexture, 0);
+#endif
glViewport(0, 0, RES_MU_S * RES_NU, RES_MU);
glUseProgram(jProg);
glUniform1f(glGetUniformLocation(jProg, "first"), order == 2 ? 1.0 : 0.0);
@@ -514,12 +545,19 @@ void precompute()
glUniform1i(glGetUniformLocation(jProg, "deltaSRSampler"), deltaSRUnit);
glUniform1i(glGetUniformLocation(jProg, "deltaSMSampler"), deltaSMUnit);
for (int layer = 0; layer < RES_R; ++layer) {
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_3D, deltaJTexture, 0, layer);
+#endif
setLayer(jProg, layer);
drawQuad();
}
// computes deltaE (line 8 in algorithm 4.1)
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, deltaETexture, 0);
+#else
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaETexture, 0);
+#endif
glViewport(0, 0, SKY_W, SKY_H);
glUseProgram(irradianceNProg);
glUniform1f(glGetUniformLocation(irradianceNProg, "first"), order == 2 ? 1.0 : 0.0);
@@ -529,13 +567,18 @@ void precompute()
drawQuad();
// computes deltaS (line 9 in algorithm 4.1)
+#ifndef NO_GEOMETRY_SHADER
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, deltaSRTexture, 0);
+#endif
glViewport(0, 0, RES_MU_S * RES_NU, RES_MU);
glUseProgram(inscatterNProg);
glUniform1f(glGetUniformLocation(inscatterNProg, "first"), order == 2 ? 1.0 : 0.0);
glUniform1i(glGetUniformLocation(inscatterNProg, "transmittanceSampler"), transmittanceUnit);
glUniform1i(glGetUniformLocation(inscatterNProg, "deltaJSampler"), deltaJUnit);
for (int layer = 0; layer < RES_R; ++layer) {
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_3D, deltaSRTexture, 0, layer);
+#endif
setLayer(inscatterNProg, layer);
drawQuad();
}
@@ -545,7 +588,11 @@ void precompute()
glBlendFuncSeparate(GL_ONE, GL_ONE, GL_ONE, GL_ONE);
// adds deltaE into irradiance texture E (line 10 in algorithm 4.1)
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, irradianceTexture, 0);
+#else
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, irradianceTexture, 0);
+#endif
glViewport(0, 0, SKY_W, SKY_H);
glUseProgram(copyIrradianceProg);
glUniform1f(glGetUniformLocation(copyIrradianceProg, "k"), 1.0);
@@ -553,11 +600,16 @@ void precompute()
drawQuad();
// adds deltaS into inscatter texture S (line 11 in algorithm 4.1)
+#ifndef NO_GEOMETRY_SHADER
glFramebufferTextureEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, inscatterTexture, 0);
+#endif
glViewport(0, 0, RES_MU_S * RES_NU, RES_MU);
glUseProgram(copyInscatterNProg);
glUniform1i(glGetUniformLocation(copyInscatterNProg, "deltaSSampler"), deltaSRUnit);
for (int layer = 0; layer < RES_R; ++layer) {
+#ifdef NO_GEOMETRY_SHADER
+ glFramebufferTexture3DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_3D, inscatterTexture, 0, layer);
+#endif
setLayer(copyInscatterNProg, layer);
drawQuad();
}