cleanup default shaders and remove confusing main shader

check_span
cody glassman 2 years ago
parent bc1a6bfd72
commit ac4b29be08

@ -17,28 +17,6 @@
#include "../mwbase/environment.hpp"
#include "../mwbase/windowmanager.hpp"
namespace
{
void saveChain()
{
auto* processor = MWBase::Environment::get().getWorld()->getPostProcessor();
std::vector<std::string> chain;
for (size_t i = 1; i < processor->getTechniques().size(); ++i)
{
auto technique = processor->getTechniques()[i];
if (!technique || technique->getDynamic())
continue;
chain.push_back(technique->getName());
}
Settings::Manager::setStringArray("chain", "Post Processing", chain);
}
}
namespace MWGui
{
void PostProcessorHud::ListWrapper::onKeyButtonPressed(MyGUI::KeyCode key, MyGUI::Char ch)
@ -145,7 +123,7 @@ namespace MWGui
processor->enableTechnique(technique);
else
processor->disableTechnique(technique);
saveChain();
processor->saveChain();
}
}
@ -178,7 +156,7 @@ namespace MWGui
return;
if (processor->enableTechnique(technique, index) != MWRender::PostProcessor::Status_Error)
saveChain();
processor->saveChain();
}
}
@ -377,7 +355,7 @@ namespace MWGui
{
Gui::AutoSizedTextBox* divider = mConfigArea->createWidget<Gui::AutoSizedTextBox>("MW_UniformGroup", {0,0,0,34}, MyGUI::Align::Default);
divider->setNeedMouseFocus(false);
divider->setCaption(uniform->mHeader);
divider->setCaptionWithReplacing(uniform->mHeader);
}
fx::Widgets::UniformBase* uwidget = mConfigArea->createWidget<fx::Widgets::UniformBase>("MW_UniformEdit", {0,0,0,22}, MyGUI::Align::Default);

@ -100,21 +100,10 @@ namespace MWRender
if (filtered.empty() || !bufferData.postprocessing)
{
if (bufferData.postprocessing)
{
if (!mLoggedLastError)
{
Log(Debug::Error) << "Critical error, postprocess shaders failed to compile. Using default shader.";
mLoggedLastError = true;
}
}
else
mLoggedLastError = false;
state.pushStateSet(mFallbackStateSet);
state.apply();
if (Stereo::getMultiview() && mMultiviewResolveProgram)
if (Stereo::getMultiview())
{
state.pushStateSet(mMultiviewResolveStateSet);
state.apply();
@ -126,7 +115,7 @@ namespace MWRender
drawGeometry(renderInfo);
state.popStateSet();
if (Stereo::getMultiview() && mMultiviewResolveProgram)
if (Stereo::getMultiview())
{
state.popStateSet();
}
@ -298,7 +287,7 @@ namespace MWRender
state.popStateSet();
}
if (Stereo::getMultiview() && mMultiviewResolveProgram)
if (Stereo::getMultiview())
{
ext->glBindFramebuffer(GL_DRAW_FRAMEBUFFER_EXT, 0);
lastApplied = 0;

@ -83,8 +83,6 @@ namespace MWRender
mutable std::array<BufferData, 2> mBufferData;
mutable std::array<osg::ref_ptr<osg::FrameBufferObject>, 3> mFbos;
mutable osg::ref_ptr<osg::Viewport> mRenderViewport;
mutable bool mLoggedLastError = false;
};
}

