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
|
||||
out int layer;
|
||||
out vec2 uv_in;
|
||||
#else
|
||||
out vec2 uv;
|
||||
flat out int slice;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
void main() {
|
||||
#ifdef VSLayer
|
||||
gl_Layer = gl_InstanceID;
|
||||
uv = Texcoord;
|
||||
slice = gl_InstanceID;
|
||||
#else
|
||||
layer = gl_InstanceID;
|
||||
uv_in = Texcoord;
|
||||
#endif
|
||||
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));
|
||||
|
||||
m_need_ubo_workaround = false;
|
||||
m_need_rh_workaround = false;
|
||||
#ifdef WIN32
|
||||
// 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))
|
||||
m_need_ubo_workaround = true;
|
||||
#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));
|
||||
|
||||
|
@ -197,6 +197,7 @@ private:
|
||||
int GLMajorVersion, GLMinorVersion;
|
||||
bool hasVSLayer;
|
||||
bool m_need_ubo_workaround;
|
||||
bool m_need_rh_workaround;
|
||||
/** The irrlicht device. */
|
||||
IrrlichtDevice *m_device;
|
||||
/** Irrlicht scene manager. */
|
||||
@ -284,6 +285,11 @@ public:
|
||||
return m_need_ubo_workaround;
|
||||
}
|
||||
|
||||
bool needRHWorkaround() const
|
||||
{
|
||||
return m_need_ubo_workaround;
|
||||
}
|
||||
|
||||
bool hasVSLayerExtension() const
|
||||
{
|
||||
return hasVSLayer;
|
||||
|
@ -136,13 +136,28 @@ void IrrDriver::renderLights(unsigned pointlightcount)
|
||||
ScopedGPUTimer timer(irr_driver->getGPUTimer(Q_RH));
|
||||
glDisable(GL_BLEND);
|
||||
m_rtts->getRH().Bind();
|
||||
glUseProgram(FullScreenShader::RadianceHintsConstructionShader::getInstance()->Program);
|
||||
glBindVertexArray(SharedObject::FullScreenQuadVAO);
|
||||
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);
|
||||
if (irr_driver->needRHWorkaround())
|
||||
{
|
||||
glUseProgram(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->Program);
|
||||
setTexture(FullScreenShader::NVWorkaroundRadianceHintsConstructionShader::getInstance()->TU_ctex, m_rtts->getRSM().getRTT()[0], GL_LINEAR, GL_LINEAR);
|
||||
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++)
|
||||
|
@ -1584,6 +1584,22 @@ namespace FullScreenShader
|
||||
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()
|
||||
{
|
||||
Program = LoadProgram(
|
||||
|
@ -588,6 +588,15 @@ public:
|
||||
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>
|
||||
{
|
||||
public:
|
||||
|
Loading…
x
Reference in New Issue
Block a user