Try a fix for nvidia and GI
This commit is contained in:
parent
49779d36bf
commit
f9c692052e
@ -3,22 +3,16 @@ in vec2 Texcoord;
|
|||||||
|
|
||||||
#ifndef VSLayer
|
#ifndef VSLayer
|
||||||
out int layer;
|
out int layer;
|
||||||
out vec2 uv_in;
|
|
||||||
#else
|
#else
|
||||||
out vec2 uv;
|
|
||||||
flat out int slice;
|
flat out int slice;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
#ifdef VSLayer
|
#ifdef VSLayer
|
||||||
gl_Layer = gl_InstanceID;
|
gl_Layer = gl_InstanceID;
|
||||||
uv = Texcoord;
|
|
||||||
slice = gl_InstanceID;
|
slice = gl_InstanceID;
|
||||||
#else
|
#else
|
||||||
layer = gl_InstanceID;
|
layer = gl_InstanceID;
|
||||||
uv_in = Texcoord;
|
|
||||||
#endif
|
#endif
|
||||||
gl_Position = vec4(Position, 0., 1.);
|
gl_Position = vec4(Position, 0., 1.);
|
||||||
}
|
}
|
||||||
|
11
data/shaders/slicedscreenquad_nvworkaround.vert
Normal file
11
data/shaders/slicedscreenquad_nvworkaround.vert
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
uniform int slice;
|
||||||
|
|
||||||
|
in vec2 Position;
|
||||||
|
in vec2 Texcoord;
|
||||||
|
|
||||||
|
out int layer;
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
layer = slice;
|
||||||
|
gl_Position = vec4(Position, 0., 1.);
|
||||||
|
}
|
@ -466,11 +466,15 @@ void IrrDriver::initDevice()
|
|||||||
Log::info("IrrDriver", "OpenGL version string: %s", glGetString(GL_VERSION));
|
Log::info("IrrDriver", "OpenGL version string: %s", glGetString(GL_VERSION));
|
||||||
|
|
||||||
m_need_ubo_workaround = false;
|
m_need_ubo_workaround = false;
|
||||||
|
m_need_rh_workaround = false;
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
// Fix for Intel Sandy Bridge on Windows which supports GL up to 3.1 only
|
// Fix for Intel Sandy Bridge on Windows which supports GL up to 3.1 only
|
||||||
if (strstr((const char *)glGetString(GL_VENDOR), "Intel") != nullptr && (GLMajorVersion == 3 && GLMinorVersion == 1))
|
if (strstr((const char *)glGetString(GL_VENDOR), "Intel") != nullptr && (GLMajorVersion == 3 && GLMinorVersion == 1))
|
||||||
m_need_ubo_workaround = true;
|
m_need_ubo_workaround = true;
|
||||||
#endif
|
#endif
|
||||||
|
// Fix for Nvidia and instanced RH
|
||||||
|
if (strstr((const char *)glGetString(GL_VENDOR), "NVIDIA") != nullptr)
|
||||||
|
m_need_rh_workaround = true;
|
||||||
}
|
}
|
||||||
m_glsl = (GLMajorVersion > 3 || (GLMajorVersion == 3 && GLMinorVersion >= 1));
|
m_glsl = (GLMajorVersion > 3 || (GLMajorVersion == 3 && GLMinorVersion >= 1));
|
||||||
|
|
||||||
|
@ -197,6 +197,7 @@ private:
|
|||||||
int GLMajorVersion, GLMinorVersion;
|
int GLMajorVersion, GLMinorVersion;
|
||||||
bool hasVSLayer;
|
bool hasVSLayer;
|
||||||
bool m_need_ubo_workaround;
|
bool m_need_ubo_workaround;
|
||||||
|
bool m_need_rh_workaround;
|
||||||
/** The irrlicht device. */
|
/** The irrlicht device. */
|
||||||
IrrlichtDevice *m_device;
|
IrrlichtDevice *m_device;
|
||||||
/** Irrlicht scene manager. */
|
/** Irrlicht scene manager. */
|
||||||
@ -284,6 +285,11 @@ public:
|
|||||||
return m_need_ubo_workaround;
|
return m_need_ubo_workaround;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool needRHWorkaround() const
|
||||||
|
{
|
||||||
|
return m_need_ubo_workaround;
|
||||||
|
}
|
||||||
|
|
||||||
bool hasVSLayerExtension() const
|
bool hasVSLayerExtension() const
|
||||||
{
|
{
|
||||||
return hasVSLayer;
|
return hasVSLayer;
|
||||||
|
@ -136,13 +136,28 @@ void IrrDriver::renderLights(unsigned pointlightcount)
|
|||||||
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_RH));
|
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_RH));
|
||||||
glDisable(GL_BLEND);
|
glDisable(GL_BLEND);
|
||||||
m_rtts->getRH().Bind();
|
m_rtts->getRH().Bind();
|
||||||
glUseProgram(FullScreenShader::RadianceHintsConstructionShader::getInstance()->Program);
|
|
||||||
glBindVertexArray(SharedObject::FullScreenQuadVAO);
|
glBindVertexArray(SharedObject::FullScreenQuadVAO);
|
||||||
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_ctex, m_rtts->getRSM().getRTT()[0], GL_LINEAR, GL_LINEAR);
|
if (irr_driver->needRHWorkaround())
|
||||||
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_ntex, m_rtts->getRSM().getRTT()[1], GL_LINEAR, GL_LINEAR);
|
{
|
||||||
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_dtex, m_rtts->getRSM().getDepthTexture(), GL_LINEAR, GL_LINEAR);
|
glUseProgram(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->Program);
|
||||||
FullScreenShader::RadianceHintsConstructionShader::getInstance()->setUniforms(rsm_matrix, rh_matrix, rh_extend);
|
setTexture(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->TU_ctex, m_rtts->getRSM().getRTT()[0], GL_LINEAR, GL_LINEAR);
|
||||||
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 32);
|
setTexture(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->TU_ntex, m_rtts->getRSM().getRTT()[1], GL_LINEAR, GL_LINEAR);
|
||||||
|
setTexture(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->TU_dtex, m_rtts->getRSM().getDepthTexture(), GL_LINEAR, GL_LINEAR);
|
||||||
|
for (unsigned i = 0; i < 32; i++)
|
||||||
|
{
|
||||||
|
FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->setUniforms(rsm_matrix, rh_matrix, rh_extend, i);
|
||||||
|
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glUseProgram(FullScreenShader::RadianceHintsConstructionShader::getInstance()->Program);
|
||||||
|
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_ctex, m_rtts->getRSM().getRTT()[0], GL_LINEAR, GL_LINEAR);
|
||||||
|
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_ntex, m_rtts->getRSM().getRTT()[1], GL_LINEAR, GL_LINEAR);
|
||||||
|
setTexture(FullScreenShader::RadianceHintsConstructionShader::getInstance()->TU_dtex, m_rtts->getRSM().getDepthTexture(), GL_LINEAR, GL_LINEAR);
|
||||||
|
FullScreenShader::RadianceHintsConstructionShader::getInstance()->setUniforms(rsm_matrix, rh_matrix, rh_extend);
|
||||||
|
glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, 32);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned i = 0; i < sun_ortho_matrix.size(); i++)
|
for (unsigned i = 0; i < sun_ortho_matrix.size(); i++)
|
||||||
|
@ -1584,6 +1584,22 @@ namespace FullScreenShader
|
|||||||
AssignTextureUnit(Program, TexUnit(TU_ctex, "ctex"), TexUnit(TU_ntex, "ntex"), TexUnit(TU_dtex, "dtex"));
|
AssignTextureUnit(Program, TexUnit(TU_ctex, "ctex"), TexUnit(TU_ntex, "ntex"), TexUnit(TU_dtex, "dtex"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NVWorkaroundRadianceHintsConstructionShader::NVWorkaroundRadianceHintsConstructionShader()
|
||||||
|
{
|
||||||
|
if (irr_driver->getGLSLVersion() < 150)
|
||||||
|
return;
|
||||||
|
Program = LoadProgram(
|
||||||
|
GL_VERTEX_SHADER, file_manager->getAsset("shaders/slicedscreenquad_nvworkaround.vert").c_str(),
|
||||||
|
GL_GEOMETRY_SHADER, file_manager->getAsset("shaders/rhpassthrough.geom").c_str(),
|
||||||
|
GL_FRAGMENT_SHADER, file_manager->getAsset("shaders/rh.frag").c_str());
|
||||||
|
|
||||||
|
AssignUniforms("RSMMatrix", "RHMatrix", "extents", "slice");
|
||||||
|
TU_ctex = 0;
|
||||||
|
TU_ntex = 1;
|
||||||
|
TU_dtex = 2;
|
||||||
|
AssignTextureUnit(Program, TexUnit(TU_ctex, "ctex"), TexUnit(TU_ntex, "ntex"), TexUnit(TU_dtex, "dtex"));
|
||||||
|
}
|
||||||
|
|
||||||
RHDebug::RHDebug()
|
RHDebug::RHDebug()
|
||||||
{
|
{
|
||||||
Program = LoadProgram(
|
Program = LoadProgram(
|
||||||
|
@ -588,6 +588,15 @@ public:
|
|||||||
RadianceHintsConstructionShader();
|
RadianceHintsConstructionShader();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Workaround for a bug found in kepler nvidia linux and fermi nvidia windows
|
||||||
|
class NVWorkaroundRadianceHintsConstructionShader : public ShaderHelperSingleton<NVWorkaroundRadianceHintsConstructionShader, core::matrix4, core::matrix4, core::vector3df, int>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GLuint TU_ctex, TU_ntex, TU_dtex;
|
||||||
|
|
||||||
|
NVWorkaroundRadianceHintsConstructionShader();
|
||||||
|
};
|
||||||
|
|
||||||
class RHDebug : public ShaderHelperSingleton<RHDebug, core::matrix4, core::vector3df>
|
class RHDebug : public ShaderHelperSingleton<RHDebug, core::matrix4, core::vector3df>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user