From 8deeddffe047f16ee4bd224875dddc7112459711 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Kapu=C5=9Bci=C5=84ski?= Date: Thu, 10 Mar 2016 10:50:54 +0100 Subject: [PATCH] Corrected OpenGL 2.1 engine's error spam and added experimental terrain shadowing --- src/common/settings.cpp | 6 ++ src/graphics/engine/engine.cpp | 47 ++++++-- src/graphics/engine/engine.h | 4 + src/graphics/opengl/gl21device.cpp | 148 +------------------------- src/graphics/opengl/glframebuffer.cpp | 66 ++++++++---- src/graphics/opengl/glutil.cpp | 16 +++ src/graphics/opengl/glutil.h | 3 + 7 files changed, 113 insertions(+), 177 deletions(-) diff --git a/src/common/settings.cpp b/src/common/settings.cpp index 519b3172..11bc3a73 100644 --- a/src/common/settings.cpp +++ b/src/common/settings.cpp @@ -110,6 +110,9 @@ void CSettings::SaveSettings() GetConfigFile().SetIntProperty("Setup", "ShadowMappingResolution", engine->GetShadowMappingOffscreen() ? engine->GetShadowMappingOffscreenResolution() : 0); + // Experimental settings + GetConfigFile().SetBoolProperty("Experimental", "TerrainShadows", engine->GetTerrainShadows()); + CInput::GetInstancePointer()->SaveKeyBindings(); @@ -264,6 +267,9 @@ void CSettings::LoadSettings() } } + if (GetConfigFile().GetBoolProperty("Experimental", "TerrainShadows", bValue)) + engine->SetTerrainShadows(bValue); + CInput::GetInstancePointer()->LoadKeyBindings(); diff --git a/src/graphics/engine/engine.cpp b/src/graphics/engine/engine.cpp index c6296d5f..04f86c79 100644 --- a/src/graphics/engine/engine.cpp +++ b/src/graphics/engine/engine.cpp @@ -139,6 +139,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils) m_offscreenShadowRendering = true; m_offscreenShadowRenderingResolution = 1024; m_qualityShadows = true; + m_terrainShadows = false; m_shadowRange = 0.0f; m_multisample = 2; @@ -2940,7 +2941,7 @@ int CEngine::GetShadowMappingOffscreenResolution() bool CEngine::IsShadowMappingQualitySupported() { - return IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 6; + return IsShadowMappingSupported() && m_device->GetMaxTextureStageCount() >= 3; } void CEngine::SetShadowMappingQuality(bool value) @@ -2954,6 +2955,16 @@ bool CEngine::GetShadowMappingQuality() return m_qualityShadows; } +void CEngine::SetTerrainShadows(bool value) +{ + m_terrainShadows = value; +} + +bool CEngine::GetTerrainShadows() +{ + return m_terrainShadows; +} + void CEngine::SetBackForce(bool present) { m_backForce = present; @@ -3096,7 +3107,6 @@ void CEngine::Render() color = m_backgroundColorDown; m_device->SetClearColor(color); - // Render shadow map if (m_drawWorld && m_shadowMapping) RenderShadowMap(); @@ -3133,7 +3143,6 @@ void CEngine::Draw3DScene() DrawPlanet(); // draws the planets m_cloud->Draw(); // draws the clouds - // Display the objects m_device->SetRenderState(RENDER_STATE_DEPTH_TEST, true); @@ -3365,7 +3374,6 @@ void CEngine::Draw3DScene() void CEngine::RenderShadowMap() { - m_shadowMapping = m_shadowMapping && m_device->IsShadowMappingSupported(); m_offscreenShadowRendering = m_offscreenShadowRendering && m_device->IsFramebufferSupported(); m_offscreenShadowRenderingResolution = Math::Min(m_offscreenShadowRenderingResolution, m_device->GetMaxTextureSize()); @@ -3438,11 +3446,9 @@ void CEngine::RenderShadowMap() m_device->SetRenderState(RENDER_STATE_FOG, false); m_device->SetRenderState(RENDER_STATE_CULLING, false); m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true); - m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, false); m_device->SetAlphaTestFunc(COMP_FUNC_GREATER, 0.5f); m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, true); m_device->SetDepthBias(2.0f, 8.0f); - m_device->SetViewport(0, 0, m_shadowMap.size.x, m_shadowMap.size.y); // recompute matrices @@ -3494,11 +3500,30 @@ void CEngine::RenderShadowMap() if (!m_objects[objRank].used) continue; - if (m_objects[objRank].type == ENG_OBJTYPE_TERRAIN) - continue; + bool terrain = (m_objects[objRank].type == ENG_OBJTYPE_TERRAIN); + + if (terrain) + { + if (m_terrainShadows) + { + m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); + m_device->SetRenderState(RENDER_STATE_CULLING, true); + m_device->SetCullMode(CULL_CCW); + } + else + continue; + } + else + { + m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, true); + m_device->SetRenderState(RENDER_STATE_CULLING, false); + } m_device->SetTransform(TRANSFORM_WORLD, m_objects[objRank].transform); + if (!IsVisible(objRank)) + continue; + int baseObjRank = m_objects[objRank].baseObjRank; if (baseObjRank == -1) continue; @@ -3518,6 +3543,7 @@ void CEngine::RenderShadowMap() for (int l3 = 0; l3 < static_cast(p2.next.size()); l3++) { EngineBaseObjDataTier& p3 = p2.next[l3]; + DrawObject(p3); } } @@ -3526,6 +3552,8 @@ void CEngine::RenderShadowMap() m_device->SetRenderState(RENDER_STATE_DEPTH_BIAS, false); m_device->SetDepthBias(0.0f, 0.0f); m_device->SetRenderState(RENDER_STATE_ALPHA_TEST, false); + m_device->SetRenderState(RENDER_STATE_CULLING, false); + m_device->SetCullMode(CULL_CW); if (m_offscreenShadowRendering) // shadow map texture already have depth information, just unbind it { @@ -3557,7 +3585,8 @@ void CEngine::UseShadowMapping(bool enable) { m_device->SetShadowColor(m_shadowColor); m_device->SetTransform(TRANSFORM_SHADOW, m_shadowTextureMat); - m_device->SetTexture(TEXTURE_SHADOW, m_shadowMap.id); + m_device->SetTexture(TEXTURE_SHADOW, m_shadowMap); + m_device->SetTextureStageWrap(TEXTURE_SHADOW, TEX_WRAP_CLAMP_TO_BORDER, TEX_WRAP_CLAMP_TO_BORDER); m_device->SetRenderState(RENDER_STATE_SHADOW_MAPPING, true); } else diff --git a/src/graphics/engine/engine.h b/src/graphics/engine/engine.h index 33bf412a..73ea73ee 100644 --- a/src/graphics/engine/engine.h +++ b/src/graphics/engine/engine.h @@ -1095,6 +1095,8 @@ public: bool IsShadowMappingQualitySupported(); void SetShadowMappingQuality(bool value); bool GetShadowMappingQuality(); + void SetTerrainShadows(bool value); + bool GetTerrainShadows(); //@} //@{ @@ -1420,6 +1422,8 @@ protected: int m_offscreenShadowRenderingResolution; //! true enables higher quality shadows bool m_qualityShadows; + //! true enables casting shadows by terrain + bool m_terrainShadows; //! Shadow color float m_shadowColor; //! Shadow range diff --git a/src/graphics/opengl/gl21device.cpp b/src/graphics/opengl/gl21device.cpp index fc58105e..a2bf9623 100644 --- a/src/graphics/opengl/gl21device.cpp +++ b/src/graphics/opengl/gl21device.cpp @@ -1194,142 +1194,6 @@ void CGL21Device::UpdateTextureParams(int index) else if (params.wrapT == TEX_WRAP_REPEAT) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); else assert(false); - - glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, params.factor.Array()); - - // To save some trouble - if ( (params.colorOperation == TEX_MIX_OPER_DEFAULT) && - (params.alphaOperation == TEX_MIX_OPER_DEFAULT) ) - { - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); - goto after_tex_operations; - } - - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); - - // Only these modes of getting color & alpha are used - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); - glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA); - - // Color operation - - if (params.colorOperation == TEX_MIX_OPER_DEFAULT) - { - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); - goto after_tex_color; - } - else if (params.colorOperation == TEX_MIX_OPER_REPLACE) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); - else if (params.colorOperation == TEX_MIX_OPER_MODULATE) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE); - else if (params.colorOperation == TEX_MIX_OPER_ADD) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_ADD); - else if (params.colorOperation == TEX_MIX_OPER_SUBTRACT) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_SUBTRACT); - else assert(false); - - // Color arg1 - if (params.colorArg1 == TEX_MIX_ARG_TEXTURE) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE); - else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_0) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE0); - else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_1) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE1); - else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_2) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE2); - else if (params.colorArg1 == TEX_MIX_ARG_TEXTURE_3) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE3); - else if (params.colorArg1 == TEX_MIX_ARG_COMPUTED_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PREVIOUS); - else if (params.colorArg1 == TEX_MIX_ARG_SRC_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_PRIMARY_COLOR); - else if (params.colorArg1 == TEX_MIX_ARG_FACTOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT); - else assert(false); - - // Color arg2 - if (params.colorArg2 == TEX_MIX_ARG_TEXTURE) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE); - else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_0) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE0); - else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_1) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE1); - else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_2) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE2); - else if (params.colorArg2 == TEX_MIX_ARG_TEXTURE_3) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE3); - else if (params.colorArg2 == TEX_MIX_ARG_COMPUTED_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS); - else if (params.colorArg2 == TEX_MIX_ARG_SRC_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PRIMARY_COLOR); - else if (params.colorArg2 == TEX_MIX_ARG_FACTOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_CONSTANT); - else assert(false); - - -after_tex_color: - - // Alpha operation - if (params.alphaOperation == TEX_MIX_OPER_DEFAULT) - { - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE); - goto after_tex_operations; - } - else if (params.alphaOperation == TEX_MIX_OPER_REPLACE) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); - else if (params.alphaOperation == TEX_MIX_OPER_MODULATE) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE); - else if (params.alphaOperation == TEX_MIX_OPER_ADD) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_ADD); - else if (params.alphaOperation == TEX_MIX_OPER_SUBTRACT) - glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_SUBTRACT); - else assert(false); - - // Alpha arg1 - if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE); - else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_0) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE0); - else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_1) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE1); - else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_2) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE2); - else if (params.alphaArg1 == TEX_MIX_ARG_TEXTURE_3) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_TEXTURE3); - else if (params.alphaArg1 == TEX_MIX_ARG_COMPUTED_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PREVIOUS); - else if (params.alphaArg1 == TEX_MIX_ARG_SRC_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_PRIMARY_COLOR); - else if (params.alphaArg1 == TEX_MIX_ARG_FACTOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA, GL_CONSTANT); - else assert(false); - - // Alpha arg2 - if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE); - else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_0) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE0); - else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_1) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE1); - else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_2) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE2); - else if (params.alphaArg2 == TEX_MIX_ARG_TEXTURE_3) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_TEXTURE3); - else if (params.alphaArg2 == TEX_MIX_ARG_COMPUTED_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PREVIOUS); - else if (params.alphaArg2 == TEX_MIX_ARG_SRC_COLOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_PRIMARY_COLOR); - else if (params.alphaArg2 == TEX_MIX_ARG_FACTOR) - glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA, GL_CONSTANT); - else assert(false); - -after_tex_operations: ; } void CGL21Device::SetTextureStageWrap(int index, TexWrapMode wrapS, TexWrapMode wrapT) @@ -1404,7 +1268,6 @@ void CGL21Device::DrawPrimitive(PrimitiveType type, const VertexTex2 *vertices, glNormalPointer(GL_FLOAT, sizeof(VertexTex2), reinterpret_cast(&vs[0].normal)); glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast(&vs[0].texCoord)); @@ -1456,7 +1319,6 @@ void CGL21Device::DrawPrimitives(PrimitiveType type, const Vertex *vertices, glNormalPointer(GL_FLOAT, sizeof(Vertex), reinterpret_cast(&vs[0].normal)); glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), reinterpret_cast(&vs[0].texCoord)); @@ -1483,7 +1345,6 @@ void CGL21Device::DrawPrimitives(PrimitiveType type, const VertexTex2 *vertices, glNormalPointer(GL_FLOAT, sizeof(VertexTex2), reinterpret_cast(&vs[0].normal)); glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), reinterpret_cast(&vs[0].texCoord)); @@ -1666,7 +1527,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId) if (it == m_vboObjects.end()) return; - glEnable(GL_VERTEX_ARRAY); BindVBO((*it).second.bufferId); if ((*it).second.vertexType == VERTEX_TYPE_NORMAL) @@ -1678,7 +1538,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId) glNormalPointer(GL_FLOAT, sizeof(Vertex), static_cast(nullptr) + offsetof(Vertex, normal)); glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), static_cast(nullptr) + offsetof(Vertex, texCoord)); } @@ -1691,7 +1550,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId) glNormalPointer(GL_FLOAT, sizeof(VertexTex2), static_cast(nullptr) + offsetof(VertexTex2, normal)); glClientActiveTexture(GL_TEXTURE0); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glTexCoordPointer(2, GL_FLOAT, sizeof(VertexTex2), static_cast(nullptr) + offsetof(VertexTex2, texCoord)); @@ -1722,6 +1580,7 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId) glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_TEXTURE_COORD_ARRAY); // GL_TEXTURE1 + glClientActiveTexture(GL_TEXTURE0); glDisableClientState(GL_TEXTURE_COORD_ARRAY); } @@ -1730,8 +1589,6 @@ void CGL21Device::DrawStaticBuffer(unsigned int bufferId) glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } - - glDisable(GL_VERTEX_ARRAY); } void CGL21Device::DestroyStaticBuffer(unsigned int bufferId) @@ -1868,7 +1725,6 @@ void CGL21Device::SetRenderState(RenderState state, bool enabled) { case RENDER_STATE_BLENDING: flag = GL_BLEND; break; case RENDER_STATE_DEPTH_TEST: flag = GL_DEPTH_TEST; break; - case RENDER_STATE_ALPHA_TEST: flag = GL_ALPHA_TEST; break; case RENDER_STATE_CULLING: flag = GL_CULL_FACE; break; case RENDER_STATE_DEPTH_BIAS: flag = GL_POLYGON_OFFSET_FILL; break; default: assert(false); break; @@ -1897,7 +1753,7 @@ void CGL21Device::SetDepthBias(float factor, float units) void CGL21Device::SetAlphaTestFunc(CompFunc func, float refValue) { - glUniform1i(m_uniforms[m_mode].alphaReference, refValue); + glUniform1f(m_uniforms[m_mode].alphaReference, refValue); } void CGL21Device::SetBlendFunc(BlendFunc srcBlend, BlendFunc dstBlend) diff --git a/src/graphics/opengl/glframebuffer.cpp b/src/graphics/opengl/glframebuffer.cpp index f3523db3..04dff135 100644 --- a/src/graphics/opengl/glframebuffer.cpp +++ b/src/graphics/opengl/glframebuffer.cpp @@ -63,7 +63,8 @@ bool CGLFramebuffer::Create() glGenTextures(1, &m_colorTexture); glBindTexture(GL_TEXTURE_2D, m_colorTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height, + 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -81,13 +82,15 @@ bool CGLFramebuffer::Create() glBindRenderbuffer(GL_RENDERBUFFER, m_colorRenderbuffer); if (m_params.samples > 1) - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, GL_RGBA8, m_params.width, m_params.height); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, + GL_RGBA8, m_params.width, m_params.height); else glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, m_params.width, m_params.height); glBindRenderbuffer(GL_RENDERBUFFER, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, m_colorRenderbuffer); } GLuint depthFormat = 0; @@ -109,7 +112,8 @@ bool CGLFramebuffer::Create() glGenTextures(1, &m_depthTexture); glBindTexture(GL_TEXTURE_2D, m_depthTexture); - glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); @@ -124,7 +128,8 @@ bool CGLFramebuffer::Create() glBindTexture(GL_TEXTURE_2D, previous); - glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, m_depthTexture, 0); } // create depth renderbuffer else @@ -133,13 +138,16 @@ bool CGLFramebuffer::Create() glBindRenderbuffer(GL_RENDERBUFFER, m_depthRenderbuffer); if (m_params.samples > 1) - glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, depthFormat, m_params.width, m_params.height); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, m_params.samples, + depthFormat, m_params.width, m_params.height); else - glRenderbufferStorage(GL_RENDERBUFFER, depthFormat, m_params.width, m_params.height); + glRenderbufferStorage(GL_RENDERBUFFER, + depthFormat, m_params.width, m_params.height); glBindRenderbuffer(GL_RENDERBUFFER, 0); - glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer); + glFramebufferRenderbuffer(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, m_depthRenderbuffer); } GLuint result = glCheckFramebufferStatus(GL_FRAMEBUFFER); @@ -273,12 +281,14 @@ void CGLFramebuffer::Unbind() m_currentFBO = 0; } -void CGLFramebuffer::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, int toX, int toY, int toWidth, int toHeight) +void CGLFramebuffer::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, + int toX, int toY, int toWidth, int toHeight) { glBindFramebuffer(GL_READ_FRAMEBUFFER, m_fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); - glBlitFramebuffer(fromX, fromY, fromX + fromWidth, fromY + fromHeight, toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBlitFramebuffer(fromX, fromY, fromX + fromWidth, fromY + fromHeight, + toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); glBindFramebuffer(GL_FRAMEBUFFER, m_currentFBO); } @@ -321,7 +331,9 @@ bool CGLFramebufferEXT::Create() glGenTextures(1, &m_colorTexture); glBindTexture(GL_TEXTURE_2D, m_colorTexture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_params.width, m_params.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, + m_params.width, m_params.height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); @@ -330,7 +342,8 @@ bool CGLFramebufferEXT::Create() glBindTexture(GL_TEXTURE_2D, previous); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, m_colorTexture, 0); } // create color renderbuffer else @@ -339,13 +352,16 @@ bool CGLFramebufferEXT::Create() glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_colorRenderbuffer); if (m_params.samples > 1) - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, m_params.samples, GL_RGBA8, m_params.width, m_params.height); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, + m_params.samples, GL_RGBA8, m_params.width, m_params.height); else - glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, m_params.width, m_params.height); + glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_RGBA8, + m_params.width, m_params.height); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, + GL_COLOR_ATTACHMENT0_EXT, GL_RENDERBUFFER_EXT, m_colorRenderbuffer); } GLuint depthFormat = 0; @@ -367,7 +383,8 @@ bool CGLFramebufferEXT::Create() glGenTextures(1, &m_depthTexture); glBindTexture(GL_TEXTURE_2D, m_depthTexture); - glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr); + glTexImage2D(GL_TEXTURE_2D, 0, depthFormat, m_params.width, m_params.height, 0, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, nullptr); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); @@ -382,7 +399,8 @@ bool CGLFramebufferEXT::Create() glBindTexture(GL_TEXTURE_2D, previous); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0); + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, + GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, m_depthTexture, 0); } // create depth renderbuffer else @@ -391,13 +409,15 @@ bool CGLFramebufferEXT::Create() glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, m_depthRenderbuffer); if (m_params.samples > 1) - glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, m_params.samples, depthFormat, m_params.width, m_params.height); + glRenderbufferStorageMultisampleEXT(GL_RENDERBUFFER_EXT, + m_params.samples, depthFormat, m_params.width, m_params.height); else glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, depthFormat, m_params.width, m_params.height); glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0); - glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthRenderbuffer); + glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, + GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, m_depthRenderbuffer); } GLuint result = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT); @@ -429,7 +449,7 @@ bool CGLFramebufferEXT::Create() Destroy(); - glBindFramebuffer(GL_FRAMEBUFFER, m_currentFBO); + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_currentFBO); return false; } @@ -532,12 +552,14 @@ void CGLFramebufferEXT::Unbind() m_currentFBO = 0; } -void CGLFramebufferEXT::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, int toX, int toY, int toWidth, int toHeight) +void CGLFramebufferEXT::CopyToScreen(int fromX, int fromY, int fromWidth, int fromHeight, + int toX, int toY, int toWidth, int toHeight) { glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, m_fbo); glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, 0); - glBlitFramebufferEXT(fromX, fromY, fromX + fromWidth, fromY + fromHeight, toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBlitFramebufferEXT(fromX, fromY, fromX + fromWidth, fromY + fromHeight, + toX, toY, toX + toWidth, toY + toHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR); glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, m_currentFBO); } diff --git a/src/graphics/opengl/glutil.cpp b/src/graphics/opengl/glutil.cpp index 6c2952c3..e91bbf15 100644 --- a/src/graphics/opengl/glutil.cpp +++ b/src/graphics/opengl/glutil.cpp @@ -292,6 +292,22 @@ std::string GetHardwareInfo(bool full) return result.str(); } +int ClearGLErrors() +{ + int result = 0; + + while (true) + { + GLint error = glGetError(); + if (error == GL_NO_ERROR) + break; + + result++; + } + + return result; +} + bool CheckGLErrors() { GLint error = glGetError(); diff --git a/src/graphics/opengl/glutil.h b/src/graphics/opengl/glutil.h index cc26961b..df99ceb8 100644 --- a/src/graphics/opengl/glutil.h +++ b/src/graphics/opengl/glutil.h @@ -68,6 +68,9 @@ bool AreExtensionsSupported(std::string list); //! Returns information about graphics card std::string GetHardwareInfo(bool full = false); +//! Clears OpenGL errors +int ClearGLErrors(); + //! Checks for OpenGL errors bool CheckGLErrors();