1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-02-04 05:45:33 +00:00

working commit

This commit is contained in:
Mads Buvik Sandvei 2020-08-06 00:54:45 +02:00
parent aa094b568e
commit b3f2373875
14 changed files with 152 additions and 22 deletions

View file

@ -15,6 +15,7 @@
#include <osg/ComputeBoundsVisitor> #include <osg/ComputeBoundsVisitor>
#include <osg/ShapeDrawable> #include <osg/ShapeDrawable>
#include <osg/TextureCubeMap> #include <osg/TextureCubeMap>
#include <osg/ViewportIndexed>
#include <osgUtil/LineSegmentIntersector> #include <osgUtil/LineSegmentIntersector>
@ -207,8 +208,9 @@ namespace MWRender
resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem); resourceSystem->getSceneManager()->setParticleSystemMask(MWRender::Mask_ParticleSystem);
resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders"); resourceSystem->getSceneManager()->setShaderPath(resourcePath + "/shaders");
// Shadows and radial fog have problems with fixed-function mode // Shadows and radial fog have problems with fixed-function mode
bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders") || Settings::Manager::getBool("force shaders", "Shaders") || Settings::Manager::getBool("enable shadows", "Shadows"); //bool forceShaders = Settings::Manager::getBool("radial fog", "Shaders") || Settings::Manager::getBool("force shaders", "Shaders") || Settings::Manager::getBool("enable shadows", "Shadows");
resourceSystem->getSceneManager()->setForceShaders(forceShaders); //resourceSystem->getSceneManager()->setForceShaders(forceShaders);
resourceSystem->getSceneManager()->setForceShaders(true);
// FIXME: calling dummy method because terrain needs to know whether lighting is clamped // FIXME: calling dummy method because terrain needs to know whether lighting is clamped
resourceSystem->getSceneManager()->setClampLighting(Settings::Manager::getBool("clamp lighting", "Shaders")); resourceSystem->getSceneManager()->setClampLighting(Settings::Manager::getBool("clamp lighting", "Shaders"));
resourceSystem->getSceneManager()->setAutoUseNormalMaps(Settings::Manager::getBool("auto use object normal maps", "Shaders")); resourceSystem->getSceneManager()->setAutoUseNormalMaps(Settings::Manager::getBool("auto use object normal maps", "Shaders"));
@ -370,11 +372,27 @@ namespace MWRender
mFirstPersonFieldOfView = std::min(std::max(1.f, firstPersonFov), 179.f); mFirstPersonFieldOfView = std::min(std::max(1.f, firstPersonFov), 179.f);
mStateUpdater->setFogEnd(mViewDistance); mStateUpdater->setFogEnd(mViewDistance);
////// Indexed viewports and related uniforms
sceneRoot->getOrCreateStateSet()->addUniform(new osg::Uniform(osg::Uniform::FLOAT_MAT4, "stereoViewOffsets", 2));
sceneRoot->getOrCreateStateSet()->addUniform(new osg::Uniform(osg::Uniform::FLOAT_MAT4, "stereoProjections", 2));
mUniformStereoViewOffsets = sceneRoot->getOrCreateStateSet()->getUniform("stereoViewOffsets");
mUniformStereoProjections = sceneRoot->getOrCreateStateSet()->getUniform("stereoProjections");
mUniformStereoViewOffsets->setElement(0, osg::Matrix::identity());
mUniformStereoViewOffsets->setElement(1, osg::Matrix::identity());
auto width = mViewer->getCamera()->getViewport()->width();
auto height = mViewer->getCamera()->getViewport()->height();
sceneRoot->getOrCreateStateSet()->setAttribute(new osg::ViewportIndexed(0, 0, 0, width / 2, height));
sceneRoot->getOrCreateStateSet()->setAttribute(new osg::ViewportIndexed(1, width / 2, 0, width / 2, height));
////// Near far uniforms
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip)); mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("near", mNearClip));
mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mViewDistance)); mRootNode->getOrCreateStateSet()->addUniform(new osg::Uniform("far", mViewDistance));
mUniformNear = mRootNode->getOrCreateStateSet()->getUniform("near"); mUniformNear = mRootNode->getOrCreateStateSet()->getUniform("near");
mUniformFar = mRootNode->getOrCreateStateSet()->getUniform("far"); mUniformFar = mRootNode->getOrCreateStateSet()->getUniform("far");
updateProjectionMatrix(); updateProjectionMatrix();
} }
@ -1225,6 +1243,9 @@ namespace MWRender
fov = mFieldOfViewOverride; fov = mFieldOfViewOverride;
mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mViewDistance); mViewer->getCamera()->setProjectionMatrixAsPerspective(fov, aspect, mNearClip, mViewDistance);
mUniformStereoProjections->setElement(0, mViewer->getCamera()->getProjectionMatrix());
mUniformStereoProjections->setElement(1, mViewer->getCamera()->getProjectionMatrix());
mUniformNear->set(mNearClip); mUniformNear->set(mNearClip);
mUniformFar->set(mViewDistance); mUniformFar->set(mViewDistance);