@ -124,7 +124,6 @@ namespace MWRender
, mNormalsSupported(false)
, mPassLights(false)
, mPrevPassLights(false)
, mMainTemplate(new osg::Texture2D)
{
mSoftParticles = Settings::Manager::getBool("soft particles", "Shaders");
mUsePostProcessing = Settings::Manager::getBool("enabled", "Post Processing");
@ -247,14 +246,6 @@ namespace MWRender
populateTechniqueFiles();
}
mMainTemplate->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
mMainTemplate->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
mMainTemplate->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
mMainTemplate->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
mMainTemplate->setInternalFormat(GL_RGBA);
mMainTemplate->setSourceType(GL_UNSIGNED_BYTE);
mMainTemplate->setSourceFormat(GL_RGBA);
createTexturesAndCamera(frame() % 2);
removeChild(mHUDCamera);
@ -399,13 +390,8 @@ namespace MWRender
mReload = false;
if (!mTechniques.empty())
reloadMainPass(*mTechniques[0]);
reloadTechniques();
if (!mUsePostProcessing)
resize();
loadChain();
resize();
}
void PostProcessor::update(size_t frameId)
@ -483,9 +469,6 @@ namespace MWRender
auto fpDepthRb = createFrameBufferAttachmentFromTemplate(Usage::RENDER_BUFFER, width, height, textures[Tex_Depth], mSamples);
fbos[FBO_FirstPerson]->setAttachment(osg::FrameBufferObject::BufferComponent::PACKED_DEPTH_STENCIL_BUFFER, osg::FrameBufferAttachment(fpDepthRb));
// When MSAA is enabled we must first render to a render buffer, then
// blit the result to the FBO which is either passed to the main frame
// buffer for display or used as the entry point for a post process chain.
if (mSamples > 1)
{
fbos[FBO_Multisample] = new osg::FrameBufferObject;
@ -494,7 +477,6 @@ namespace MWRender
{
auto normalRB = createFrameBufferAttachmentFromTemplate(Usage::RENDER_BUFFER, width, height, textures[Tex_Normal], mSamples);
fbos[FBO_Multisample]->setAttachment(osg::FrameBufferObject::BufferComponent::COLOR_BUFFER1, normalRB);
fbos[FBO_FirstPerson]->setAttachment(osg::FrameBufferObject::BufferComponent::COLOR_BUFFER1, normalRB);
}
auto depthRB = createFrameBufferAttachmentFromTemplate(Usage::RENDER_BUFFER, width, height, textures[Tex_Depth], mSamples);
fbos[FBO_Multisample]->setAttachment(osg::FrameBufferObject::BufferComponent::COLOR_BUFFER0, colorRB);
@ -667,7 +649,7 @@ namespace MWRender
return Status_Error;
}
if (!technique || technique->getLocked() || (location.has_value() && location.value() <= 0))
if (!technique || technique->getLocked() || (location.has_value() && location.value() < 0))
return Status_Error;
disableTechnique(technique, false);
@ -734,17 +716,6 @@ namespace MWRender
textures[Tex_Normal]->setSourceFormat(GL_RGB);
textures[Tex_Normal]->setInternalFormat(GL_RGB);
if (mMainTemplate)
{
textures[Tex_Scene]->setSourceFormat(mMainTemplate->getSourceFormat());
textures[Tex_Scene]->setSourceType(mMainTemplate->getSourceType());
textures[Tex_Scene]->setInternalFormat(mMainTemplate->getInternalFormat());
textures[Tex_Scene]->setFilter(osg::Texture2D::MIN_FILTER, mMainTemplate->getFilter(osg::Texture2D::MIN_FILTER));
textures[Tex_Scene]->setFilter(osg::Texture2D::MAG_FILTER, mMainTemplate->getFilter(osg::Texture2D::MAG_FILTER));
textures[Tex_Scene]->setWrap(osg::Texture::WRAP_S, mMainTemplate->getWrap(osg::Texture2D::WRAP_S));
textures[Tex_Scene]->setWrap(osg::Texture::WRAP_T, mMainTemplate->getWrap(osg::Texture2D::WRAP_T));
}
auto setupDepth = [] (osg::Texture* tex) {
tex->setSourceFormat(GL_DEPTH_STENCIL_EXT);
tex->setSourceType(SceneUtil::AutoDepth::depthSourceType());
@ -816,14 +787,12 @@ namespace MWRender
return technique;
}
reloadMainPass(*technique);
mTemplates.push_back(std::move(technique));
return mTemplates.back();
}
void PostProcessor::reloadTechniques()
void PostProcessor::loadChain()
{
if (!isEnabled())
return;
@ -832,18 +801,9 @@ namespace MWRender
std::vector<std::string> techniqueStrings = Settings::Manager::getStringArray("chain", "Post Processing");
const std::string mainIdentifier = "main";
auto main = loadTechnique(mainIdentifier);
if (main)
main->setLocked(true);
mTechniques.push_back(std::move(main));
for (auto& techniqueName : techniqueStrings)
{
if (techniqueName.empty() || Misc::StringUtils::ciEqual(techniqueName, mainIdentifier))
if (techniqueName.empty())
continue;
mTechniques.push_back(loadTechnique(techniqueName));
@ -852,14 +812,17 @@ namespace MWRender
dirtyTechniques();
}
void PostProcessor::reloadMainPass(fx::Technique& technique)
void PostProcessor::saveChain()
{
if (!technique.getMainTemplate())
return;
std::vector<std::string> chain;
mMainTemplate = technique.getMainTemplate();
for (const auto& technique : mTechniques) {
if (!technique || technique->getDynamic())
continue;
chain.push_back(technique->getName());
}
resize();
Settings::Manager::setStringArray("chain", "Post Processing", chain);
}
void PostProcessor::toggleMode()

@ -86,6 +86,13 @@ namespace MWRender
Unit_NextFree
};
enum Status
{
Status_Error,
Status_Toggled,
Status_Unchanged
};
PostProcessor(RenderingManager& rendering, osgViewer::Viewer* viewer, osg::Group* rootNode, const VFS::Manager* vfs);
~PostProcessor();
@ -110,13 +117,6 @@ namespace MWRender
void resize();
enum Status
{
Status_Error,
Status_Toggled,
Status_Unchanged
};
Status enableTechnique(std::shared_ptr<fx::Technique> technique, std::optional<int> location = std::nullopt);
Status disableTechnique(std::shared_ptr<fx::Technique> technique, bool dirty = true);
@ -180,6 +180,9 @@ namespace MWRender
int renderWidth() const;
int renderHeight() const;
void loadChain();
void saveChain();
private:
void populateTechniqueFiles();
@ -190,8 +193,6 @@ namespace MWRender
void createTexturesAndCamera(size_t frameId);
void reloadTechniques();
void reloadMainPass(fx::Technique& technique);
void dirtyTechniques();
@ -245,8 +246,6 @@ namespace MWRender
bool mUBO;
int mGLSLVersion;
osg::ref_ptr<osg::Texture> mMainTemplate;
osg::ref_ptr<fx::StateUpdater> mStateUpdater;
osg::ref_ptr<PingPongCull> mPingPongCull;
osg::ref_ptr<PingPongCanvas> mPingPongCanvas;

