18 #include "precompiled.h"
39 : m_IsInitialised(false), m_PingFbo(0), m_PongFbo(0), m_PostProcEffect(L
"default"), m_ColourTex1(0), m_ColourTex2(0),
40 m_DepthTex(0), m_BloomFbo(0), m_BlurTex2a(0), m_BlurTex2b(0), m_BlurTex4a(0), m_BlurTex4b(0),
41 m_BlurTex8a(0), m_BlurTex8b(0), m_WhichBuffer(true)
89 #define GEN_BUFFER_RGBA(name, w, h) \
90 glGenTextures(1, (GLuint*)&name); \
91 glBindTexture(GL_TEXTURE_2D, name); \
92 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, \
93 GL_UNSIGNED_BYTE, 0); \
94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); \
95 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); \
96 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); \
97 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
116 #undef GEN_BUFFER_RGBA
121 glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8_EXT,
m_Width,
m_Height,
122 0, GL_DEPTH_STENCIL_EXT, GL_UNSIGNED_INT_24_8_EXT, 0);
123 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE,
125 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
126 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
127 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
128 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
130 glBindTexture(GL_TEXTURE_2D, 0);
135 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
136 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
m_ColourTex1, 0);
137 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
m_DepthTex, 0);
139 GLenum status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
140 if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
142 LOGWARNING(L
"Framebuffer object incomplete (A): 0x%04X", status);
146 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
147 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D,
m_ColourTex2, 0);
148 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
m_DepthTex, 0);
150 status = pglCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
151 if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
153 LOGWARNING(L
"Framebuffer object incomplete (B): 0x%04X", status);
157 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_BloomFbo);
166 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
173 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_BloomFbo);
174 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, outTex, 0);
178 defines.
Add(str_BLOOM_NOP, str_1);
180 g_Renderer.GetSystemShaderDefines(), defines);
185 GLuint renderedTex = inTex;
189 glBindTexture(GL_TEXTURE_2D, renderedTex);
190 pglGenerateMipmapEXT(GL_TEXTURE_2D);
191 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
192 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
193 glBindTexture(GL_TEXTURE_2D, 0);
195 shader->BindTexture(str_renderedTex, renderedTex);
197 glPushAttrib(GL_VIEWPORT_BIT);
198 glViewport(0, 0, inWidth / 2, inHeight / 2);
201 glColor4f(1.f, 1.f, 1.f, 1.f);
202 glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
203 glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
204 glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
205 glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
215 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_BloomFbo);
216 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tempTex, 0);
220 defines2.
Add(str_BLOOM_PASS_H, str_1);
222 g_Renderer.GetSystemShaderDefines(), defines2);
226 shader->BindTexture(str_renderedTex, inOutTex);
227 shader->Uniform(str_texSize, inWidth, inHeight, 0.0f, 0.0f);
229 glPushAttrib(GL_VIEWPORT_BIT);
230 glViewport(0, 0, inWidth, inHeight);
233 glColor4f(1.f, 1.f, 1.f, 1.f);
234 glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
235 glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
236 glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
237 glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
244 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_BloomFbo);
245 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, inOutTex, 0);
249 defines3.
Add(str_BLOOM_PASS_V, str_1);
250 tech =
g_Renderer.GetShaderManager().LoadEffect(str_bloom,
251 g_Renderer.GetSystemShaderDefines(), defines3);
254 shader = tech->GetShader();
257 shader->BindTexture(str_renderedTex, tempTex);
258 shader->Uniform(str_texSize, inWidth, inHeight, 0.0f, 0.0f);
260 glPushAttrib(GL_VIEWPORT_BIT);
261 glViewport(0, 0, inWidth, inHeight);
264 glColor4f(1.f, 1.f, 1.f, 1.f);
265 glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
266 glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
267 glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
268 glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
280 glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &originalFBO);
284 #define SCALE_AND_BLUR(tex1, tex2, temptex) \
285 ApplyBlurDownscale2x(tex1, tex2, width, height); \
288 ApplyBlurGauss(tex2, temptex, width, height);
295 #undef SCALE_AND_BLUR
297 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, originalFBO);
305 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
306 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
308 GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT, GL_COLOR_ATTACHMENT1_EXT };
309 pglDrawBuffers(1, buffers);
311 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
312 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
313 pglDrawBuffers(1, buffers);
321 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
322 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
326 pglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT,
m_PingFbo);
328 pglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT,
m_PongFbo);
330 pglBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0);
332 GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT, GL_NEAREST);
333 pglBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, 0);
335 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
344 if (name != L
"default")
346 CStrW n = L
"postproc/" + name;
358 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
360 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
362 glDisable(GL_DEPTH_TEST);
363 glDepthMask(GL_FALSE);
365 shaderTech1->BeginPass(pass);
378 shader->BindTexture(str_depthTex,
m_DepthTex);
384 shader->Uniform(str_width,
m_Width);
385 shader->Uniform(str_height,
m_Height);
395 glColor4f(1.f, 1.f, 1.f, 1.f);
396 glTexCoord2f(1.0, 1.0); glVertex2f(1,1);
397 glTexCoord2f(0.0, 1.0); glVertex2f(-1,1);
398 glTexCoord2f(0.0, 0.0); glVertex2f(-1,-1);
399 glTexCoord2f(1.0, 0.0); glVertex2f(1,-1);
404 shaderTech1->EndPass(pass);
406 glDepthMask(GL_TRUE);
407 glEnable(GL_DEPTH_TEST);
423 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
424 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
426 GLenum buffers[] = { GL_COLOR_ATTACHMENT0_EXT };
427 pglDrawBuffers(1, buffers);
429 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
430 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, 0, 0);
431 pglDrawBuffers(1, buffers);
433 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
434 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
436 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
437 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0);
448 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PongFbo);
449 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
m_DepthTex, 0);
451 pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT,
m_PingFbo);
452 pglFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D,
m_DepthTex, 0);
459 std::vector<CStrW> effects;
461 const VfsPath path(L
"shaders/effects/postproc/");
466 LOGERROR(L
"Error finding Post effects in '%ls'", path.
string().c_str());
469 for(
size_t i = 0; i < pathnames.size(); i++)
471 if (pathnames[i].Extension() != L
".xml")
474 effects.push_back(pathnames[i].Basename().
string());
478 effects.push_back(L
"default");
480 sort(effects.begin(), effects.end());
void Add(CStrIntern name, CStrIntern value)
Add a name and associated value to the map of defines.
CShaderTechniquePtr m_PostProcTech
CLightEnv g_LightEnv
File : World.cpp Project : engine Description : Contains the CWorld Class implementation.
void ApplyBlurGauss(GLuint inOutTex, GLuint tempTex, int inWidth, int inHeight)
shared_ptr< CShaderTechnique > CShaderTechniquePtr
std::vector< CStrW > GetPostEffects() const
#define GEN_BUFFER_RGBA(name, w, h)
void ApplyEffect(CShaderTechniquePtr &shaderTech1, int pass)
const String & string() const
CGame * g_Game
Globally accessible pointer to the CGame object.
Represents a mapping of name strings to value strings, for use with #if and #ifdef and similar condit...
void ReleaseRenderOutput()
CGameView * GetView()
Get the pointer to the game view object.
std::vector< VfsPath > VfsPaths
void ApplyBlurDownscale2x(GLuint inTex, GLuint outTex, int inWidth, int inHeight)
void CaptureRenderOutput()
shared_ptr< CShaderProgram > CShaderProgramPtr
Status GetPathnames(const PIVFS &fs, const VfsPath &path, const wchar_t *filter, VfsPaths &pathnames)
#define SCALE_AND_BLUR(tex1, tex2, temptex)
void LoadEffect(CStrW &name)
void SetPostEffect(CStrW name)