View file

@ -108,6 +108,8 @@ namespace MWRender
osg::Uniform* mUniformNear; osg::Uniform* mUniformNear;
osg::Uniform* mUniformFar; osg::Uniform* mUniformFar;
osg::Uniform* mUniformStereoViewOffsets;
osg::Uniform* mUniformStereoProjections;
void preloadCommonAssets(); void preloadCommonAssets();

View file

@ -763,7 +763,7 @@ namespace Resource
Shader::ShaderVisitor *SceneManager::createShaderVisitor() Shader::ShaderVisitor *SceneManager::createShaderVisitor()
{ {
Shader::ShaderVisitor* shaderVisitor = new Shader::ShaderVisitor(*mShaderManager.get(), *mImageManager, "objects_vertex.glsl", "objects_fragment.glsl"); Shader::ShaderVisitor* shaderVisitor = new Shader::ShaderVisitor(*mShaderManager.get(), *mImageManager, "objects_vertex.glsl", "objects_fragment.glsl", "objects_geometry.glsl");
shaderVisitor->setForceShaders(mForceShaders); shaderVisitor->setForceShaders(mForceShaders);
shaderVisitor->setAutoUseNormalMaps(mAutoUseNormalMaps); shaderVisitor->setAutoUseNormalMaps(mAutoUseNormalMaps);
shaderVisitor->setNormalMapPattern(mNormalMapPattern); shaderVisitor->setNormalMapPattern(mNormalMapPattern);

View file

@ -37,7 +37,7 @@ namespace Shader
} }
ShaderVisitor::ShaderVisitor(ShaderManager& shaderManager, Resource::ImageManager& imageManager, const std::string &defaultVsTemplate, const std::string &defaultFsTemplate) ShaderVisitor::ShaderVisitor(ShaderManager& shaderManager, Resource::ImageManager& imageManager, const std::string &defaultVsTemplate, const std::string &defaultFsTemplate, const std::string& defaultGsTemplate)
: osg::NodeVisitor(TRAVERSE_ALL_CHILDREN) : osg::NodeVisitor(TRAVERSE_ALL_CHILDREN)
, mForceShaders(false) , mForceShaders(false)
, mAllowedToModifyStateSets(true) , mAllowedToModifyStateSets(true)
@ -47,6 +47,7 @@ namespace Shader
, mImageManager(imageManager) , mImageManager(imageManager)
, mDefaultVsTemplate(defaultVsTemplate) , mDefaultVsTemplate(defaultVsTemplate)
, mDefaultFsTemplate(defaultFsTemplate) , mDefaultFsTemplate(defaultFsTemplate)
, mDefaultGsTemplate(defaultGsTemplate)
{ {
mRequirements.push_back(ShaderRequirements()); mRequirements.push_back(ShaderRequirements());
} }
@ -349,10 +350,12 @@ namespace Shader
osg::ref_ptr<osg::Shader> vertexShader (mShaderManager.getShader(mDefaultVsTemplate, defineMap, osg::Shader::VERTEX)); osg::ref_ptr<osg::Shader> vertexShader (mShaderManager.getShader(mDefaultVsTemplate, defineMap, osg::Shader::VERTEX));
osg::ref_ptr<osg::Shader> fragmentShader (mShaderManager.getShader(mDefaultFsTemplate, defineMap, osg::Shader::FRAGMENT)); osg::ref_ptr<osg::Shader> fragmentShader (mShaderManager.getShader(mDefaultFsTemplate, defineMap, osg::Shader::FRAGMENT));
osg::ref_ptr<osg::Shader> geometryShader (mShaderManager.getShader(mDefaultGsTemplate, defineMap, osg::Shader::GEOMETRY));
//osg::ref_ptr<osg::Shader> geometryShader = nullptr;
if (vertexShader && fragmentShader) if (vertexShader && fragmentShader)
{ {
writableStateSet->setAttributeAndModes(mShaderManager.getProgram(vertexShader, fragmentShader), osg::StateAttribute::ON); writableStateSet->setAttributeAndModes(mShaderManager.getProgram(vertexShader, fragmentShader, geometryShader), osg::StateAttribute::ON);
for (std::map<int, std::string>::const_iterator texIt = reqs.mTextures.begin(); texIt != reqs.mTextures.end(); ++texIt) for (std::map<int, std::string>::const_iterator texIt = reqs.mTextures.begin(); texIt != reqs.mTextures.end(); ++texIt)
{ {

View file

@ -17,7 +17,7 @@ namespace Shader
class ShaderVisitor : public osg::NodeVisitor class ShaderVisitor : public osg::NodeVisitor
{ {
public: public:
ShaderVisitor(ShaderManager& shaderManager, Resource::ImageManager& imageManager, const std::string& defaultVsTemplate, const std::string& defaultFsTemplate); ShaderVisitor(ShaderManager& shaderManager, Resource::ImageManager& imageManager, const std::string& defaultVsTemplate, const std::string& defaultFsTemplate, const std::string& defaultGsTemplate);
/// By default, only bump mapped objects will have a shader added to them. /// By default, only bump mapped objects will have a shader added to them.
/// Setting force = true will cause all objects to render using shaders, regardless of having a bump map. /// Setting force = true will cause all objects to render using shaders, regardless of having a bump map.
@ -89,6 +89,7 @@ namespace Shader
std::string mDefaultVsTemplate; std::string mDefaultVsTemplate;
std::string mDefaultFsTemplate; std::string mDefaultFsTemplate;
std::string mDefaultGsTemplate;
void createProgram(const ShaderRequirements& reqs); void createProgram(const ShaderRequirements& reqs);
bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs); bool adjustGeometry(osg::Geometry& sourceGeometry, const ShaderRequirements& reqs);

View file

@ -234,6 +234,8 @@ namespace Terrain
defineMap["parallax"] = (it->mNormalMap && it->mParallax) ? "1" : "0"; defineMap["parallax"] = (it->mNormalMap && it->mParallax) ? "1" : "0";
osg::ref_ptr<osg::Shader> vertexShader = shaderManager->getShader("terrain_vertex.glsl", defineMap, osg::Shader::VERTEX); osg::ref_ptr<osg::Shader> vertexShader = shaderManager->getShader("terrain_vertex.glsl", defineMap, osg::Shader::VERTEX);
osg::ref_ptr<osg::Shader> geometryShader = shaderManager->getShader("terrain_geometry.glsl", defineMap, osg::Shader::GEOMETRY);
//osg::ref_ptr<osg::Shader> geometryShader = nullptr;
osg::ref_ptr<osg::Shader> fragmentShader = shaderManager->getShader("terrain_fragment.glsl", defineMap, osg::Shader::FRAGMENT); osg::ref_ptr<osg::Shader> fragmentShader = shaderManager->getShader("terrain_fragment.glsl", defineMap, osg::Shader::FRAGMENT);
if (!vertexShader || !fragmentShader) if (!vertexShader || !fragmentShader)
{ {
@ -241,7 +243,7 @@ namespace Terrain
return createPasses(false, shaderManager, layers, blendmaps, blendmapScale, layerTileSize); return createPasses(false, shaderManager, layers, blendmaps, blendmapScale, layerTileSize);
} }
stateset->setAttributeAndModes(shaderManager->getProgram(vertexShader, fragmentShader)); stateset->setAttributeAndModes(shaderManager->getProgram(vertexShader, fragmentShader, geometryShader));
stateset->addUniform(new osg::Uniform("colorMode", 2)); stateset->addUniform(new osg::Uniform("colorMode", 2));
} }
else else

View file

@ -11,17 +11,21 @@ set(SHADER_FILES
water_fragment.glsl water_fragment.glsl
water_nm.png water_nm.png
objects_vertex.glsl objects_vertex.glsl
objects_geometry.glsl
objects_fragment.glsl objects_fragment.glsl
terrain_vertex.glsl terrain_vertex.glsl
terrain_geometry.glsl
terrain_fragment.glsl terrain_fragment.glsl
lighting.glsl lighting.glsl
parallax.glsl parallax.glsl
s360_fragment.glsl s360_fragment.glsl
s360_vertex.glsl s360_vertex.glsl
shadows_vertex.glsl shadows_vertex.glsl
shadows_geometry.glsl
shadows_fragment.glsl shadows_fragment.glsl
shadowcasting_vertex.glsl shadowcasting_vertex.glsl
shadowcasting_fragment.glsl shadowcasting_fragment.glsl
interface_util.glsl
) )
copy_all_resource_files(${CMAKE_CURRENT_SOURCE_DIR} ${OPENMW_SHADERS_ROOT} ${DDIRRELATIVE} "${SHADER_FILES}") copy_all_resource_files(${CMAKE_CURRENT_SOURCE_DIR} ${OPENMW_SHADERS_ROOT} ${DDIRRELATIVE} "${SHADER_FILES}")

View file

@ -0,0 +1,12 @@
// Because GLSL is an abomination we have to mangle the names of all
// vertex outputs when using a geometry shader.
#ifndef INTERFACE_UTIL_GLSL
#define INTERFACE_UTIL_GLSL
#if 1 // Placeholder
#define VS_NAME(name) vertex_##name
#else
#define VS_NAME(name) name
#endif
#endif // INTERFACE_UTIL_GLSL

View file

@ -0,0 +1,17 @@
#version 330 core
#extension GL_NV_viewport_array : enable
#extension GL_ARB_gpu_shader5 : enable
layout (triangles, invocations = 2) in;
layout (triangle_strip, max_vertices = 3) out;
#include "interface_util.glsl"
void main() {
for(int i = 0; i < gl_in.length(); i++)
{
gl_ViewportIndex = gl_InvocationID;
gl_Position = gl_in[i].gl_Position;
EmitVertex();
}
EndPrimitive();
}

View file

@ -1,5 +1,7 @@
#version 120 #version 120
#include "interface_util.glsl"
#if @diffuseMap #if @diffuseMap
varying vec2 diffuseMapUV; varying vec2 diffuseMapUV;
#endif #endif

View file

View file

@ -110,4 +110,6 @@ void main()
gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue); gl_FragData[0].xyz = mix(gl_FragData[0].xyz, gl_Fog.color.xyz, fogValue);
applyShadowDebugOverlay(); applyShadowDebugOverlay();
//gl_FragData[0] = vec4(passNormal,1);
} }