@ -23,7 +23,6 @@ namespace
TEST_F(LexerSingleTokenTest, single_token_shared) { test<Shared>(); }
TEST_F(LexerSingleTokenTest, single_token_technique) { test<Technique>(); }
TEST_F(LexerSingleTokenTest, single_token_main_pass) { test<Main_Pass>(); }
TEST_F(LexerSingleTokenTest, single_token_render_target) { test<Render_Target>(); }
TEST_F(LexerSingleTokenTest, single_token_vertex) { test<Vertex>(); }
TEST_F(LexerSingleTokenTest, single_token_fragment) { test<Fragment>(); }

@ -230,7 +230,6 @@ namespace fx
if (value == "shared") return Shared{};
if (value == "technique") return Technique{};
if (value == "main_pass") return Main_Pass{};
if (value == "render_target") return Render_Target{};
if (value == "vertex") return Vertex{};
if (value == "fragment") return Fragment{};

@ -18,7 +18,6 @@ namespace fx
struct Fragment { inline static constexpr std::string_view repr = "fragment"; };
struct Compute { inline static constexpr std::string_view repr = "compute"; };
struct Technique { inline static constexpr std::string_view repr = "technique"; };
struct Main_Pass { inline static constexpr std::string_view repr = "main_pass"; };
struct Render_Target { inline static constexpr std::string_view repr = "render_target"; };
struct Sampler_1D { inline static constexpr std::string_view repr = "sampler_1d"; };
struct Sampler_2D { inline static constexpr std::string_view repr = "sampler_2d"; };
@ -49,7 +48,7 @@ namespace fx
using Token = std::variant<Float, Integer, Boolean, String, Literal, Equal, Open_bracket, Close_bracket, Open_Parenthesis,
Close_Parenthesis, Quote, SemiColon, Comma, VBar, Colon, Shared, Technique, Render_Target, Vertex, Fragment,
Compute, Sampler_1D, Sampler_2D, Sampler_3D, Uniform_Bool, Uniform_Float, Uniform_Int, Uniform_Vec2, Uniform_Vec3, Uniform_Vec4,
True, False, Vec2, Vec3, Vec4, Main_Pass, Eof>;
True, False, Vec2, Vec3, Vec4, Eof>;
}
}

