00001
00002
00003 #ifndef BLOOMEFFECT_H
00004 #define BLOOMEFFECT_H
00005
00006
00007 #include "CoreEngine.h"
00008 #include "DayNightCycle.h"
00009 #include "GPUProgram.h"
00010 #include "MathUtils.h"
00011 #include "RenderableObject.h"
00012 #include "Renderer.h"
00013
00014
00015 #define RENDER_TEXTURE_SIZE 128
00016
00017
00018 namespace pge {
00019
00020
00021 class BloomEffect : public IRenderableObject {
00022
00023 public:
00024
00025
00026
00027
00028
00030 BloomEffect(void) {
00031
00032 m_textureTarget[0] = createTexture2D(RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00033 m_textureTarget[1] = createTexture2D(RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00034 m_textureTarget[2] = createTexture2D(RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00035
00036 m_brightShader = new GPUProgram("../data/shader/brightpass_vs.txt", "../data/shader/brightpass_fs.txt");
00037 m_blurShader = new GPUProgram("../data/shader/blur_vs.txt", "../data/shader/blur_fs.txt");
00038 }
00039
00040
00041
00042
00043
00044
00045
00047 virtual ~BloomEffect(void) {
00048 glDeleteTextures(3, m_textureTarget);
00049
00050 if(m_brightShader != NULL) {
00051 delete m_brightShader;
00052 m_brightShader = NULL;
00053 }
00054 if(m_blurShader != NULL) {
00055 delete m_blurShader;
00056 m_blurShader = NULL;
00057 }
00058 }
00059
00060
00061
00062
00063
00064
00065
00066 bool init(void) {
00067 return true;
00068 }
00069
00070
00071
00072
00073
00074 void render(void) {
00075 renderEffect();
00076 }
00077
00078
00079
00080
00081
00082 int getTextureSize(void) {
00083 return RENDER_TEXTURE_SIZE;
00084 }
00085
00086
00087
00088
00089
00090 void renderEffect(void) {
00091 float alpha;
00092
00093
00094
00095 alpha = 0.2f;
00096
00097 if(alpha > 0.0f) {
00098
00099 glDisable(GL_DEPTH_TEST);
00100
00101
00102 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
00103 glEnable(GL_BLEND);
00104
00105 glColor4f(1.0f, 1.0f, 1.0f, alpha);
00106
00107 glEnable(GL_TEXTURE_2D);
00108 glBindTexture(GL_TEXTURE_2D, m_textureTarget[0]);
00109 glBegin(GL_QUADS);
00110 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
00111 glVertex2i(0, 0);
00112
00113 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
00114 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), 0);
00115
00116 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
00117 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), CoreEngine::getInstance()->getResolutionHeight());
00118
00119 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
00120 glVertex2i(0, CoreEngine::getInstance()->getResolutionHeight());
00121 glEnd();
00122
00123 glBindTexture(GL_TEXTURE_2D, m_textureTarget[1]);
00124 glBegin(GL_QUADS);
00125 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
00126 glVertex2i(0, 0);
00127
00128 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
00129 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), 0);
00130
00131 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
00132 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), CoreEngine::getInstance()->getResolutionHeight());
00133
00134 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
00135 glVertex2i(0, CoreEngine::getInstance()->getResolutionHeight());
00136 glEnd();
00137
00138 glBindTexture(GL_TEXTURE_2D, m_textureTarget[2]);
00139 glBegin(GL_QUADS);
00140 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
00141 glVertex2i(0, 0);
00142
00143 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
00144 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), 0);
00145
00146 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
00147 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), CoreEngine::getInstance()->getResolutionHeight());
00148
00149 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
00150 glVertex2i(0, CoreEngine::getInstance()->getResolutionHeight());
00151 glEnd();
00152
00153 glDisable(GL_BLEND);
00154 glEnable(GL_DEPTH_TEST);
00155
00156
00157 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00158 }
00159 }
00160
00161
00162
00163
00164
00165 void renderBlur(int textureIndex) {
00166 glEnable(GL_TEXTURE_2D);
00167 glBindTexture(GL_TEXTURE_2D, m_textureTarget[textureIndex]);
00168 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00169
00170 m_blurShader->bind();
00171 m_blurShader->passUniform1f("width", (float)RENDER_TEXTURE_SIZE);
00172 m_blurShader->passUniform1f("height", (float)RENDER_TEXTURE_SIZE);
00173
00174 glBegin(GL_QUADS);
00175 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
00176 glVertex2i(0, 0);
00177
00178 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
00179 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), 0);
00180
00181 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
00182 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), CoreEngine::getInstance()->getResolutionHeight());
00183
00184 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
00185 glVertex2i(0, CoreEngine::getInstance()->getResolutionHeight());
00186 glEnd();
00187
00188 m_blurShader->release();
00189 }
00190
00191
00192
00193
00194
00195 void renderBrightPass(void) {
00196
00197 glEnable(GL_TEXTURE_2D);
00198 glBindTexture(GL_TEXTURE_2D, m_textureTarget[0]);
00199 glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
00200 m_brightShader->bind();
00201 glBegin(GL_QUADS);
00202 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 0.0f);
00203 glVertex2i(0, 0);
00204
00205 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 0.0f);
00206 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), 0);
00207
00208 glMultiTexCoord2f(GL_TEXTURE0, 1.0f, 1.0f);
00209 glVertex2i(CoreEngine::getInstance()->getResolutionWidth(), CoreEngine::getInstance()->getResolutionHeight());
00210
00211 glMultiTexCoord2f(GL_TEXTURE0, 0.0f, 1.0f);
00212 glVertex2i(0, CoreEngine::getInstance()->getResolutionHeight());
00213 glEnd();
00214 m_brightShader->release();
00215 }
00216
00217
00218
00219
00220
00221 void prepareRendering(void) {
00222
00223
00224 renderToTexture(m_textureTarget[0], GL_RGB, RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00225
00226
00227 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00228
00229
00230 renderer::enter2DMode(0.0f, (float)CoreEngine::getInstance()->getResolutionWidth(), 0.0f, (float)CoreEngine::getInstance()->getResolutionHeight(), -1.0f, 1.0f);
00231
00232
00233 renderBrightPass();
00234
00235
00236 renderToTexture(m_textureTarget[0], GL_RGB, RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00237 renderBlur(0);
00238 renderToTexture(m_textureTarget[1], GL_RGB, RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00239 renderBlur(1);
00240 renderToTexture(m_textureTarget[2], GL_RGB, RENDER_TEXTURE_SIZE, RENDER_TEXTURE_SIZE);
00241
00242
00243 renderer::enter3DMode();
00244 }
00245
00246
00247
00248
00249
00250 void timer(unsigned int delay){
00251 }
00252
00253
00254 private:
00255
00256
00257
00258
00259
00260
00261
00262
00263 void renderToTexture(unsigned int textureTarget, unsigned int internalFormat, int width, int height) {
00264 glBindTexture(GL_TEXTURE_2D, textureTarget);
00265 glCopyTexImage2D(GL_TEXTURE_2D, 0, internalFormat, 0, 0, width, height, 0);
00266 }
00267
00268
00269
00270
00271
00272 unsigned int createTexture2D(int width, int height) {
00273 unsigned int *data;
00274 unsigned int tex;
00275
00276
00277
00278 data = new unsigned int[width * height * 3 * sizeof(int)];
00279 memset(data, 0, width * height * 3 * sizeof(int));
00280 glGenTextures(1, &tex);
00281 glBindTexture(GL_TEXTURE_2D, tex);
00282 glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
00283 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
00284 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
00285 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
00286 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
00287 delete [] data;
00288
00289 return tex;
00290 }
00291
00292
00293
00294
00295
00296
00297
00298 unsigned int m_textureTarget[10];
00299 GPUProgram *m_brightShader;
00300 GPUProgram *m_blurShader;
00301 };
00302 };
00303
00304 #endif