View file

@ -0,0 +1,61 @@
#version 330 core
#extension GL_NV_viewport_array : enable
#extension GL_ARB_gpu_shader5 : enable
layout (triangles, invocations = 2) in;
layout (triangle_strip, max_vertices = 3) out;
#include "interface_util.glsl"
#define PER_PIXEL_LIGHTING (@normalMap || @forcePPL)
#if !PER_PIXEL_LIGHTING
centroid in vec4 VS_NAME(lighting)[];
centroid in vec3 VS_NAME(shadowDiffuseLighting)[];
centroid out vec4 lighting;
centroid out vec3 shadowDiffuseLighting;
#endif
// TERRAIN INPUT
in vec2 VS_NAME(uv)[];
in float VS_NAME(euclideanDepth)[];
in float VS_NAME(linearDepth)[];
centroid in vec4 VS_NAME(passColor)[];
in vec3 VS_NAME(passViewPos)[];
in vec3 VS_NAME(passNormal)[];
#if(@shadows_enabled)
#endif
// TERRAIN OUTPUT
out vec2 uv;
out float euclideanDepth;
out float linearDepth;
centroid out vec4 passColor;
out vec3 passViewPos;
out vec3 passNormal;
void main() {
for(int i = 0; i < gl_in.length(); i++)
{
gl_ViewportIndex = gl_InvocationID;
gl_Position = gl_in[i].gl_Position;
uv = VS_NAME(uv)[i];
euclideanDepth = VS_NAME(euclideanDepth)[i];
linearDepth = VS_NAME(linearDepth)[i];
#if !PER_PIXEL_LIGHTING
lighting = VS_NAME(lighting)[i];
shadowDiffuseLighting = VS_NAME(shadowDiffuseLighting)[i];
#endif
passColor = VS_NAME(passColor)[i];
passViewPos = VS_NAME(passViewPos)[i];
passNormal = VS_NAME(passNormal)[i];
#if(@shadows_enabled)
#endif
EmitVertex();
}
EndPrimitive();
}