@ -65,7 +65,6 @@ namespace fx
mPassKeys.clear();
mDefinedUniforms.clear();
mRenderTargets.clear();
mMainTemplate = nullptr;
mLastAppliedType = Pass::Type::None;
mFlags = 0;
mShared.clear();
@ -262,47 +261,6 @@ namespace fx
error("pass list in 'technique' block cannot be empty.");
}
template<>
void Technique::parseBlockImp<Lexer::Main_Pass>()
{
if (mMainTemplate)
error("duplicate 'main_pass' block");
if (mName != "main")
error("'main_pass' block can only be defined in the 'main.omwfx' technique file");
mMainTemplate = new osg::Texture2D;
mMainTemplate->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
mMainTemplate->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
while (!isNext<Lexer::Close_bracket>() && !isNext<Lexer::Eof>())
{
expect<Lexer::Literal>();
auto key = std::get<Lexer::Literal>(mToken).value;
expect<Lexer::Equal>();
if (key == "wrap_s")
mMainTemplate->setWrap(osg::Texture::WRAP_S, parseWrapMode());
else if (key == "wrap_t")
mMainTemplate->setWrap(osg::Texture::WRAP_T, parseWrapMode());
// Skip depth attachments for main scene, as some engine settings rely on specific depth formats.
// Allowing this to be overriden will cause confusion.
else if (key == "internal_format")
mMainTemplate->setInternalFormat(parseInternalFormat());
else if (key == "source_type")
mMainTemplate->setSourceType(parseSourceType());
else if (key == "source_format")
mMainTemplate->setSourceFormat(parseSourceFormat());
else
error(Misc::StringUtils::format("unexpected key '%s'", std::string(key)));
expect<Lexer::SemiColon>();
}
}
template<>
void Technique::parseBlockImp<Lexer::Render_Target>()
{
@ -738,8 +696,6 @@ namespace fx
parseBlock<Lexer::Shared>(false);
else if constexpr (std::is_same_v<Lexer::Technique, T>)
parseBlock<Lexer::Technique>(false);
else if constexpr (std::is_same_v<Lexer::Main_Pass, T>)
parseBlock<Lexer::Main_Pass>(false);
else if constexpr (std::is_same_v<Lexer::Render_Target, T>)
parseBlock<Lexer::Render_Target>();
else if constexpr (std::is_same_v<Lexer::Vertex, T>)

@ -159,8 +159,6 @@ namespace fx
const std::unordered_set<std::string>& getGLSLExtensions() const { return mGLSLExtensions; }
osg::ref_ptr<osg::Texture2D> getMainTemplate() const { return mMainTemplate; }
FlagsType getFlags() const { return mFlags; }
bool getHidden() const { return mFlags & Flag_Hidden; }
@ -273,7 +271,6 @@ namespace fx
int mWidth;
int mHeight;
osg::ref_ptr<osg::Texture2D> mMainTemplate;
RenderTargetMap mRenderTargets;
TexList mTextures;
@ -301,7 +298,6 @@ namespace fx
template<> void Technique::parseBlockImp<Lexer::Shared>();
template<> void Technique::parseBlockImp<Lexer::Technique>();
template<> void Technique::parseBlockImp<Lexer::Main_Pass>();
template<> void Technique::parseBlockImp<Lexer::Render_Target>();
template<> void Technique::parseBlockImp<Lexer::Vertex>();
template<> void Technique::parseBlockImp<Lexer::Fragment>();

@ -87,8 +87,8 @@ set(BUILTIN_DATA_FILES
scripts/omw/mwui/space.lua
scripts/omw/mwui/init.lua
shaders/main.omwfx
shaders/displaydepth.omwfx
shaders/adjustments.omwfx
shaders/debug.omwfx
mygui/core.skin
mygui/core.xml

@ -1,3 +1,7 @@
DisplayDepthDescription: "Visualisiert den Tiefenpuffer."
DisplayDepthName: "Visualisiert den Tiefenpuffer."
DisplayDepthFactorDescription: "Bestimmt die Korrelation zwischen dem Pixeltiefenwert und seiner Ausgabefarbe. Hohe Werte führen zu einem helleren Bild."
DisplayDepthFactorName: "Farbfaktor"
ContrastLevelDescription: "Kontraststufe"
ContrastLevelName: "Kontrast"
GammaLevelDescription: "Gamma-Level"
GammaLevelName: "Gamma"

@ -1,3 +1,12 @@
DisplayDepthDescription: "Visualizes the depth buffer."
DisplayDepthFactorDescription: "Determines correlation between pixel depth value and its output color. High values lead to brighter image."
DisplayDepthFactorName: "Color factor"
AdjustmentsDescription: "Colour adjustments."
DebugDescription: "Debug shader."
DebugHeaderDepth: "Depth Buffer"
DebugHeaderNormals: "Normals"
DisplayDepthFactorName: "Depth colour factor"
DisplayDepthFactorDescription: "Determines correlation between pixel depth value and its output colour. High values lead to brighter image."
DisplayDepthName: "Visualize depth buffer"
DisplayNormalsName: "Visualize pass normals"
ContrastLevelDescription: "Constrast level"
ContrastLevelName: "Constrast"
GammaLevelDescription: "Gamma level"
GammaLevelName: "Gamma"

@ -1,3 +1,12 @@
DisplayDepthDescription: "Визуализирует буфер глубины."
AdjustmentsDescription: "Коррекция цвета."
DebugDescription: "Отладочный шейдер."
DebugHeaderDepth: "Буфер глубины"
DebugHeaderNormals: "Нормали"
DisplayDepthName: "Визуализация буфера глубины"
DisplayDepthFactorDescription: "Определяет соотношение между значением глубины пикселя и его цветом. Чем выше значение, тем ярче будет изображение."
DisplayDepthFactorName: "Соотношение цвета"
DisplayNormalsName: "Визуализация нормалей"
ContrastLevelDescription: "Контрастность изображения"
ContrastLevelName: "Контрастность"
GammaLevelDescription: "Яркость изображения"
GammaLevelName: "Яркость"

@ -1,3 +1,7 @@
DisplayDepthDescription: "Visualiserar djupbufferten."
DisplayDepthName: "Visualiserar djupbufferten."
DisplayDepthFactorDescription: "Avgör korrelation mellan djupvärdet på pixeln och dess producerade färg. Högre värden ger ljusare bild."
DisplayDepthFactorName: "Färgfaktor"
ContrastLevelDescription: "Kontrastnivå"
ContrastLevelName: "Kontrast"
GammaLevelDescription: "Gammanivå"
# GammaLevelName: "Gamma" samma som en

@ -1,11 +1,7 @@
Abovewater: "Überwasser"
Author: "Autor"
Configuration: "Konfiguration"
ContrastLevelDescription: "Kontraststufe"
ContrastLevelName: "Kontrast"
Description: "Beschreibung"
GammaLevelDescription: "Gamma-Level"
GammaLevelName: "Gamma"
InExteriors: "Außenbereich"
InInteriors: "Innenbereich"
KeyboardControls: |

@ -1,11 +1,7 @@
Abovewater: "Abovewater"
Author: "Author"
Configuration: "Configuration"
ContrastLevelDescription: "Constrast level"
ContrastLevelName: "Constrast"
Description: "Description"
GammaLevelDescription: "Gamma level"
GammaLevelName: "Gamma"
InExteriors: "Exteriors"
InInteriors: "Interiors"
KeyboardControls: |
@ -15,7 +11,6 @@ KeyboardControls: |
Shift+Left-Arrow > Deactive shader
Shift+Up-Arrow > Move shader up
Shift+Down-Arrow > Move shader down
MainPassDescription: "Passes scene data to post processing shaders. Can not be toggled or moved."
PostProcessHUD: "Postprocess HUD"
ResetShader: "Reset shader to default state"
ShaderLocked: "Locked"

@ -1,11 +1,7 @@
Abovewater: "Над водой"
Author: "Автор"
Configuration: "Настройки"
ContrastLevelDescription: "Контрастность изображения"
ContrastLevelName: "Контрастность"
Description: "Описание"
GammaLevelDescription: "Яркость изображения"
GammaLevelName: "Яркость"
InExteriors: "Вне помещений"
InInteriors: "В помещениях"
KeyboardControls: |
@ -15,7 +11,6 @@ KeyboardControls: |
Shift+Left-Arrow > Выключить шейдер
Shift+Up-Arrow > Передвинуть шейдер выше
Shift+Down-Arrow > Передвинуть шейдер ниже
MainPassDescription: "Передает данные сцены в шейдеры постобработки. Не может быть выключен или передвинут."
PostProcessHUD: "Настройки постобработки"
ResetShader: "Обнулить настройки этого шейдера"
ShaderLocked: "Заблокирован"

@ -1,11 +1,7 @@
Abovewater: "Ovan vatten"
Author: "Skapare" # Author = Författare, but författare sounds very book-author-ish. Skapare, meaning "creator", sounds better in Swedish in this case. Ok?
Configuration: "Konfiguration"
ContrastLevelDescription: "Kontrastnivå"
ContrastLevelName: "Kontrast"
Description: "Beskrivning"
GammaLevelDescription: "Gammanivå"
# GammaLevelName: "Gamma" samma som en
InExteriors: "Exteriörer"
InInteriors: "Interiörer"
KeyboardControls: |
@ -15,7 +11,6 @@ KeyboardControls: |
Shift+Vänsterpil > Avaktivera shader
Shift+Pil upp > Flytta shader upp
Shift+Pil ner > Flytta shader ner
MainPassDescription: "Flyttar scendata till postprocess-shaders. Kan ej slås på/av eller flyttas."
PostProcessHUD: "Postprocess HUD"
ResetShader: "Återställ shader to ursprungligt läge"
ShaderLocked: "Låst"

@ -1,18 +1,10 @@
main_pass {
wrap_s = clamp_to_edge;
wrap_t = clamp_to_edge;
internal_format = rgba;
source_type = unsigned_int;
source_format = rgba;
}
uniform_float uGamma {
default = 1.0;
step = 0.01;
min = 0.0;
max = 5.0;
display_name = "#{PostProcessing:GammaLevelName}";
description = "#{PostProcessing:GammaLevelDescription}";
display_name = "#{BuiltInShaders:GammaLevelName}";
description = "#{BuiltInShaders:GammaLevelDescription}";
}
uniform_float uContrast {
@ -20,8 +12,8 @@ uniform_float uContrast {
step = 0.01;
min = 0.0;
max = 5.0;
display_name = "#{PostProcessing:ContrastLevelName}";
description = "#{PostProcessing:ContrastLevelDescription}";
display_name = "#{BuiltInShaders:ContrastLevelName}";
description = "#{BuiltInShaders:ContrastLevelDescription}";
}
fragment main {
@ -39,9 +31,8 @@ fragment main {
}
technique {
description = "#{PostProcessing:MainPassDescription}";
description = "#{BuiltInShaders:AdjustmentsDescription}";
version = "1.0";
author = "OpenMW";
passes = main;
hdr = false;
}

@ -0,0 +1,45 @@
uniform_bool uDisplayDepth {
header = "#{BuiltInShaders:DebugHeaderDepth}";
default = true;
display_name = "#{BuiltInShaders:DisplayDepthName}";
}
uniform_float uDepthFactor {
step = 0.1;
min = 0.01;
max = 20.0;
default = 1.0;
display_name = "#{BuiltInShaders:DisplayDepthFactorName}";
description = "#{BuiltInShaders:DisplayDepthFactorDescription}";
}
uniform_bool uDisplayNormals {
header = "#{BuiltInShaders:DebugHeaderNormals}";
default = true;
display_name = "#{BuiltInShaders:DisplayNormalsName}";
}
fragment main {
omw_In vec2 omw_TexCoord;
void main()
{
omw_FragColor = omw_GetLastShader(omw_TexCoord);
if (uDisplayDepth)
omw_FragColor = vec4(vec3(omw_GetLinearDepth(omw_TexCoord) / omw.far * uDepthFactor), 1.0);
#if OMW_NORMALS
if (uDisplayNormals && (!uDisplayDepth || omw_TexCoord.x < 0.5))
omw_FragColor.rgb = omw_GetNormals(omw_TexCoord);
#endif
}
}
technique {
passes = main;
description = "#{BuiltInShaders:DebugDescription}";
author = "OpenMW";
version = "1.0";
pass_normals = true;
}

@ -1,25 +0,0 @@
uniform_float uFactor {
step = 0.1;
min = 0.01;
max = 20.0;
default = 1.0;
display_name = "#{BuiltInShaders:DisplayDepthFactorName}";
description = "#{BuiltInShaders:DisplayDepthFactorDescription}";
}
fragment main {
omw_In vec2 omw_TexCoord;
void main()
{
omw_FragColor = vec4(vec3(omw_GetLinearDepth(omw_TexCoord) / omw.far * uFactor), 1.0);
}
}
technique {
passes = main;
description = "#{BuiltInShaders:DisplayDepthDescription}";
author = "OpenMW";
version = "1.0";
}
Loading…
Cancel
Save