Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/TerrainRenderer.cpp
Show First 20 Lines • Show All 195 Lines • ▼ Show 20 Lines | for (size_t i = 0; i < visiblePatches.size(); ++i) | ||||
visiblePatches[i]->RenderSides(dummyShader); | visiblePatches[i]->RenderSides(dummyShader); | ||||
PROFILE_END("render terrain sides"); | PROFILE_END("render terrain sides"); | ||||
// switch on required client states | // switch on required client states | ||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
// render everything fullbright | // render everything fullbright | ||||
// set up texture environment for base pass | // set up texture environment for base pass | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
pglClientActiveTextureARB(GL_TEXTURE0); | glClientActiveTextureARB(GL_TEXTURE0); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
// Set alpha to 1.0 | // Set alpha to 1.0 | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_CONSTANT); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_CONSTANT); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | ||||
static const float one[4] = { 1.f, 1.f, 1.f, 1.f }; | static const float one[4] = { 1.f, 1.f, 1.f, 1.f }; | ||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, one); | glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, one); | ||||
PROFILE_START("render terrain base"); | PROFILE_START("render terrain base"); | ||||
CPatchRData::RenderBases(visiblePatches, CShaderDefines(), NULL, true, dummyShader); | CPatchRData::RenderBases(visiblePatches, CShaderDefines(), NULL, true, dummyShader); | ||||
PROFILE_END("render terrain base"); | PROFILE_END("render terrain base"); | ||||
// render blends | // render blends | ||||
// switch on the composite alpha map texture | // switch on the composite alpha map texture | ||||
(void)ogl_tex_bind(g_Renderer.m_hCompositeAlphaMap, 1); | (void)ogl_tex_bind(g_Renderer.m_hCompositeAlphaMap, 1); | ||||
// switch on second uv set | // switch on second uv set | ||||
pglClientActiveTextureARB(GL_TEXTURE1); | glClientActiveTextureARB(GL_TEXTURE1); | ||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
// setup additional texenv required by blend pass | // setup additional texenv required by blend pass | ||||
pglActiveTextureARB(GL_TEXTURE1); | glActiveTextureARB(GL_TEXTURE1); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_ONE_MINUS_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_ONE_MINUS_SRC_ALPHA); | ||||
// switch on blending | // switch on blending | ||||
glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
// no need to write to the depth buffer a second time | // no need to write to the depth buffer a second time | ||||
glDepthMask(0); | glDepthMask(0); | ||||
// The decal color array contains lighting data, which we don't want in this non-shader mode | // The decal color array contains lighting data, which we don't want in this non-shader mode | ||||
glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
// render blend passes for each patch | // render blend passes for each patch | ||||
PROFILE_START("render terrain blends"); | PROFILE_START("render terrain blends"); | ||||
CPatchRData::RenderBlends(visiblePatches, CShaderDefines(), NULL, true, dummyShader); | CPatchRData::RenderBlends(visiblePatches, CShaderDefines(), NULL, true, dummyShader); | ||||
PROFILE_END("render terrain blends"); | PROFILE_END("render terrain blends"); | ||||
// Disable second texcoord array | // Disable second texcoord array | ||||
pglClientActiveTextureARB(GL_TEXTURE1); | glClientActiveTextureARB(GL_TEXTURE1); | ||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
// Render terrain decals | // Render terrain decals | ||||
g_Renderer.BindTexture(1, 0); | g_Renderer.BindTexture(1, 0); | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
pglClientActiveTextureARB(GL_TEXTURE0); | glClientActiveTextureARB(GL_TEXTURE0); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | ||||
PROFILE_START("render terrain decals"); | PROFILE_START("render terrain decals"); | ||||
CDecalRData::RenderDecals(visibleDecals, CShaderDefines(), NULL, true, dummyShader); | CDecalRData::RenderDecals(visibleDecals, CShaderDefines(), NULL, true, dummyShader); | ||||
PROFILE_END("render terrain decals"); | PROFILE_END("render terrain decals"); | ||||
// Now apply lighting | // Now apply lighting | ||||
const CLightEnv& lightEnv = g_Renderer.GetLightEnv(); | const CLightEnv& lightEnv = g_Renderer.GetLightEnv(); | ||||
pglClientActiveTextureARB(GL_TEXTURE0); | glClientActiveTextureARB(GL_TEXTURE0); | ||||
glEnableClientState(GL_COLOR_ARRAY); // diffuse lighting colors | glEnableClientState(GL_COLOR_ARRAY); // diffuse lighting colors | ||||
// The vertex color is scaled by 0.5 to permit overbrightness without clamping. | // The vertex color is scaled by 0.5 to permit overbrightness without clamping. | ||||
// We therefore need to draw clamp((texture*lighting)*2.0), where 'texture' | // We therefore need to draw clamp((texture*lighting)*2.0), where 'texture' | ||||
// is what previous passes drew onto the framebuffer, and 'lighting' is the | // is what previous passes drew onto the framebuffer, and 'lighting' is the | ||||
// color computed by this pass. | // color computed by this pass. | ||||
// We can do that with blending by getting it to draw dst*src + src*dst: | // We can do that with blending by getting it to draw dst*src + src*dst: | ||||
glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); | glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR); | ||||
// Scale the ambient color by 0.5 to match the vertex diffuse colors | // Scale the ambient color by 0.5 to match the vertex diffuse colors | ||||
float terrainAmbientColor[4] = { | float terrainAmbientColor[4] = { | ||||
lightEnv.m_TerrainAmbientColor.X * 0.5f, | lightEnv.m_TerrainAmbientColor.X * 0.5f, | ||||
lightEnv.m_TerrainAmbientColor.Y * 0.5f, | lightEnv.m_TerrainAmbientColor.Y * 0.5f, | ||||
lightEnv.m_TerrainAmbientColor.Z * 0.5f, | lightEnv.m_TerrainAmbientColor.Z * 0.5f, | ||||
1.f | 1.f | ||||
}; | }; | ||||
CLOSTexture& losTexture = g_Renderer.GetScene().GetLOSTexture(); | CLOSTexture& losTexture = g_Renderer.GetScene().GetLOSTexture(); | ||||
int streamflags = STREAM_POS|STREAM_COLOR; | int streamflags = STREAM_POS|STREAM_COLOR; | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
// We're not going to use a texture here, but we have to have a valid texture | // We're not going to use a texture here, but we have to have a valid texture | ||||
// bound else the texture unit will be disabled. | // bound else the texture unit will be disabled. | ||||
// We should still have a bound splat texture from some earlier rendering, | // We should still have a bound splat texture from some earlier rendering, | ||||
// so assume that's still valid to use. | // so assume that's still valid to use. | ||||
// (TODO: That's a bit of an ugly hack.) | // (TODO: That's a bit of an ugly hack.) | ||||
// No shadows: (Ambient + Diffuse) * LOS | // No shadows: (Ambient + Diffuse) * LOS | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_ADD); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_CONSTANT); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | ||||
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); | glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, terrainAmbientColor); | ||||
losTexture.BindTexture(1); | losTexture.BindTexture(1); | ||||
pglClientActiveTextureARB(GL_TEXTURE1); | glClientActiveTextureARB(GL_TEXTURE1); | ||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
streamflags |= STREAM_POSTOUV1; | streamflags |= STREAM_POSTOUV1; | ||||
glMatrixMode(GL_TEXTURE); | glMatrixMode(GL_TEXTURE); | ||||
glLoadMatrixf(&losTexture.GetTextureMatrix()._11); | glLoadMatrixf(&losTexture.GetTextureMatrix()._11); | ||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_MODULATE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_ALPHA); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA_ARB, GL_REPLACE); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); | glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_ARB, GL_PREVIOUS); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_ARB, GL_SRC_ALPHA); | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
pglClientActiveTextureARB(GL_TEXTURE0); | glClientActiveTextureARB(GL_TEXTURE0); | ||||
PROFILE_START("render terrain streams"); | PROFILE_START("render terrain streams"); | ||||
CPatchRData::RenderStreams(visiblePatches, dummyShader, streamflags); | CPatchRData::RenderStreams(visiblePatches, dummyShader, streamflags); | ||||
PROFILE_END("render terrain streams"); | PROFILE_END("render terrain streams"); | ||||
glMatrixMode(GL_TEXTURE); | glMatrixMode(GL_TEXTURE); | ||||
glLoadIdentity(); | glLoadIdentity(); | ||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
// restore OpenGL state | // restore OpenGL state | ||||
g_Renderer.BindTexture(1, 0); | g_Renderer.BindTexture(1, 0); | ||||
pglClientActiveTextureARB(GL_TEXTURE1); | glClientActiveTextureARB(GL_TEXTURE1); | ||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
glMatrixMode(GL_TEXTURE); | glMatrixMode(GL_TEXTURE); | ||||
glLoadIdentity(); | glLoadIdentity(); | ||||
glMatrixMode(GL_MODELVIEW); | glMatrixMode(GL_MODELVIEW); | ||||
pglClientActiveTextureARB(GL_TEXTURE0); | glClientActiveTextureARB(GL_TEXTURE0); | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
glDepthMask(1); | glDepthMask(1); | ||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
Show All 10 Lines | |||||
#else | #else | ||||
ENSURE(m->phase == Phase_Render); | ENSURE(m->phase == Phase_Render); | ||||
std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | ||||
glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
pglActiveTextureARB(GL_TEXTURE0); | glActiveTextureARB(GL_TEXTURE0); | ||||
glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
glDepthMask(0); | glDepthMask(0); | ||||
glDisable(GL_DEPTH_TEST); | glDisable(GL_DEPTH_TEST); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); | ||||
▲ Show 20 Lines • Show All 302 Lines • ▼ Show 20 Lines | bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, int cullGroup, ShadowMap* shadow) | ||||
// Render normals and foam to a framebuffer if we're in fancy effects | // Render normals and foam to a framebuffer if we're in fancy effects | ||||
if (WaterMgr->m_WaterFancyEffects) | if (WaterMgr->m_WaterFancyEffects) | ||||
{ | { | ||||
// Save the post-processing framebuffer. | // Save the post-processing framebuffer. | ||||
GLint fbo; | GLint fbo; | ||||
glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &fbo); | glGetIntegerv(GL_FRAMEBUFFER_BINDING_EXT, &fbo); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, WaterMgr->m_FancyEffectsFBO); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, WaterMgr->m_FancyEffectsFBO); | ||||
glDisable(GL_BLEND); | glDisable(GL_BLEND); | ||||
glEnable(GL_DEPTH_TEST); | glEnable(GL_DEPTH_TEST); | ||||
glDepthFunc(GL_LEQUAL); | glDepthFunc(GL_LEQUAL); | ||||
glDisable(GL_CULL_FACE); | glDisable(GL_CULL_FACE); | ||||
// Overwrite waves that would be behind the ground. | // Overwrite waves that would be behind the ground. | ||||
CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("glsl/gui_solid", CShaderDefines()); | CShaderProgramPtr dummyShader = g_Renderer.GetShaderManager().LoadProgram("glsl/gui_solid", CShaderDefines()); | ||||
dummyShader->Bind(); | dummyShader->Bind(); | ||||
dummyShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); | dummyShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); | ||||
dummyShader->Uniform(str_color, 0.0f, 0.0f, 0.0f, 0.0f); | dummyShader->Uniform(str_color, 0.0f, 0.0f, 0.0f, 0.0f); | ||||
std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | std::vector<CPatchRData*>& visiblePatches = m->visiblePatches[cullGroup]; | ||||
for (size_t i = 0; i < visiblePatches.size(); ++i) | for (size_t i = 0; i < visiblePatches.size(); ++i) | ||||
{ | { | ||||
CPatchRData* data = visiblePatches[i]; | CPatchRData* data = visiblePatches[i]; | ||||
data->RenderWater(dummyShader, true, true); | data->RenderWater(dummyShader, true, true); | ||||
} | } | ||||
dummyShader->Unbind(); | dummyShader->Unbind(); | ||||
glEnable(GL_CULL_FACE); | glEnable(GL_CULL_FACE); | ||||
pglBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); | glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo); | ||||
} | } | ||||
glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
glEnable(GL_DEPTH_TEST); | glEnable(GL_DEPTH_TEST); | ||||
glDepthFunc(GL_LEQUAL); | glDepthFunc(GL_LEQUAL); | ||||
m->fancyWaterShader->Bind(); | m->fancyWaterShader->Bind(); | ||||
▲ Show 20 Lines • Show All 170 Lines • ▼ Show 20 Lines | #else | ||||
dummyShader->Unbind(); | dummyShader->Unbind(); | ||||
g_Renderer.BindTexture(1, 0); | g_Renderer.BindTexture(1, 0); | ||||
glDisable(GL_TEXTURE_GEN_S); | glDisable(GL_TEXTURE_GEN_S); | ||||
glDisable(GL_TEXTURE_GEN_T); | glDisable(GL_TEXTURE_GEN_T); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | ||||
pglActiveTextureARB(GL_TEXTURE0_ARB); | glActiveTextureARB(GL_TEXTURE0_ARB); | ||||
// Clean up the texture matrix and blend mode | // Clean up the texture matrix and blend mode | ||||
glDisable(GL_TEXTURE_GEN_S); | glDisable(GL_TEXTURE_GEN_S); | ||||
glDisable(GL_TEXTURE_GEN_T); | glDisable(GL_TEXTURE_GEN_T); | ||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | ||||
glDisable(GL_TEXTURE_2D); | glDisable(GL_TEXTURE_2D); | ||||
#endif | #endif | ||||
Show All 36 Lines |
Wildfire Games · Phabricator