View file

@ -1,44 +1,47 @@
#version 120 #version 120
varying vec2 uv; #include "interface_util.glsl"
varying float euclideanDepth;
varying float linearDepth; varying vec2 VS_NAME(uv);
varying float VS_NAME(euclideanDepth);
varying float VS_NAME(linearDepth);
#define PER_PIXEL_LIGHTING (@normalMap || @forcePPL) #define PER_PIXEL_LIGHTING (@normalMap || @forcePPL)
#if !PER_PIXEL_LIGHTING #if !PER_PIXEL_LIGHTING
centroid varying vec4 lighting; centroid varying vec4 VS_NAME(lighting);
centroid varying vec3 shadowDiffuseLighting; centroid varying vec3 VS_NAME(shadowDiffuseLighting);
#endif #endif
centroid varying vec4 passColor; centroid varying vec4 VS_NAME(passColor);
varying vec3 passViewPos; varying vec3 VS_NAME(passViewPos);
varying vec3 passNormal; varying vec3 VS_NAME(passNormal);
#include "shadows_vertex.glsl" #include "shadows_vertex.glsl"
#include "lighting.glsl" #include "lighting.glsl"
void main(void) void main(void)
{ {
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
vec4 viewPos = (gl_ModelViewMatrix * gl_Vertex); vec4 viewPos = (gl_ModelViewMatrix * gl_Vertex);
gl_ClipVertex = viewPos; gl_ClipVertex = viewPos;
euclideanDepth = length(viewPos.xyz); VS_NAME(euclideanDepth) = length(viewPos.xyz);
linearDepth = gl_Position.z; VS_NAME(linearDepth) = gl_Position.z;
#if (!PER_PIXEL_LIGHTING || @shadows_enabled) #if (!PER_PIXEL_LIGHTING || @shadows_enabled)
vec3 viewNormal = normalize((gl_NormalMatrix * gl_Normal).xyz); vec3 viewNormal = normalize((gl_NormalMatrix * gl_Normal).xyz);
#endif #endif
#if !PER_PIXEL_LIGHTING #if !PER_PIXEL_LIGHTING
lighting = doLighting(viewPos.xyz, viewNormal, gl_Color, shadowDiffuseLighting); VS_NAME(lighting) = doLighting(viewPos.xyz, viewNormal, gl_Color, VS_NAME(shadowDiffuseLighting));
#endif #endif
passColor = gl_Color; VS_NAME(passColor) = gl_Color;
passNormal = gl_Normal.xyz; VS_NAME(passNormal) = gl_Normal.xyz;
passViewPos = viewPos.xyz; VS_NAME(passViewPos) = viewPos.xyz;
uv = gl_MultiTexCoord0.xy; VS_NAME(uv) = gl_MultiTexCoord0.xy;
#if (@shadows_enabled) #if (@shadows_enabled)
setupShadowCoords(viewPos, viewNormal); setupShadowCoords(viewPos, viewNormal);