diff --git a/apps/openmw/mwrender/characterpreview.cpp b/apps/openmw/mwrender/characterpreview.cpp index 51e5a536f7..a9733cddf8 100644 --- a/apps/openmw/mwrender/characterpreview.cpp +++ b/apps/openmw/mwrender/characterpreview.cpp @@ -91,7 +91,7 @@ namespace MWRender class SetUpBlendVisitor : public osg::NodeVisitor { public: - SetUpBlendVisitor(): osg::NodeVisitor(TRAVERSE_ALL_CHILDREN), mNoAlphaUniform(new osg::Uniform("noAlpha", false)) + SetUpBlendVisitor(): osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) { } @@ -130,7 +130,7 @@ namespace MWRender } // Disable noBlendAlphaEnv newStateSet->setTextureMode(7, GL_TEXTURE_2D, osg::StateAttribute::OFF); - newStateSet->addUniform(mNoAlphaUniform); + newStateSet->setDefine("FORCE_OPAQUE", "0", osg::StateAttribute::ON); } if (SceneUtil::getReverseZ() && stateset->getAttribute(osg::StateAttribute::DEPTH)) { @@ -172,8 +172,6 @@ namespace MWRender } traverse(node); } - private: - osg::ref_ptr mNoAlphaUniform; }; CharacterPreview::CharacterPreview(osg::Group* parent, Resource::ResourceSystem* resourceSystem, @@ -216,6 +214,7 @@ namespace MWRender osg::ref_ptr lightManager = new SceneUtil::LightManager(ffp); lightManager->setStartLight(1); osg::ref_ptr stateset = lightManager->getOrCreateStateSet(); + stateset->setDefine("FORCE_OPAQUE", "1", osg::StateAttribute::ON); stateset->setMode(GL_LIGHTING, osg::StateAttribute::ON); stateset->setMode(GL_NORMALIZE, osg::StateAttribute::ON); stateset->setMode(GL_CULL_FACE, osg::StateAttribute::ON); @@ -253,7 +252,6 @@ namespace MWRender dummyTexture->setShadowCompareFunc(osg::Texture::ShadowCompareFunc::ALWAYS); stateset->setTextureAttributeAndModes(7, dummyTexture, osg::StateAttribute::ON); stateset->setTextureAttribute(7, noBlendAlphaEnv, osg::StateAttribute::ON); - stateset->addUniform(new osg::Uniform("noAlpha", true)); osg::ref_ptr lightmodel = new osg::LightModel; lightmodel->setAmbientIntensity(osg::Vec4(0.0, 0.0, 0.0, 1.0)); @@ -328,7 +326,6 @@ namespace MWRender void CharacterPreview::setBlendMode() { - mResourceSystem->getSceneManager()->recreateShaders(mNode, "objects", true); SetUpBlendVisitor visitor; mNode->accept(visitor); } diff --git a/apps/openmw/mwrender/groundcover.cpp b/apps/openmw/mwrender/groundcover.cpp index 71bddb1f9d..77c4f0fab5 100644 --- a/apps/openmw/mwrender/groundcover.cpp +++ b/apps/openmw/mwrender/groundcover.cpp @@ -224,7 +224,7 @@ namespace MWRender group->setNodeMask(Mask_Groundcover); if (mSceneManager->getLightingMethod() != SceneUtil::LightingMethod::FFP) group->setCullCallback(new SceneUtil::LightListCallback); - mSceneManager->recreateShaders(group, "groundcover", false, true, mProgramTemplate); + mSceneManager->recreateShaders(group, "groundcover", true, mProgramTemplate); mSceneManager->shareState(group); group->getBound(); return group; diff --git a/components/resource/scenemanager.cpp b/components/resource/scenemanager.cpp index 7c730b24a7..c5ef957c3e 100644 --- a/components/resource/scenemanager.cpp +++ b/components/resource/scenemanager.cpp @@ -331,9 +331,9 @@ namespace Resource return mForceShaders; } - void SceneManager::recreateShaders(osg::ref_ptr node, const std::string& shaderPrefix, bool translucentFramebuffer, bool forceShadersForNode, const osg::Program* programTemplate) + void SceneManager::recreateShaders(osg::ref_ptr node, const std::string& shaderPrefix, bool forceShadersForNode, const osg::Program* programTemplate) { - osg::ref_ptr shaderVisitor(createShaderVisitor(shaderPrefix, translucentFramebuffer)); + osg::ref_ptr shaderVisitor(createShaderVisitor(shaderPrefix)); shaderVisitor->setAllowedToModifyStateSets(false); shaderVisitor->setProgramTemplate(programTemplate); if (forceShadersForNode) @@ -871,7 +871,7 @@ namespace Resource stats->setAttribute(frameNumber, "Node", mCache->getCacheSize()); } - Shader::ShaderVisitor *SceneManager::createShaderVisitor(const std::string& shaderPrefix, bool translucentFramebuffer) + Shader::ShaderVisitor *SceneManager::createShaderVisitor(const std::string& shaderPrefix) { Shader::ShaderVisitor* shaderVisitor = new Shader::ShaderVisitor(*mShaderManager.get(), *mImageManager, shaderPrefix); shaderVisitor->setForceShaders(mForceShaders); @@ -882,7 +882,6 @@ namespace Resource shaderVisitor->setSpecularMapPattern(mSpecularMapPattern); shaderVisitor->setApplyLightingToEnvMaps(mApplyLightingToEnvMaps); shaderVisitor->setConvertAlphaTestToAlphaToCoverage(mConvertAlphaTestToAlphaToCoverage); - shaderVisitor->setTranslucentFramebuffer(translucentFramebuffer); return shaderVisitor; } } diff --git a/components/resource/scenemanager.hpp b/components/resource/scenemanager.hpp index 1443476fd5..b5d3e453a0 100644 --- a/components/resource/scenemanager.hpp +++ b/components/resource/scenemanager.hpp @@ -76,7 +76,7 @@ namespace Resource Shader::ShaderManager& getShaderManager(); /// Re-create shaders for this node, need to call this if alpha testing, texture stages or vertex color mode have changed. - void recreateShaders(osg::ref_ptr node, const std::string& shaderPrefix = "objects", bool translucentFramebuffer = false, bool forceShadersForNode = false, const osg::Program* programTemplate = nullptr); + void recreateShaders(osg::ref_ptr node, const std::string& shaderPrefix = "objects", bool forceShadersForNode = false, const osg::Program* programTemplate = nullptr); /// Applying shaders to a node may replace some fixed-function state. /// This restores it. @@ -188,7 +188,7 @@ namespace Resource private: - Shader::ShaderVisitor* createShaderVisitor(const std::string& shaderPrefix = "objects", bool translucentFramebuffer = false); + Shader::ShaderVisitor* createShaderVisitor(const std::string& shaderPrefix = "objects"); std::unique_ptr mShaderManager; bool mForceShaders; diff --git a/components/shader/shadervisitor.cpp b/components/shader/shadervisitor.cpp index cc2b781cfd..6709ee842e 100644 --- a/components/shader/shadervisitor.cpp +++ b/components/shader/shadervisitor.cpp @@ -111,7 +111,6 @@ namespace Shader , mAutoUseSpecularMaps(false) , mApplyLightingToEnvMaps(false) , mConvertAlphaTestToAlphaToCoverage(false) - , mTranslucentFramebuffer(false) , mShaderManager(shaderManager) , mImageManager(imageManager) , mDefaultShaderPrefix(defaultShaderPrefix) @@ -266,7 +265,7 @@ namespace Shader mRequirements.back().mShaderRequired = true; } } - else if (!mTranslucentFramebuffer) + else Log(Debug::Error) << "ShaderVisitor encountered unknown texture " << texture; } } @@ -547,8 +546,6 @@ namespace Shader updateAddedState(*writableUserData, addedState); } - defineMap["translucentFramebuffer"] = mTranslucentFramebuffer ? "1" : "0"; - std::string shaderPrefix; if (!node.getUserValue("shaderPrefix", shaderPrefix)) shaderPrefix = mDefaultShaderPrefix; @@ -764,11 +761,6 @@ namespace Shader mConvertAlphaTestToAlphaToCoverage = convert; } - void ShaderVisitor::setTranslucentFramebuffer(bool translucent) - { - mTranslucentFramebuffer = translucent; - } - ReinstateRemovedStateVisitor::ReinstateRemovedStateVisitor(bool allowedToModifyStateSets) : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) , mAllowedToModifyStateSets(allowedToModifyStateSets) diff --git a/components/shader/shadervisitor.hpp b/components/shader/shadervisitor.hpp index 3380a66cca..5f9739ea90 100644 --- a/components/shader/shadervisitor.hpp +++ b/components/shader/shadervisitor.hpp @@ -45,8 +45,6 @@ namespace Shader void setConvertAlphaTestToAlphaToCoverage(bool convert); - void setTranslucentFramebuffer(bool translucent); - void apply(osg::Node& node) override; void apply(osg::Drawable& drawable) override; @@ -72,8 +70,6 @@ namespace Shader bool mConvertAlphaTestToAlphaToCoverage; - bool mTranslucentFramebuffer; - ShaderManager& mShaderManager; Resource::ImageManager& mImageManager; diff --git a/files/shaders/nv_default_fragment.glsl b/files/shaders/nv_default_fragment.glsl index 1bd0f4e310..38dca66c40 100644 --- a/files/shaders/nv_default_fragment.glsl +++ b/files/shaders/nv_default_fragment.glsl @@ -1,4 +1,5 @@ #version 120 +#pragma import_defines(FORCE_OPAQUE) #if @useUBO #extension GL_ARB_uniform_buffer_object : require @@ -24,8 +25,6 @@ varying vec2 normalMapUV; varying vec4 passTangent; #endif -uniform bool noAlpha; - varying float euclideanDepth; varying float linearDepth; @@ -95,9 +94,9 @@ void main() #endif gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue); -#if @translucentFramebuffer - if (noAlpha) - gl_FragData[0].a = 1.0; +#if FORCE_OPAQUE + // having testing & blending isn't enough - we need to write an opaque pixel to be opaque + gl_FragData[0].a = 1.0; #endif applyShadowDebugOverlay(); diff --git a/files/shaders/nv_nolighting_fragment.glsl b/files/shaders/nv_nolighting_fragment.glsl index 27679a069f..76b01828d6 100644 --- a/files/shaders/nv_nolighting_fragment.glsl +++ b/files/shaders/nv_nolighting_fragment.glsl @@ -1,4 +1,5 @@ #version 120 +#pragma import_defines(FORCE_OPAQUE) #if @useGPUShader4 #extension GL_EXT_gpu_shader4: require @@ -9,8 +10,6 @@ uniform sampler2D diffuseMap; varying vec2 diffuseMapUV; #endif -uniform bool noAlpha; - #if @radialFog varying float euclideanDepth; #else @@ -46,9 +45,8 @@ void main() float fogValue = clamp((linearDepth - gl_Fog.start) * gl_Fog.scale, 0.0, 1.0); #endif -#if @translucentFramebuffer - if (noAlpha) - gl_FragData[0].a = 1.0; +#if FORCE_OPAQUE + gl_FragData[0].a = 1.0; #endif gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue); diff --git a/files/shaders/objects_fragment.glsl b/files/shaders/objects_fragment.glsl index d304b2abe8..c343b6a189 100644 --- a/files/shaders/objects_fragment.glsl +++ b/files/shaders/objects_fragment.glsl @@ -1,4 +1,5 @@ #version 120 +#pragma import_defines(FORCE_OPAQUE) #if @useUBO #extension GL_ARB_uniform_buffer_object : require @@ -58,7 +59,6 @@ uniform mat2 bumpMapMatrix; #endif uniform bool simpleWater; -uniform bool noAlpha; varying float euclideanDepth; varying float linearDepth; @@ -220,10 +220,9 @@ void main() #endif gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue); -#if @translucentFramebuffer +#if FORCE_OPAQUE // having testing & blending isn't enough - we need to write an opaque pixel to be opaque - if (noAlpha) - gl_FragData[0].a = 1.0; + gl_FragData[0].a = 1.0; #endif applyShadowDebugOverlay();