This commit is contained in:
Sam 2018-01-26 10:52:23 +01:00
commit e75f1cb799
40 changed files with 354 additions and 615 deletions

View File

@ -108,10 +108,10 @@ To Build SuperTuxKart on Windows, follow these instructions:
1. Download and install Visual Studio from here: [Visual Studio - Download](https://www.visualstudio.com/downloads/). The free Visual Studio Community edition works fine. 1. Download and install Visual Studio from here: [Visual Studio - Download](https://www.visualstudio.com/downloads/). The free Visual Studio Community edition works fine.
2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it. 2. Download the SuperTuxKart source package from either [SuperTuxKart download area - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart/0.9.2) or [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), and unpack it.
*Note: If you downloaded the source package from here: [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), then both `stk-code` and `stk-assets` **must** be in the same directory, otherwise the build can result in failure* *Note: If you downloaded the source package from here: [SuperTuxKart.net - Source Control](https://supertuxkart.net/Source_control), then both `stk-code` and `stk-assets` **must** be in the same directory, otherwise the build can result in failure*
3. Download the Windows dependencies package from either [SuperTuxKart download area: Dependecies - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart%20Dependencies/Windows/) 3. Download the Windows dependencies package from either [SuperTuxKart download area: Dependencies - SourceForge.net](https://sourceforge.net/projects/supertuxkart/files/SuperTuxKart%20Dependencies/Windows/)
or [SuperTuxKart on GitHub - Dependencies](https://github.com/supertuxkart/dependencies), and unpack it; then, copy the `dependencies` directory from either the `windows` or the `windows_64bit` directories into the `stk-code` directory, rename it to `dependencies-64bit` if you want to compile a 64bit build. or [SuperTuxKart on GitHub - Dependencies](https://github.com/supertuxkart/dependencies), and unpack it; then, copy the `dependencies` directory from either the `windows` or the `windows_64bit` directories into the `stk-code` directory, rename it to `dependencies-64bit` if you want to compile a 64bit build.
4. Download CMake from here: [CMake - download page](https://cmake.org/download/), install it; once CMake is installed, double click on the CMake icon on your desktop, and point it towards your `stk-code` directory in the 'Where is the source code' field, and point it to a directory called `build` or `bld` inside the stk-code directory. 4. Download CMake from here: [CMake - download page](https://cmake.org/download/), install it; once CMake is installed, double click on the CMake icon on your desktop, and point it towards your `stk-code` directory in the 'Where is the source code' field, and point it to a directory called `build` or `bld` inside the stk-code directory.
5. Press 'Configure'; CMake will ask you if it is OK to create the aformentioned directory, press `Yes`. CMake will then ask you about your version of Visual Studio. 5. Press 'Configure'; CMake will ask you if it is OK to create the aforementioned directory, press `Yes`. CMake will then ask you about your version of Visual Studio.
Confirm your selection; *Please look at the table below to avoid confusion between version numbers and releases of Visual Studio*; Confirm your selection; *Please look at the table below to avoid confusion between version numbers and releases of Visual Studio*;
CMake will begin creating the required files for the build in the directory. CMake will begin creating the required files for the build in the directory.
6. Navigate to your build directory and open the `SuperTuxKart.sln` file; Visual Studio will now load the solution. 6. Navigate to your build directory and open the `SuperTuxKart.sln` file; Visual Studio will now load the solution.

View File

@ -10,12 +10,16 @@ out vec4 FragColor;
void main(void) void main(void)
{ {
float billboard_alpha = mix(1.0, texture(tex, tc).a, billboard_mix);
#if defined(Advanced_Lighting_Enabled)
vec2 xy = gl_FragCoord.xy / u_screen; vec2 xy = gl_FragCoord.xy / u_screen;
float FragZ = gl_FragCoord.z; float FragZ = gl_FragCoord.z;
vec4 FragmentPos = getPosFromUVDepth(vec3(xy, FragZ), u_inverse_projection_matrix); vec4 FragmentPos = getPosFromUVDepth(vec3(xy, FragZ), u_inverse_projection_matrix);
float EnvZ = texture(dtex, xy).x; float EnvZ = texture(dtex, xy).x;
vec4 EnvPos = getPosFromUVDepth(vec3(xy, EnvZ), u_inverse_projection_matrix); vec4 EnvPos = getPosFromUVDepth(vec3(xy, EnvZ), u_inverse_projection_matrix);
float alpha = clamp((EnvPos.z - FragmentPos.z) * 0.3, 0., 1.); float alpha = clamp((EnvPos.z - FragmentPos.z) * 0.3, 0., 1.);
float billboard_alpha = mix(1.0, texture(tex, tc).a, billboard_mix); #else
float alpha = 1.0;
#endif
FragColor = texture(tex, tc) * billboard_alpha * pc * alpha; FragColor = texture(tex, tc) * billboard_alpha * pc * alpha;
} }

View File

@ -100,18 +100,11 @@
<shadow-pass use-function="" unuse-function="" <shadow-pass use-function="" unuse-function=""
vertex-shader="sp_shadow.vert" fragment-shader="white.frag" vertex-shader="sp_shadow.vert" fragment-shader="white.frag"
skinned-mesh-shader="sp_skinning_shadow.vert"> skinned-mesh-shader="sp_skinning_shadow.vert">
<uniforms>
<!--
uniforms: Define the uniforms in shader with the name of the
type (int, float, mat4, vec4, vec3, vec2).
-->
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<!-- <!--
uniform-assigners: List of uniform assigners functions to be auto-run uniform-assigners: List of uniform assigners functions to be auto-run
when "use" the shader which set the above uniforms, when "use" the shader which set the uniform
currently there are: variables in shader, currently there are:
shadowCascadeUniformAssigner will set the current shadow shadowCascadeUniformAssigner will set the current shadow
cascade being drawn. cascade being drawn.
@ -127,6 +120,9 @@
You have to specify the uniform name in shader together with the You have to specify the uniform name in shader together with the
bundled uniform-assigners. bundled uniform-assigners.
Currently you can automatically assign to uniform type int, float,
mat4, vec4, vec3 and vec2 only.
--> -->
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -7,9 +7,6 @@
<shadow-pass vertex-shader="sp_shadow.vert" <shadow-pass vertex-shader="sp_shadow.vert"
fragment-shader="white.frag" fragment-shader="white.frag"
skinned-mesh-shader="sp_skinning_shadow.vert"> skinned-mesh-shader="sp_skinning_shadow.vert">
<uniforms>
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -7,9 +7,6 @@
<shadow-pass vertex-shader="sp_shadow.vert" <shadow-pass vertex-shader="sp_shadow.vert"
fragment-shader="sp_shadow_alpha_test.frag" fragment-shader="sp_shadow_alpha_test.frag"
skinned-mesh-shader="sp_skinning_shadow.vert"> skinned-mesh-shader="sp_skinning_shadow.vert">
<uniforms>
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -5,9 +5,6 @@
</first-pass> </first-pass>
<shadow-pass vertex-shader="sp_shadow.vert" fragment-shader="white.frag" <shadow-pass vertex-shader="sp_shadow.vert" fragment-shader="white.frag"
skinned-mesh-shader="sp_skinning_shadow.vert"> skinned-mesh-shader="sp_skinning_shadow.vert">
<uniforms>
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -2,16 +2,9 @@
<shader-info name="grass" use-alpha-channel="Y"/> <shader-info name="grass" use-alpha-channel="Y"/>
<first-pass vertex-shader="sp_grass_pass.vert" <first-pass vertex-shader="sp_grass_pass.vert"
fragment-shader="sp_grass.frag"> fragment-shader="sp_grass.frag">
<uniforms>
<uniform name="wind_direction" type="vec3"/>
</uniforms>
</first-pass> </first-pass>
<shadow-pass vertex-shader="sp_grass_shadow.vert" <shadow-pass vertex-shader="sp_grass_shadow.vert"
fragment-shader="sp_shadow_alpha_test.frag"> fragment-shader="sp_shadow_alpha_test.frag">
<uniforms>
<uniform name="wind_direction" type="vec3"/>
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -6,9 +6,6 @@
<shadow-pass vertex-shader="sp_shadow.vert" <shadow-pass vertex-shader="sp_shadow.vert"
fragment-shader="sp_shadow_alpha_test.frag" fragment-shader="sp_shadow_alpha_test.frag"
skinned-mesh-shader="sp_skinning_shadow.vert"> skinned-mesh-shader="sp_skinning_shadow.vert">
<uniforms>
<uniform name="layer" type="int"/>
</uniforms>
</shadow-pass> </shadow-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="layer" <uniform-assigner name="layer"

View File

@ -3,10 +3,6 @@
<first-pass use-function="alphaBlendUse" vertex-shader="sp_pass.vert" <first-pass use-function="alphaBlendUse" vertex-shader="sp_pass.vert"
fragment-shader="sp_transparent.frag" fragment-shader="sp_transparent.frag"
skinned-mesh-shader="sp_skinning.vert"> skinned-mesh-shader="sp_skinning.vert">
<uniforms>
<uniform name="fog_enabled" type="int"/>
<uniform name="custom_alpha" type="float"/>
</uniforms>
</first-pass> </first-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="fog_enabled" <uniform-assigner name="fog_enabled"

View File

@ -3,10 +3,6 @@
<first-pass use-function="additiveUse" vertex-shader="sp_pass.vert" <first-pass use-function="additiveUse" vertex-shader="sp_pass.vert"
fragment-shader="sp_transparent.frag" fragment-shader="sp_transparent.frag"
skinned-mesh-shader="sp_skinning.vert"> skinned-mesh-shader="sp_skinning.vert">
<uniforms>
<uniform name="fog_enabled" type="int"/>
<uniform name="custom_alpha" type="float"/>
</uniforms>
</first-pass> </first-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="fog_enabled" <uniform-assigner name="fog_enabled"

View File

@ -3,9 +3,6 @@
<first-pass use-function="ghostUse" vertex-shader="sp_pass.vert" <first-pass use-function="ghostUse" vertex-shader="sp_pass.vert"
fragment-shader="sp_ghost.frag" fragment-shader="sp_ghost.frag"
skinned-mesh-shader="sp_skinning.vert"> skinned-mesh-shader="sp_skinning.vert">
<uniforms>
<uniform name="custom_alpha" type="float"/>
</uniforms>
</first-pass> </first-pass>
<uniform-assigners> <uniform-assigners>
<uniform-assigner name="custom_alpha" <uniform-assigner name="custom_alpha"

View File

@ -1,5 +1,5 @@
# Modify this file to change the last-modified date when you add/remove a file. # Modify this file to change the last-modified date when you add/remove a file.
# This will then trigger a new cmake run automatically. # This will then trigger a new cmake run automatically.
file(GLOB_RECURSE STK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.hpp") file(GLOB_RECURSE STK_HEADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.hpp")
file(GLOB_RECURSE STK_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp") file(GLOB_RECURSE STK_SOURCES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "src/*.cpp")
file(GLOB_RECURSE STK_SHADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "data/shaders/*") file(GLOB_RECURSE STK_SHADERS RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} "data/shaders/*")

View File

@ -384,7 +384,7 @@ bool CentralVideoSettings::isTextureCompressionEnabled() const
return supportsTextureCompression() && UserConfigParams::m_texture_compression; return supportsTextureCompression() && UserConfigParams::m_texture_compression;
} }
bool CentralVideoSettings::isDefferedEnabled() const bool CentralVideoSettings::isDeferredEnabled() const
{ {
return UserConfigParams::m_dynamic_lights && !GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_ADVANCED_PIPELINE); return UserConfigParams::m_dynamic_lights && !GraphicsRestrictions::isDisabled(GraphicsRestrictions::GR_ADVANCED_PIPELINE);
} }

View File

@ -95,7 +95,7 @@ public:
// "Macro" around feature support and user config // "Macro" around feature support and user config
bool isShadowEnabled() const; bool isShadowEnabled() const;
bool isTextureCompressionEnabled() const; bool isTextureCompressionEnabled() const;
bool isDefferedEnabled() const; bool isDeferredEnabled() const;
}; };
extern CentralVideoSettings* CVS; extern CentralVideoSettings* CVS;

View File

@ -297,7 +297,8 @@ void CPUParticleManager::drawAll()
{ {
ParticleRenderer::getInstance()->setTextureUnits ParticleRenderer::getInstance()->setTextureUnits
(cur_mat->getTexture()->getOpenGLTextureName(), (cur_mat->getTexture()->getOpenGLTextureName(),
irr_driver->getDepthStencilTexture()); CVS->isDeferredEnabled() ?
irr_driver->getDepthStencilTexture() : 0);
ParticleRenderer::getInstance()->setUniforms(flips, billboard); ParticleRenderer::getInstance()->setUniforms(flips, billboard);
} }
else else

View File

@ -1,58 +0,0 @@
// Copyright (C) 2002-2015 Nikolaus Gebhardt
// This file is part of the "Irrlicht Engine".
// For conditions of distribution and use, see copyright notice in irrlicht.h
#ifndef __LARGE_MESH_BUFFER_H_INCLUDED__
#define __LARGE_MESH_BUFFER_H_INCLUDED__
#include "irrArray.h"
#include "IMeshBuffer.h"
#include "CMeshBuffer.h"
namespace irr
{
namespace scene
{
//! A SMeshBuffer with 32-bit indices
class LargeMeshBuffer : public SMeshBuffer
{
public:
//! Get type of index data which is stored in this meshbuffer.
/** \return Index type of this buffer. */
virtual video::E_INDEX_TYPE getIndexType() const
{
return video::EIT_32BIT;
}
//! Get pointer to indices
/** \return Pointer to indices. */
virtual const u16* getIndices() const
{
return (u16 *) Indices.const_pointer();
}
//! Get pointer to indices
/** \return Pointer to indices. */
virtual u16* getIndices()
{
return (u16 *) Indices.pointer();
}
//! Get number of indices
/** \return Number of indices. */
virtual u32 getIndexCount() const
{
return Indices.size();
}
//! Indices into the vertices of this buffer.
core::array<u32> Indices;
};
} // end namespace scene
} // end namespace irr
#endif

View File

@ -1134,7 +1134,8 @@ void PostProcessing::renderGodRays(scene::ICameraSceneNode * const camnode,
SP::SPUniformAssigner* glow_color_assigner = glow_shader SP::SPUniformAssigner* glow_color_assigner = glow_shader
->getUniformAssigner("col"); ->getUniformAssigner("col");
assert(glow_color_assigner != NULL); assert(glow_color_assigner != NULL);
glow_color_assigner->setValue(video::SColorf(track->getGodRaysColor())); video::SColorf cf(track->getGodRaysColor());
glow_color_assigner->setValue(core::vector3df(cf.r, cf.g, cf.b));
sun->draw(); sun->draw();
glow_shader->unuse(); glow_shader->unuse();
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);

View File

@ -162,7 +162,7 @@ Referee::Referee()
m_scene_node->setFrameLoop(m_st_first_start_frame, m_scene_node->setFrameLoop(m_st_first_start_frame,
m_st_last_start_frame); m_st_last_start_frame);
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (CVS->isGLSL() && CVS->isDefferedEnabled()) if (CVS->isGLSL() && CVS->isDeferredEnabled())
{ {
m_light = irr_driver->addLight(core::vector3df(0.0f, 0.0f, 0.6f), 0.7f, 2.0f, m_light = irr_driver->addLight(core::vector3df(0.0f, 0.0f, 0.6f), 0.7f, 2.0f,
0.7f /* r */, 0.0 /* g */, 0.0f /* b */, false /* sun */, m_scene_node); 0.7f /* r */, 0.0 /* g */, 0.0f /* b */, false /* sun */, m_scene_node);

View File

@ -53,11 +53,12 @@ static GLuint generateRTT(const core::dimension2du &res, GLint internalFormat, G
return result; return result;
} }
RTT::RTT(unsigned int width, unsigned int height, float rtt_scale) RTT::RTT(unsigned int width, unsigned int height, float rtt_scale,
bool use_default_fbo_only)
{ {
m_width = (unsigned int)(width * rtt_scale); m_width = (unsigned int)(width * rtt_scale);
m_height = (unsigned int)(height * rtt_scale); m_height = (unsigned int)(height * rtt_scale);
m_shadow_FBO = NULL; m_shadow_fbo = NULL;
using namespace video; using namespace video;
using namespace core; using namespace core;
@ -75,7 +76,10 @@ RTT::RTT(unsigned int width, unsigned int height, float rtt_scale)
unsigned linear_depth_mip_levels = int(ceilf(log2f( float(max_(res.Width, res.Height)) ))); unsigned linear_depth_mip_levels = int(ceilf(log2f( float(max_(res.Width, res.Height)) )));
DepthStencilTexture = generateRTT(res, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8); if (!use_default_fbo_only)
{
m_depth_stencil_tex = generateRTT(res, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8);
}
// All RTTs are currently RGBA16F mostly with stencil. The four tmp RTTs are the same size // All RTTs are currently RGBA16F mostly with stencil. The four tmp RTTs are the same size
// as the screen, for use in post-processing. // as the screen, for use in post-processing.
@ -89,7 +93,7 @@ RTT::RTT(unsigned int width, unsigned int height, float rtt_scale)
GLint diffuse_specular_internal_format = GL_R11F_G11F_B10F; GLint diffuse_specular_internal_format = GL_R11F_G11F_B10F;
GLint type = GL_FLOAT; GLint type = GL_FLOAT;
GLint rgb_internal_format = GL_RGBA8; GLint rgb_internal_format = GL_RGBA8;
#if defined(USE_GLES2) #if defined(USE_GLES2)
if (!CVS->isEXTColorBufferFloatUsable()) if (!CVS->isEXTColorBufferFloatUsable())
{ {
@ -103,190 +107,193 @@ RTT::RTT(unsigned int width, unsigned int height, float rtt_scale)
type = GL_UNSIGNED_BYTE; type = GL_UNSIGNED_BYTE;
} }
#endif #endif
if (!CVS->isDeferredEnabled())
RenderTargetTextures[RTT_TMP1] = generateRTT(res, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_TMP2] = generateRTT(res, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_TMP3] = generateRTT(res, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_TMP4] = generateRTT(res, red_internal_format, red_format, type);
RenderTargetTextures[RTT_LINEAR_DEPTH] = generateRTT(res, red32_internal_format, red_format, type, linear_depth_mip_levels);
RenderTargetTextures[RTT_NORMAL_AND_DEPTH] = generateRTT(res, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV);
RenderTargetTextures[RTT_COLOR] = generateRTT(res, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_MLAA_COLORS] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
RenderTargetTextures[RTT_MLAA_TMP] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
RenderTargetTextures[RTT_MLAA_BLEND] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
RenderTargetTextures[RTT_SSAO] = generateRTT(res, red_internal_format, red_format, type);
RenderTargetTextures[RTT_DISPLACE] = generateRTT(res, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_DIFFUSE] = generateRTT(res, diffuse_specular_internal_format, rgb_format, type);
RenderTargetTextures[RTT_SPECULAR] = generateRTT(res, diffuse_specular_internal_format, rgb_format, type);
RenderTargetTextures[RTT_HALF1] = generateRTT(half, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_QUARTER1] = generateRTT(quarter, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_EIGHTH1] = generateRTT(eighth, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_HALF1_R] = generateRTT(half, red_internal_format, red_format, type);
RenderTargetTextures[RTT_HALF2] = generateRTT(half, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_QUARTER2] = generateRTT(quarter, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_EIGHTH2] = generateRTT(eighth, rgba_internal_format, rgba_format, type);
RenderTargetTextures[RTT_HALF2_R] = generateRTT(half, red_internal_format, red_format, type);
RenderTargetTextures[RTT_BLOOM_1024] = generateRTT(shadowsize0, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_BLOOM_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_TMP_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_LENS_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_BLOOM_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_TMP_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_LENS_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_BLOOM_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_TMP_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_LENS_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
RenderTargetTextures[RTT_SP_GLOSS] = generateRTT(res, GL_RG8, GL_RG, GL_UNSIGNED_BYTE);
RenderTargetTextures[RTT_SP_DIFF_COLOR] = generateRTT(res, GL_RGBA8, rgb_format, GL_UNSIGNED_BYTE);
std::vector<GLuint> somevector;
somevector.push_back(RenderTargetTextures[RTT_SSAO]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_NORMAL_AND_DEPTH]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_DIFFUSE]);
somevector.push_back(RenderTargetTextures[RTT_SPECULAR]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_COLOR]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_DIFFUSE]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_SPECULAR]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_MLAA_COLORS]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_MLAA_BLEND]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_MLAA_TMP]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP1]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP2]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP4]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_LINEAR_DEPTH]);
FrameBuffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_HALF1]);
FrameBuffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_HALF1_R]);
FrameBuffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_HALF2]);
FrameBuffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_HALF2_R]);
FrameBuffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_QUARTER1]);
FrameBuffers.push_back(new FrameBuffer(somevector, quarter.Width, quarter.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_QUARTER2]);
FrameBuffers.push_back(new FrameBuffer(somevector, quarter.Width, quarter.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_EIGHTH1]);
FrameBuffers.push_back(new FrameBuffer(somevector, eighth.Width, eighth.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_EIGHTH2]);
FrameBuffers.push_back(new FrameBuffer(somevector, eighth.Width, eighth.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_DISPLACE]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_BLOOM_1024]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize0.Width, shadowsize0.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_BLOOM_512]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP_512]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_LENS_512]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_BLOOM_256]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP_256]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_LENS_256]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_BLOOM_128]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_TMP_128]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_LENS_128]);
FrameBuffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(RenderTargetTextures[RTT_SP_DIFF_COLOR]);
somevector.push_back(RenderTargetTextures[RTT_NORMAL_AND_DEPTH]);
somevector.push_back(RenderTargetTextures[RTT_SP_GLOSS]);
FrameBuffers.push_back(new FrameBuffer(somevector, DepthStencilTexture, res.Width, res.Height));
if (CVS->isShadowEnabled())
{ {
shadowDepthTex = generateRTT3D(GL_TEXTURE_2D_ARRAY, UserConfigParams::m_shadows_resolution, UserConfigParams::m_shadows_resolution, 4, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 1); // RTT is used in only deferred shading which need hdr framebuffer
somevector.clear(); rgba_internal_format = GL_RGBA8;
m_shadow_FBO = new FrameBufferLayer(somevector, shadowDepthTex, UserConfigParams::m_shadows_resolution, UserConfigParams::m_shadows_resolution, 4); type = GL_UNSIGNED_BYTE;
} }
// Clear this FBO to 1s so that if no SSAO is computed we can still use it. if (!use_default_fbo_only)
getFBO(FBO_HALF1_R).bind(); {
glClearColor(1., 1., 1., 1.); m_render_target_textures[RTT_COLOR] = generateRTT(res, rgba_internal_format, rgba_format, type);
glClear(GL_COLOR_BUFFER_BIT); }
if (CVS->isDeferredEnabled())
{
m_render_target_textures[RTT_NORMAL_AND_DEPTH] = generateRTT(res, GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV);
m_render_target_textures[RTT_TMP1] = generateRTT(res, rgba_internal_format, rgba_format, type);
m_render_target_textures[RTT_TMP2] = generateRTT(res, rgba_internal_format, rgba_format, type);
m_render_target_textures[RTT_TMP3] = generateRTT(res, rgba_internal_format, rgba_format, type);
m_render_target_textures[RTT_TMP4] = generateRTT(res, red_internal_format, red_format, type);
m_render_target_textures[RTT_LINEAR_DEPTH] = generateRTT(res, red32_internal_format, red_format, type, linear_depth_mip_levels);
m_render_target_textures[RTT_MLAA_COLORS] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
m_render_target_textures[RTT_MLAA_TMP] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
m_render_target_textures[RTT_MLAA_BLEND] = generateRTT(res, rgb_internal_format, rgb_format, GL_UNSIGNED_BYTE);
m_render_target_textures[RTT_SSAO] = generateRTT(res, red_internal_format, red_format, type);
m_render_target_textures[RTT_DISPLACE] = generateRTT(res, rgba_internal_format, rgba_format, type);
m_render_target_textures[RTT_DIFFUSE] = generateRTT(res, diffuse_specular_internal_format, rgb_format, type);
m_render_target_textures[RTT_SPECULAR] = generateRTT(res, diffuse_specular_internal_format, rgb_format, type);
getFBO(FBO_COMBINED_DIFFUSE_SPECULAR).bind(); m_render_target_textures[RTT_HALF1] = generateRTT(half, rgba_internal_format, rgba_format, type);
float color = 0.5; m_render_target_textures[RTT_QUARTER1] = generateRTT(quarter, rgba_internal_format, rgba_format, type);
#if defined(USE_GLES2) m_render_target_textures[RTT_EIGHTH1] = generateRTT(eighth, rgba_internal_format, rgba_format, type);
if (!CVS->isDefferedEnabled()) m_render_target_textures[RTT_HALF1_R] = generateRTT(half, red_internal_format, red_format, type);
color = pow(color, 1. / 2.2);
#endif m_render_target_textures[RTT_HALF2] = generateRTT(half, rgba_internal_format, rgba_format, type);
glClearColor(color, color, color, color); m_render_target_textures[RTT_QUARTER2] = generateRTT(quarter, rgba_internal_format, rgba_format, type);
glClear(GL_COLOR_BUFFER_BIT); m_render_target_textures[RTT_EIGHTH2] = generateRTT(eighth, rgba_internal_format, rgba_format, type);
m_render_target_textures[RTT_HALF2_R] = generateRTT(half, red_internal_format, red_format, type);
m_render_target_textures[RTT_BLOOM_1024] = generateRTT(shadowsize0, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_BLOOM_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_TMP_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_LENS_512] = generateRTT(shadowsize1, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_BLOOM_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_TMP_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_LENS_256] = generateRTT(shadowsize2, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_BLOOM_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_TMP_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_LENS_128] = generateRTT(shadowsize3, rgba_internal_format, rgb_format, type);
m_render_target_textures[RTT_SP_GLOSS] = generateRTT(res, GL_RG8, GL_RG, GL_UNSIGNED_BYTE);
m_render_target_textures[RTT_SP_DIFF_COLOR] = generateRTT(res, GL_RGBA8, rgb_format, GL_UNSIGNED_BYTE);
}
std::vector<GLuint> somevector;
if (!use_default_fbo_only)
{
somevector.push_back(m_render_target_textures[RTT_COLOR]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
}
if (CVS->isDeferredEnabled())
{
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_NORMAL_AND_DEPTH]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_SSAO]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_DIFFUSE]);
somevector.push_back(m_render_target_textures[RTT_SPECULAR]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_MLAA_COLORS]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_MLAA_BLEND]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_MLAA_TMP]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP1]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP2]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP4]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_LINEAR_DEPTH]);
m_frame_buffers.push_back(new FrameBuffer(somevector, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_HALF1]);
m_frame_buffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_HALF1_R]);
m_frame_buffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_HALF2]);
m_frame_buffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_HALF2_R]);
m_frame_buffers.push_back(new FrameBuffer(somevector, half.Width, half.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_QUARTER1]);
m_frame_buffers.push_back(new FrameBuffer(somevector, quarter.Width, quarter.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_QUARTER2]);
m_frame_buffers.push_back(new FrameBuffer(somevector, quarter.Width, quarter.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_EIGHTH1]);
m_frame_buffers.push_back(new FrameBuffer(somevector, eighth.Width, eighth.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_EIGHTH2]);
m_frame_buffers.push_back(new FrameBuffer(somevector, eighth.Width, eighth.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_DISPLACE]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_BLOOM_1024]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize0.Width, shadowsize0.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_BLOOM_512]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP_512]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_LENS_512]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize1.Width, shadowsize1.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_BLOOM_256]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP_256]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_LENS_256]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize2.Width, shadowsize2.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_BLOOM_128]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_TMP_128]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_LENS_128]);
m_frame_buffers.push_back(new FrameBuffer(somevector, shadowsize3.Width, shadowsize3.Height));
somevector.clear();
somevector.push_back(m_render_target_textures[RTT_SP_DIFF_COLOR]);
somevector.push_back(m_render_target_textures[RTT_NORMAL_AND_DEPTH]);
somevector.push_back(m_render_target_textures[RTT_SP_GLOSS]);
m_frame_buffers.push_back(new FrameBuffer(somevector, m_depth_stencil_tex, res.Width, res.Height));
if (CVS->isShadowEnabled())
{
m_shadow_depth_tex = generateRTT3D(GL_TEXTURE_2D_ARRAY, UserConfigParams::m_shadows_resolution, UserConfigParams::m_shadows_resolution, 4, GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 1);
somevector.clear();
m_shadow_fbo = new FrameBufferLayer(somevector, m_shadow_depth_tex, UserConfigParams::m_shadows_resolution, UserConfigParams::m_shadows_resolution, 4);
}
// Clear this FBO to 1s so that if no SSAO is computed we can still use it.
getFBO(FBO_HALF1_R).bind();
glClearColor(1., 1., 1., 1.);
glClear(GL_COLOR_BUFFER_BIT);
}
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }
RTT::~RTT() RTT::~RTT()
{ {
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
glDeleteTextures(RTT_COUNT, RenderTargetTextures); glDeleteTextures(RTT_COUNT, m_render_target_textures);
glDeleteTextures(1, &DepthStencilTexture); glDeleteTextures(1, &m_depth_stencil_tex);
if (CVS->isShadowEnabled()) if (CVS->isShadowEnabled())
{ {
delete m_shadow_FBO; delete m_shadow_fbo;
glDeleteTextures(1, &shadowDepthTex); glDeleteTextures(1, &m_shadow_depth_tex);
} }
} }

View File

@ -39,12 +39,10 @@ using irr::video::ITexture;
enum TypeFBO enum TypeFBO
{ {
FBO_SSAO,
FBO_NORMAL_AND_DEPTHS,
FBO_COMBINED_DIFFUSE_SPECULAR,
FBO_COLORS, FBO_COLORS,
FBO_DIFFUSE, FBO_NORMAL_AND_DEPTHS,
FBO_SPECULAR, FBO_SSAO,
FBO_COMBINED_DIFFUSE_SPECULAR,
FBO_MLAA_COLORS, FBO_MLAA_COLORS,
FBO_MLAA_BLEND, FBO_MLAA_BLEND,
FBO_MLAA_TMP, FBO_MLAA_TMP,
@ -79,13 +77,13 @@ enum TypeFBO
enum TypeRTT : unsigned int enum TypeRTT : unsigned int
{ {
RTT_TMP1 = 0, RTT_COLOR = 0,
RTT_NORMAL_AND_DEPTH,
RTT_TMP1,
RTT_TMP2, RTT_TMP2,
RTT_TMP3, RTT_TMP3,
RTT_TMP4, RTT_TMP4,
RTT_LINEAR_DEPTH, RTT_LINEAR_DEPTH,
RTT_NORMAL_AND_DEPTH,
RTT_COLOR,
RTT_DIFFUSE, RTT_DIFFUSE,
RTT_SPECULAR, RTT_SPECULAR,
@ -143,27 +141,36 @@ enum TypeRTT : unsigned int
class RTT class RTT
{ {
public: public:
RTT(unsigned int width, unsigned int height, float rtt_scale = 1.0f); RTT(unsigned int width, unsigned int height, float rtt_scale = 1.0f,
bool use_default_fbo_only = false);
~RTT(); ~RTT();
unsigned int getWidth () const { return m_width ; } unsigned int getWidth () const { return m_width ; }
unsigned int getHeight() const { return m_height; } unsigned int getHeight() const { return m_height; }
FrameBufferLayer* getShadowFrameBuffer() { return m_shadow_FBO; } FrameBufferLayer* getShadowFrameBuffer() { return m_shadow_fbo; }
unsigned getDepthStencilTexture() const { return DepthStencilTexture; } unsigned getDepthStencilTexture() const
unsigned getRenderTarget(enum TypeRTT target) const { return RenderTargetTextures[target]; } {
FrameBuffer& getFBO(enum TypeFBO fbo) { return FrameBuffers[fbo]; } assert(m_depth_stencil_tex != 0);
return m_depth_stencil_tex;
}
unsigned getRenderTarget(enum TypeRTT target) const
{
assert(m_render_target_textures[target] != 0);
return m_render_target_textures[target];
}
FrameBuffer& getFBO(enum TypeFBO fbo) { return m_frame_buffers[fbo]; }
private: private:
unsigned RenderTargetTextures[RTT_COUNT]; unsigned m_render_target_textures[RTT_COUNT] = {};
PtrVector<FrameBuffer> FrameBuffers; PtrVector<FrameBuffer> m_frame_buffers;
unsigned DepthStencilTexture; unsigned m_depth_stencil_tex = 0;
unsigned int m_width; unsigned int m_width;
unsigned int m_height; unsigned int m_height;
unsigned shadowDepthTex; unsigned m_shadow_depth_tex = 0;
FrameBufferLayer* m_shadow_FBO; FrameBufferLayer* m_shadow_fbo;
LEAK_CHECK(); LEAK_CHECK();
}; };

View File

@ -1,31 +0,0 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2014-2015 SuperTuxKart-Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "graphics/screen_quad.hpp"
// Just the static parts to our screenquad
const u16 ScreenQuad::indices[4] = {0, 1, 2, 3};
static const SColor white(255, 255, 255, 255);
const S3DVertex ScreenQuad::vertices[4] = {
S3DVertex(-1, 1, 0, 0, 1, 0, white, 0, 1),
S3DVertex(1, 1, 0, 0, 1, 0, white, 1, 1),
S3DVertex(-1, -1, 0, 0, 1, 0, white, 0, 0),
S3DVertex(1, -1, 0, 0, 1, 0, white, 1, 0),
};

View File

@ -1,90 +0,0 @@
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2014-2015 SuperTuxKart-Team
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef HEADER_SCREENQUAD_H
#define HEADER_SCREENQUAD_H
#include <SMaterial.h>
#include <IVideoDriver.h>
using namespace irr;
using namespace video;
class ScreenQuad {
public:
ScreenQuad(IVideoDriver *xy)
{
vd = xy;
mat.Lighting = false;
mat.ZBuffer = video::ECFN_ALWAYS;
mat.ZWriteEnable = false;
for(u32 c = 0; c < MATERIAL_MAX_TEXTURES; c++)
{
mat.TextureLayer[c].TextureWrapU = video::ETC_CLAMP_TO_EDGE;
mat.TextureLayer[c].TextureWrapV = video::ETC_CLAMP_TO_EDGE;
}
}
SMaterial& getMaterial() { return mat; }
//Set the texture to render with the quad
void setTexture(ITexture* tex, u32 layer = 0)
{
mat.TextureLayer[layer].Texture = tex;
}
ITexture* getTexture(u32 layer = 0) const { return mat.TextureLayer[layer].Texture; }
void setMaterialType(E_MATERIAL_TYPE mt) { mat.MaterialType = mt; }
void render(bool setRTToFrameBuff = true) const
{
if(setRTToFrameBuff)
vd->setRenderTarget(video::ERT_FRAME_BUFFER);
sq_dorender();
}
void render(ITexture* rt) const
{
vd->setRenderTarget(rt);
sq_dorender();
}
protected:
static const S3DVertex vertices[4];
static const u16 indices[4];
SMaterial mat;
IVideoDriver* vd;
void sq_dorender() const
{
vd->setMaterial(mat);
vd->setTransform(ETS_WORLD, core::IdentityMatrix);
vd->setTransform(ETS_VIEW, core::IdentityMatrix);
vd->setTransform(ETS_PROJECTION, core::IdentityMatrix);
vd->drawVertexPrimitiveList(vertices, 4, indices, 2, EVT_STANDARD,
scene::EPT_TRIANGLE_STRIP);
}
};
#endif

View File

@ -50,9 +50,6 @@
#include <algorithm> #include <algorithm>
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void ShaderBasedRenderer::setRTT(RTT* rtts) void ShaderBasedRenderer::setRTT(RTT* rtts)
{ {
m_rtts = rtts; m_rtts = rtts;
@ -111,8 +108,7 @@ void ShaderBasedRenderer::computeMatrixesAndCameras(scene::ICameraSceneNode *con
unsigned int width, unsigned int height) unsigned int width, unsigned int height)
{ {
m_current_screen_size = core::vector2df((float)width, (float)height); m_current_screen_size = core::vector2df((float)width, (float)height);
m_shadow_matrices.computeMatrixesAndCameras(camnode, width, height, m_shadow_matrices.computeMatrixesAndCameras(camnode, width, height);
m_rtts->getDepthStencilTexture());
} // computeMatrixesAndCameras } // computeMatrixesAndCameras
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -440,27 +436,6 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
glDisable(GL_BLEND); glDisable(GL_BLEND);
glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
if (!forceRTT)
{
// We need a cleared depth buffer for some effect (eg particles depth blending)
m_rtts->getFBO(FBO_NORMAL_AND_DEPTHS).bind();
// Bind() modifies the viewport. In order not to affect anything else,
// the viewport is just reset here and not removed in Bind().
const core::recti &vp = Camera::getActiveCamera()->getViewport();
glViewport(vp.UpperLeftCorner.X,
irr_driver->getActualScreenSize().Height - vp.LowerRightCorner.Y,
vp.LowerRightCorner.X - vp.UpperLeftCorner.X,
vp.LowerRightCorner.Y - vp.UpperLeftCorner.Y);
glClear(GL_DEPTH_BUFFER_BIT);
glBindFramebuffer(GL_FRAMEBUFFER, 0);
}
else
{
m_rtts->getFBO(FBO_NORMAL_AND_DEPTHS).bind();
glClearColor(0., 0., 0., 0.);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
}
if (forceRTT) if (forceRTT)
{ {
m_rtts->getFBO(FBO_COLORS).bind(); m_rtts->getFBO(FBO_COLORS).bind();
@ -471,6 +446,8 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
glClearColor(clearColor.getRed() / 255.f, clearColor.getGreen() / 255.f, glClearColor(clearColor.getRed() / 255.f, clearColor.getGreen() / 255.f,
clearColor.getBlue() / 255.f, clearColor.getAlpha() / 255.f); clearColor.getBlue() / 255.f, clearColor.getAlpha() / 255.f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
} }
{ {
@ -511,7 +488,7 @@ void ShaderBasedRenderer::renderScene(scene::ICameraSceneNode * const camnode,
// Now all instancing data from mesh and particle are done drawing // Now all instancing data from mesh and particle are done drawing
m_draw_calls.setFenceSync(); m_draw_calls.setFenceSync();
if (!CVS->isDefferedEnabled() && !forceRTT) if (!CVS->isDeferredEnabled() && !forceRTT)
{ {
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
@ -650,8 +627,9 @@ void ShaderBasedRenderer::onLoadWorld()
const core::recti &viewport = Camera::getCamera(0)->getViewport(); const core::recti &viewport = Camera::getCamera(0)->getViewport();
unsigned int width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X; unsigned int width = viewport.LowerRightCorner.X - viewport.UpperLeftCorner.X;
unsigned int height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y; unsigned int height = viewport.LowerRightCorner.Y - viewport.UpperLeftCorner.Y;
RTT* rtts = new RTT(width, height, CVS->isDefferedEnabled() ? RTT* rtts = new RTT(width, height, CVS->isDeferredEnabled() ?
UserConfigParams::m_scale_rtts_factor : 1.0f); UserConfigParams::m_scale_rtts_factor : 1.0f,
!CVS->isDeferredEnabled());
setRTT(rtts); setRTT(rtts);
} }
@ -746,7 +724,7 @@ void ShaderBasedRenderer::render(float dt)
RaceGUIBase *rg = world->getRaceGUI(); RaceGUIBase *rg = world->getRaceGUI();
if (rg) rg->update(dt); if (rg) rg->update(dt);
if (!CVS->isDefferedEnabled()) if (!CVS->isDeferredEnabled())
{ {
prepareForwardRenderer(); prepareForwardRenderer();
} }
@ -770,12 +748,12 @@ void ShaderBasedRenderer::render(float dt)
oss << "drawAll() for kart " << cam; oss << "drawAll() for kart " << cam;
PROFILER_PUSH_CPU_MARKER(oss.str().c_str(), (cam+1)*60, PROFILER_PUSH_CPU_MARKER(oss.str().c_str(), (cam+1)*60,
0x00, 0x00); 0x00, 0x00);
camera->activate(!CVS->isDefferedEnabled()); camera->activate(!CVS->isDeferredEnabled());
rg->preRenderCallback(camera); // adjusts start referee rg->preRenderCallback(camera); // adjusts start referee
irr_driver->getSceneManager()->setActiveCamera(camnode); irr_driver->getSceneManager()->setActiveCamera(camnode);
computeMatrixesAndCameras(camnode, m_rtts->getWidth(), m_rtts->getHeight()); computeMatrixesAndCameras(camnode, m_rtts->getWidth(), m_rtts->getHeight());
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
renderSceneDeferred(camnode, dt, track->hasShadows(), false); renderSceneDeferred(camnode, dt, track->hasShadows(), false);
} }
@ -794,7 +772,7 @@ void ShaderBasedRenderer::render(float dt)
debugPhysics(); debugPhysics();
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
renderPostProcessing(camera); renderPostProcessing(camera);
} }
@ -883,7 +861,7 @@ void ShaderBasedRenderer::renderToTexture(GL3RenderTarget *render_target,
if (CVS->isARBUniformBufferObjectUsable()) if (CVS->isARBUniformBufferObjectUsable())
uploadLightingData(); uploadLightingData();
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
renderSceneDeferred(camera, dt, false, true); renderSceneDeferred(camera, dt, false, true);
render_target->setFrameBuffer(m_post_processing render_target->setFrameBuffer(m_post_processing

View File

@ -18,9 +18,11 @@
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
#include "graphics/shader_files_manager.hpp" #include "graphics/shader_files_manager.hpp"
#include "config/user_config.hpp"
#include "config/stk_config.hpp" #include "config/stk_config.hpp"
#include "graphics/central_settings.hpp" #include "graphics/central_settings.hpp"
#include "graphics/graphics_restrictions.hpp" #include "graphics/graphics_restrictions.hpp"
#include "guiengine/message_queue.hpp"
#include "io/file_manager.hpp" #include "io/file_manager.hpp"
#include "utils/log.hpp" #include "utils/log.hpp"
@ -171,7 +173,7 @@ ShaderFilesManager::SharedShader ShaderFilesManager::loadShader
code << "#define UBO_DISABLED\n"; code << "#define UBO_DISABLED\n";
if (CVS->needsVertexIdWorkaround()) if (CVS->needsVertexIdWorkaround())
code << "#define Needs_Vertex_Id_Workaround\n"; code << "#define Needs_Vertex_Id_Workaround\n";
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
code << "#define Advanced_Lighting_Enabled\n"; code << "#define Advanced_Lighting_Enabled\n";
#if !defined(USE_GLES2) #if !defined(USE_GLES2)
@ -227,6 +229,13 @@ ShaderFilesManager::SharedShader ShaderFilesManager::loadShader
glGetShaderInfoLog(*ss, info_length, NULL, error_message); glGetShaderInfoLog(*ss, info_length, NULL, error_message);
Log::error("ShaderFilesManager", error_message); Log::error("ShaderFilesManager", error_message);
delete[] error_message; delete[] error_message;
if (UserConfigParams::m_artist_debug_mode)
{
core::stringw err = StringUtils::insertValues(L"Shader file %s"
" failed to compile, check stdout.log or console for details",
full_path.c_str());
MessageQueue::add(MessageQueue::MT_ERROR, err);
}
return NULL; return NULL;
} }
glGetError(); glGetError();

View File

@ -193,8 +193,7 @@ core::matrix4 ShadowMatrices::getTighestFitOrthoProj(const core::matrix4 &transf
* \param height of the rendering viewport * \param height of the rendering viewport
*/ */
void ShadowMatrices::computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode, void ShadowMatrices::computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode,
unsigned int width, unsigned int height, unsigned int width, unsigned int height)
GLuint depth_stencil_texture)
{ {
camnode->render(); camnode->render();
irr_driver->setProjMatrix(irr_driver->getVideoDriver() irr_driver->setProjMatrix(irr_driver->getVideoDriver()

View File

@ -62,8 +62,7 @@ public:
~ShadowMatrices(); ~ShadowMatrices();
void computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode, void computeMatrixesAndCameras(scene::ICameraSceneNode *const camnode,
unsigned int width, unsigned int height, unsigned int width, unsigned int height);
GLuint depth_stencil_texture);
void addLight(const core::vector3df &pos); void addLight(const core::vector3df &pos);
void updateSunOrthoMatrices(); void updateSunOrthoMatrices();
void renderShadowsDebug(const FrameBuffer* shadow_framebuffer, void renderShadowsDebug(const FrameBuffer* shadow_framebuffer,

View File

@ -220,7 +220,7 @@ SkidMarks::SkidMarkQuads::SkidMarkQuads(const Vec3 &left,
video::SColor(255, SkidMarks::m_start_grey, SkidMarks::m_start_grey, video::SColor(255, SkidMarks::m_start_grey, SkidMarks::m_start_grey,
SkidMarks::m_start_grey)); SkidMarks::m_start_grey));
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
m_start_color.setRed(SP::srgb255ToLinear(m_start_color.getRed())); m_start_color.setRed(SP::srgb255ToLinear(m_start_color.getRed()));
m_start_color.setGreen(SP::srgb255ToLinear(m_start_color.getGreen())); m_start_color.setGreen(SP::srgb255ToLinear(m_start_color.getGreen()));

View File

@ -179,7 +179,7 @@ void Skybox::generateCubeMapFromTextures()
glBindTexture(GL_TEXTURE_CUBE_MAP, m_cube_map); glBindTexture(GL_TEXTURE_CUBE_MAP, m_cube_map);
bool needs_srgb_format = CVS->isDefferedEnabled(); bool needs_srgb_format = CVS->isDeferredEnabled();
GLint format = GL_RGBA; GLint format = GL_RGBA;
GLint internal_format = needs_srgb_format ? GL_SRGB8_ALPHA8 : GL_RGBA8; GLint internal_format = needs_srgb_format ? GL_SRGB8_ALPHA8 : GL_RGBA8;
@ -218,7 +218,7 @@ void Skybox::generateSpecularCubemap()
} }
glGenerateMipmap(GL_TEXTURE_CUBE_MAP); glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
if (!CVS->isDefferedEnabled()) if (!CVS->isDeferredEnabled())
return; return;
#if !defined(USE_GLES2) #if !defined(USE_GLES2)

View File

@ -83,7 +83,7 @@ std::vector<std::pair<SPShader*, std::vector<std::pair<std::array<GLuint, 6>,
std::vector<std::pair<SPMeshBuffer*, int/*material_id*/> > > > > > std::vector<std::pair<SPMeshBuffer*, int/*material_id*/> > > > > >
g_final_draw_calls[DCT_FOR_VAO]; g_final_draw_calls[DCT_FOR_VAO];
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::unordered_map<unsigned, std::pair<video::SColorf, std::unordered_map<unsigned, std::pair<core::vector3df,
std::unordered_set<SPMeshBuffer*> > > g_glow_meshes; std::unordered_set<SPMeshBuffer*> > > g_glow_meshes;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
std::unordered_set<SPMeshBuffer*> g_instances; std::unordered_set<SPMeshBuffer*> g_instances;
@ -186,7 +186,7 @@ void displaceShaderInit(SPShader* shader)
shader->linkShaderFiles(RP_RESERVED); shader->linkShaderFiles(RP_RESERVED);
shader->use(RP_RESERVED); shader->use(RP_RESERVED);
shader->addBasicUniforms(RP_RESERVED); shader->addBasicUniforms(RP_RESERVED);
shader->addUniform("direction", typeid(std::array<float, 4>), RP_RESERVED); shader->addAllUniforms(RP_RESERVED);
shader->setUseFunction([]()->void shader->setUseFunction([]()->void
{ {
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
@ -199,12 +199,9 @@ void displaceShaderInit(SPShader* shader)
g_stk_sbr->getRTTs()->getFBO(FBO_DISPLACE).bind(), g_stk_sbr->getRTTs()->getFBO(FBO_DISPLACE).bind(),
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
}, RP_RESERVED); }, RP_RESERVED);
shader->addCustomPrefilledTextures(ST_BILINEAR, SPShaderManager::addPrefilledTexturesToShader(shader,
GL_TEXTURE_2D, "displacement_tex", []()->GLuint {{ "displacement_tex", "displace.png", false/*srgb*/, ST_BILINEAR }},
{ RP_RESERVED);
return irr_driver->getTexture(FileManager::TEXTURE,
"displace.png")->getOpenGLTextureName();
}, RP_RESERVED);
shader->addCustomPrefilledTextures(ST_BILINEAR, shader->addCustomPrefilledTextures(ST_BILINEAR,
GL_TEXTURE_2D, "mask_tex", []()->GLuint GL_TEXTURE_2D, "mask_tex", []()->GLuint
{ {
@ -327,7 +324,7 @@ void loadShaders()
// Displace shader is not specifiable in XML due to complex callback // Displace shader is not specifiable in XML due to complex callback
std::shared_ptr<SPShader> sps; std::shared_ptr<SPShader> sps;
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
// This displace shader will be drawn the last in transparent pass // This displace shader will be drawn the last in transparent pass
sps = std::make_shared<SPShader>("displace", displaceShaderInit, sps = std::make_shared<SPShader>("displace", displaceShaderInit,
@ -345,7 +342,7 @@ void loadShaders()
// ======================================================================== // ========================================================================
// Glow shader // Glow shader
// ======================================================================== // ========================================================================
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
sps = std::make_shared<SPShader> sps = std::make_shared<SPShader>
("sp_glow_shader", [](SPShader* shader) ("sp_glow_shader", [](SPShader* shader)
@ -357,7 +354,7 @@ void loadShaders()
shader->linkShaderFiles(RP_1ST); shader->linkShaderFiles(RP_1ST);
shader->use(RP_1ST); shader->use(RP_1ST);
shader->addBasicUniforms(RP_1ST); shader->addBasicUniforms(RP_1ST);
shader->addUniform("col", typeid(irr::video::SColorf), RP_1ST); shader->addAllUniforms(RP_1ST);
}); });
SPShaderManager::get()->addSPShader(sps->getName(), sps); SPShaderManager::get()->addSPShader(sps->getName(), sps);
g_glow_shader = sps.get(); g_glow_shader = sps.get();
@ -740,7 +737,7 @@ void prepareDrawCalls()
g_skinning_mesh.clear(); g_skinning_mesh.clear();
mathPlaneFrustumf(g_frustums[0], irr_driver->getProjViewMatrix()); mathPlaneFrustumf(g_frustums[0], irr_driver->getProjViewMatrix());
g_handle_shadow = Track::getCurrentTrack() && g_handle_shadow = Track::getCurrentTrack() &&
Track::getCurrentTrack()->hasShadows() && CVS->isDefferedEnabled() && Track::getCurrentTrack()->hasShadows() && CVS->isDeferredEnabled() &&
CVS->isShadowEnabled(); CVS->isShadowEnabled();
if (g_handle_shadow) if (g_handle_shadow)
@ -922,14 +919,15 @@ void addObject(SPMeshNode* node)
} }
mb->addInstanceData(id, (DrawCallType)dc_type); mb->addInstanceData(id, (DrawCallType)dc_type);
if (UserConfigParams::m_glow && node->hasGlowColor() && if (UserConfigParams::m_glow && node->hasGlowColor() &&
CVS->isDefferedEnabled() && dc_type == DCT_NORMAL) CVS->isDeferredEnabled() && dc_type == DCT_NORMAL)
{ {
video::SColorf gc = node->getGlowColor(); video::SColorf gc = node->getGlowColor();
unsigned key = gc.toSColor().color; unsigned key = gc.toSColor().color;
auto ret = g_glow_meshes.find(key); auto ret = g_glow_meshes.find(key);
if (ret == g_glow_meshes.end()) if (ret == g_glow_meshes.end())
{ {
g_glow_meshes[key] = std::make_pair(gc, g_glow_meshes[key] = std::make_pair(
core::vector3df(gc.r, gc.g, gc.b),
std::unordered_set<SPMeshBuffer*>()); std::unordered_set<SPMeshBuffer*>());
} }
g_glow_meshes.at(key).second.insert(mb); g_glow_meshes.at(key).second.insert(mb);

View File

@ -167,7 +167,7 @@ void SPMeshBuffer::uploadGLMesh()
offset += 4; offset += 4;
video::SColor vc = m_vertices[i].m_color; video::SColor vc = m_vertices[i].m_color;
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
vc.setRed(srgb255ToLinear(vc.getRed())); vc.setRed(srgb255ToLinear(vc.getRed()));
vc.setGreen(srgb255ToLinear(vc.getGreen())); vc.setGreen(srgb255ToLinear(vc.getGreen()));

View File

@ -16,15 +16,19 @@
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "graphics/sp/sp_shader.hpp" #include "graphics/sp/sp_shader.hpp"
#include "config/user_config.hpp"
#include "graphics/central_settings.hpp" #include "graphics/central_settings.hpp"
#include "graphics/shader_files_manager.hpp" #include "graphics/shader_files_manager.hpp"
#include "graphics/sp/sp_base.hpp" #include "graphics/sp/sp_base.hpp"
#include "graphics/sp/sp_uniform_assigner.hpp" #include "graphics/sp/sp_uniform_assigner.hpp"
#include "guiengine/message_queue.hpp"
#include "utils/string_utils.hpp" #include "utils/string_utils.hpp"
#include <map>
namespace SP namespace SP
{ {
std::unordered_map<std::string, std::pair<unsigned, SamplerType> > const std::map<std::string, std::pair<unsigned, SamplerType> >
g_prefilled_names = g_prefilled_names =
{ {
#ifdef USE_GLES2 #ifdef USE_GLES2
@ -81,6 +85,13 @@ void SPShader::linkShaderFiles(RenderPass rp)
} }
if (result == GL_FALSE) if (result == GL_FALSE)
{ {
if (UserConfigParams::m_artist_debug_mode)
{
core::stringw err = StringUtils::insertValues(L"Shader %s failed"
" to link, check stdout.log or console for details",
m_name.c_str());
MessageQueue::add(MessageQueue::MT_ERROR, err);
}
glDeleteProgram(m_program[rp]); glDeleteProgram(m_program[rp]);
m_program[rp] = 0; m_program[rp] = 0;
} }
@ -194,20 +205,49 @@ void SPShader::bindTextures(const std::array<GLuint, 6>& tex,
} // bindTextures } // bindTextures
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void SPShader::addUniform(const std::string& name, const std::type_index& ti, void SPShader::addAllUniforms(RenderPass rp)
RenderPass rp)
{ {
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
const char* s = name.c_str(); GLint total_uniforms;
GLuint location = glGetUniformLocation(m_program[rp], s); glGetProgramiv(m_program[rp], GL_ACTIVE_UNIFORMS, &total_uniforms);
if (location == GL_INVALID_INDEX) static const std::map<GLenum, std::type_index> supported_types =
{
{ GL_INT, std::type_index(typeid(int)) },
{ GL_FLOAT, std::type_index(typeid(float)) },
{ GL_FLOAT_MAT4, std::type_index(typeid(irr::core::matrix4)) },
{ GL_FLOAT_VEC4, std::type_index(typeid(std::array<float, 4>)) },
{ GL_FLOAT_VEC3, std::type_index(typeid(irr::core::vector3df)) },
{ GL_FLOAT_VEC2, std::type_index(typeid(irr::core::vector2df)) }
};
for (int i = 0; i < total_uniforms; i++)
{ {
Log::warn("SPShader", "Missing uniform %s in shader files.", s); GLint size;
return; GLenum type;
char name[100] = {};
glGetActiveUniform(m_program[rp], i, 99, NULL, &size, &type, name);
if (size != 1)
{
Log::debug("SPShader", "Array of uniforms is not supported in"
" shader %s for %s.", m_name.c_str(), name);
continue;
}
auto ret = supported_types.find(type);
if (ret == supported_types.end())
{
Log::debug("SPShader", "%d type not supported", (unsigned)type);
continue;
}
GLuint location = glGetUniformLocation(m_program[rp], name);
if (location == GL_INVALID_INDEX)
{
Log::debug("SPShader", "%s uniform not found", name);
continue;
}
m_uniforms[rp][name] = new SPUniformAssigner(ret->second, location);
} }
m_uniforms[rp][name] = new SPUniformAssigner(ti, location);
#endif #endif
} // addUniform } // addAllUniforms
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void SPShader::setUniformsPerObject(SPPerObjectUniform* sppou, void SPShader::setUniformsPerObject(SPPerObjectUniform* sppou,
@ -271,7 +311,7 @@ void SPShader::unload()
bool SPShader::isSrgbForTextureLayer(unsigned layer) const bool SPShader::isSrgbForTextureLayer(unsigned layer) const
{ {
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (!CVS->isDefferedEnabled()) if (!CVS->isDeferredEnabled())
{ {
return false; return false;
} }

View File

@ -161,6 +161,8 @@ public:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void addAllTextures(RenderPass rp = RP_1ST); void addAllTextures(RenderPass rp = RP_1ST);
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void addAllUniforms(RenderPass rp = RP_1ST);
// ------------------------------------------------------------------------
void addCustomPrefilledTextures(SamplerType st, GLuint texture_type, void addCustomPrefilledTextures(SamplerType st, GLuint texture_type,
const std::string& name, const std::string& name,
std::function<GLuint()> func, std::function<GLuint()> func,
@ -190,9 +192,6 @@ public:
SPUniformAssigner* getUniformAssigner(const std::string& name, SPUniformAssigner* getUniformAssigner(const std::string& name,
RenderPass rp = RP_1ST) const; RenderPass rp = RP_1ST) const;
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
void addUniform(const std::string& name, const std::type_index& ti,
RenderPass rp = RP_1ST);
// ------------------------------------------------------------------------
void setUniformsPerObject(SPPerObjectUniform* sppou, void setUniformsPerObject(SPPerObjectUniform* sppou,
std::vector<SPUniformAssigner*>* ua_used, std::vector<SPUniformAssigner*>* ua_used,
RenderPass rp = RP_1ST); RenderPass rp = RP_1ST);

View File

@ -37,16 +37,6 @@ SPShaderManager* SPShaderManager::m_spsm = NULL;
SPShaderManager::SPShaderManager() SPShaderManager::SPShaderManager()
{ {
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
m_official_types =
{
{ "int", std::type_index(typeid(int)) },
{ "float", std::type_index(typeid(float)) },
{ "mat4", std::type_index(typeid(irr::core::matrix4)) },
{ "vec4", std::type_index(typeid(std::array<float, 4>)) },
{ "vec3", std::type_index(typeid(irr::core::vector3df)) },
{ "vec2", std::type_index(typeid(irr::core::vector2df)) }
};
m_official_sampler_types = m_official_sampler_types =
{ {
{ "nearest", ST_NEAREST }, { "nearest", ST_NEAREST },
@ -138,13 +128,7 @@ SPShaderManager::SPShaderManager()
SPShaderManager::~SPShaderManager() SPShaderManager::~SPShaderManager()
{ {
m_official_shaders.clear(); m_official_shaders.clear();
removeUnusedShaders(); m_shaders.clear();
#ifdef DEBUG
for (auto p : m_shaders)
{
Log::error("SPShaderManager", "%s > 1 ref_count", p.first.c_str());
}
#endif
} // ~SPShaderManager } // ~SPShaderManager
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@ -211,7 +195,7 @@ void SPShaderManager::loadEachShader(const std::string& file_name)
std::array<PassInfo, 2> pi; std::array<PassInfo, 2> pi;
loadPassInfo(xml->getNode("first-pass"), pi[0]); loadPassInfo(xml->getNode("first-pass"), pi[0]);
if (!si.m_transparent_shader && CVS->isDefferedEnabled()) if (!si.m_transparent_shader && CVS->isDeferredEnabled())
{ {
loadPassInfo(xml->getNode("shadow-pass"), pi[1]); loadPassInfo(xml->getNode("shadow-pass"), pi[1]);
} }
@ -221,7 +205,7 @@ void SPShaderManager::loadEachShader(const std::string& file_name)
" file %s", file_name.c_str()); " file %s", file_name.c_str());
return; return;
} }
if (!si.m_fallback_name.empty() && !CVS->isDefferedEnabled()) if (!si.m_fallback_name.empty() && !CVS->isDeferredEnabled())
{ {
std::shared_ptr<SPShader> fallback_shader = std::shared_ptr<SPShader> fallback_shader =
getSPShader(si.m_fallback_name); getSPShader(si.m_fallback_name);
@ -319,32 +303,6 @@ void SPShaderManager::loadPassInfo(const XMLNode* pass, PassInfo& pi)
pass->get("skinned-mesh-shader", &pi.m_skinned_mesh_shader); pass->get("skinned-mesh-shader", &pi.m_skinned_mesh_shader);
pi.m_skinned_mesh_shader = getShaderFullPath(pi.m_skinned_mesh_shader); pi.m_skinned_mesh_shader = getShaderFullPath(pi.m_skinned_mesh_shader);
const XMLNode* uniforms = pass->getNode("uniforms");
if (uniforms)
{
for (unsigned i = 0; i < uniforms->getNumNodes(); i++)
{
const XMLNode* uniform = uniforms->getNode(i);
if (uniform->getName() == "uniform")
{
std::string name, type;
uniform->get("name", &name);
uniform->get("type", &type);
if (!name.empty() && !type.empty() &&
m_official_types.find(type) != m_official_types.end())
{
pi.m_uniforms.emplace_back(name,
m_official_types.at(type));
}
else
{
Log::error("SPShaderManager", "Invalid uniform type %s",
type.c_str());
}
}
}
}
const XMLNode* prefilled_textures = pass->getNode("prefilled-textures"); const XMLNode* prefilled_textures = pass->getNode("prefilled-textures");
if (prefilled_textures) if (prefilled_textures)
{ {
@ -362,7 +320,7 @@ void SPShaderManager::loadPassInfo(const XMLNode* pass, PassInfo& pi)
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (!srgb_props.empty()) if (!srgb_props.empty())
{ {
srgb = srgb_props == "Y" && CVS->isDefferedEnabled(); srgb = srgb_props == "Y" && CVS->isDeferredEnabled();
} }
#endif #endif
prefilled_texture->get("sampler", &sampler_props); prefilled_texture->get("sampler", &sampler_props);
@ -414,7 +372,7 @@ std::shared_ptr<SPShader> SPShaderManager::buildSPShader(const ShaderInfo& si,
std::shared_ptr<SPShader> sps; std::shared_ptr<SPShader> sps;
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
sps = std::make_shared<SPShader>(si.m_shader_name, sps = std::make_shared<SPShader>(si.m_shader_name,
[pi, ua, skinned](SPShader* shader) [this, pi, ua, skinned](SPShader* shader)
{ {
// First pass // First pass
assert(!pi[0].m_vertex_shader.empty() || assert(!pi[0].m_vertex_shader.empty() ||
@ -437,7 +395,7 @@ std::shared_ptr<SPShader> SPShaderManager::buildSPShader(const ShaderInfo& si,
shader->linkShaderFiles(RP_1ST); shader->linkShaderFiles(RP_1ST);
shader->use(RP_1ST); shader->use(RP_1ST);
shader->addBasicUniforms(RP_1ST); shader->addBasicUniforms(RP_1ST);
addUniformsToShader(shader, pi[0].m_uniforms, RP_1ST); shader->addAllUniforms(RP_1ST);
if (pi[0].m_use_function) if (pi[0].m_use_function)
{ {
shader->setUseFunction(pi[0].m_use_function, RP_1ST); shader->setUseFunction(pi[0].m_use_function, RP_1ST);
@ -472,7 +430,7 @@ std::shared_ptr<SPShader> SPShaderManager::buildSPShader(const ShaderInfo& si,
shader->linkShaderFiles(RP_SHADOW); shader->linkShaderFiles(RP_SHADOW);
shader->use(RP_SHADOW); shader->use(RP_SHADOW);
shader->addBasicUniforms(RP_SHADOW); shader->addBasicUniforms(RP_SHADOW);
addUniformsToShader(shader, pi[1].m_uniforms, RP_SHADOW); shader->addAllUniforms(RP_SHADOW);
if (pi[1].m_use_function) if (pi[1].m_use_function)
{ {
shader->setUseFunction(pi[1].m_use_function, RP_SHADOW); shader->setUseFunction(pi[1].m_use_function, RP_SHADOW);
@ -490,17 +448,6 @@ std::shared_ptr<SPShader> SPShaderManager::buildSPShader(const ShaderInfo& si,
return sps; return sps;
} // buildSPShader } // buildSPShader
// ----------------------------------------------------------------------------
void SPShaderManager::addUniformsToShader(SPShader* s,
const std::vector<std::pair<std::string, std::type_index> >& u,
RenderPass rp)
{
for (auto& p : u)
{
s->addUniform(p.first, p.second, rp);
}
} // addUniformsToShader
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
void SPShaderManager::addPrefilledTexturesToShader(SPShader* s, void SPShaderManager::addPrefilledTexturesToShader(SPShader* s,
const std::vector<std::tuple<std::string, std::string, bool, SamplerType> > const std::vector<std::tuple<std::string, std::string, bool, SamplerType> >

View File

@ -41,7 +41,6 @@ enum RenderPass: unsigned int;
class SPShaderManager : public NoCopy class SPShaderManager : public NoCopy
{ {
public: public:
struct PassInfo struct PassInfo
{ {
std::function<void()> m_use_function; std::function<void()> m_use_function;
@ -54,8 +53,6 @@ public:
std::string m_skinned_mesh_shader; std::string m_skinned_mesh_shader;
std::vector<std::pair<std::string, std::type_index> > m_uniforms;
std::vector<std::tuple<std::string, std::string, bool, SamplerType> > std::vector<std::tuple<std::string, std::string, bool, SamplerType> >
m_prefilled_textures; m_prefilled_textures;
}; };
@ -87,8 +84,6 @@ private:
std::vector<std::shared_ptr<SPShader> > m_official_shaders; std::vector<std::shared_ptr<SPShader> > m_official_shaders;
std::unordered_map<std::string, std::type_index> m_official_types;
std::unordered_map<std::string, SamplerType> m_official_sampler_types; std::unordered_map<std::string, SamplerType> m_official_sampler_types;
std::unordered_map<std::string, std::function<void(SPUniformAssigner*)> > std::unordered_map<std::string, std::function<void(SPUniformAssigner*)> >
@ -113,14 +108,6 @@ private:
const std::array<PassInfo, 2>& pi, const std::array<PassInfo, 2>& pi,
const UniformAssigners& ua, const UniformAssigners& ua,
bool skinned); bool skinned);
// ------------------------------------------------------------------------
static void addUniformsToShader(SPShader* s,
const std::vector<std::pair<std::string, std::type_index> >& u,
RenderPass rp);
// ------------------------------------------------------------------------
static void addPrefilledTexturesToShader(SPShader* s,
const std::vector<std::tuple<std::string, std::string, bool,
SamplerType> >& t, RenderPass rp);
public: public:
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
@ -139,6 +126,10 @@ public:
m_spsm = NULL; m_spsm = NULL;
} }
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
static void addPrefilledTexturesToShader(SPShader* s,
const std::vector<std::tuple<std::string, std::string, bool,
SamplerType> >& t, RenderPass rp);
// ------------------------------------------------------------------------
SPShaderManager(); SPShaderManager();
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
~SPShaderManager(); ~SPShaderManager();

View File

@ -84,17 +84,6 @@ public:
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
glUniform4f(m_location, v[0], v[1], v[2], v[3]); glUniform4f(m_location, v[0], v[1], v[2], v[3]);
m_assigned = true; m_assigned = true;
#endif
}
}
// ------------------------------------------------------------------------
void setValue(const irr::video::SColorf& col) const
{
if (rumtimeChecking(typeid(col)))
{
#ifndef SERVER_ONLY
glUniform3f(m_location, col.r, col.g, col.b);
m_assigned = true;
#endif #endif
} }
} }
@ -117,17 +106,6 @@ public:
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
glUniform2f(m_location, v.X, v.Y); glUniform2f(m_location, v.X, v.Y);
m_assigned = true; m_assigned = true;
#endif
}
}
// ------------------------------------------------------------------------
void setValue(const irr::core::dimension2df& v) const
{
if (rumtimeChecking(typeid(v)))
{
#ifndef SERVER_ONLY
glUniform2f(m_location, v.Width, v.Height);
m_assigned = true;
#endif #endif
} }
} }
@ -160,37 +138,31 @@ public:
{ {
m_assigned = false; m_assigned = false;
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (m_type == typeid(irr::core::matrix4)) if (m_type == typeid(int))
{ {
static const char zeroes[64] = {}; glUniform1i(m_location, 0);
glUniformMatrix4fv(m_location, 1, GL_FALSE, (float*)zeroes);
}
else if (m_type == typeid(irr::video::SColor))
{
glUniform4i(m_location, 0, 0, 0, 0);
}
else if (m_type == typeid(irr::video::SColorf) ||
m_type == typeid(irr::core::vector3df))
{
glUniform3f(m_location, 0.0f, 0.0f, 0.0f);
}
else if (m_type == typeid(irr::core::vector2df) ||
m_type == typeid(irr::core::dimension2df))
{
glUniform2f(m_location, 0.0f, 0.0f);
} }
else if (m_type == typeid(float)) else if (m_type == typeid(float))
{ {
glUniform1f(m_location, 0.0f); glUniform1f(m_location, 0.0f);
} }
else if (m_type == typeid(int)) else if (m_type == typeid(irr::core::matrix4))
{ {
glUniform1i(m_location, 0); static const char zeroes[64] = {};
glUniformMatrix4fv(m_location, 1, GL_FALSE, (float*)zeroes);
} }
else if (m_type == typeid(std::array<float, 4>)) else if (m_type == typeid(std::array<float, 4>))
{ {
glUniform4f(m_location, 0.0f, 0.0f, 0.0f,0.0f); glUniform4f(m_location, 0.0f, 0.0f, 0.0f,0.0f);
} }
else if (m_type == typeid(irr::core::vector3df))
{
glUniform3f(m_location, 0.0f, 0.0f, 0.0f);
}
else if (m_type == typeid(irr::core::vector2df))
{
glUniform2f(m_location, 0.0f, 0.0f);
}
#endif #endif
} }
} }

View File

@ -35,14 +35,14 @@ STKTextBillboard::STKTextBillboard(const video::SColor& color_top,
{ {
using namespace SP; using namespace SP;
m_color_top = color_top; m_color_top = color_top;
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
m_color_top.setRed(srgb255ToLinear(m_color_top.getRed())); m_color_top.setRed(srgb255ToLinear(m_color_top.getRed()));
m_color_top.setGreen(srgb255ToLinear(m_color_top.getGreen())); m_color_top.setGreen(srgb255ToLinear(m_color_top.getGreen()));
m_color_top.setBlue(srgb255ToLinear(m_color_top.getBlue())); m_color_top.setBlue(srgb255ToLinear(m_color_top.getBlue()));
} }
m_color_bottom = color_bottom; m_color_bottom = color_bottom;
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
video::SColorf tmp(m_color_bottom); video::SColorf tmp(m_color_bottom);
m_color_bottom.setRed(srgb255ToLinear(m_color_bottom.getRed())); m_color_bottom.setRed(srgb255ToLinear(m_color_bottom.getRed()));

View File

@ -42,7 +42,7 @@ STKTexture::STKTexture(const std::string& path, TexConfig* tc, bool no_upload)
if (m_tex_config) if (m_tex_config)
{ {
if (ProfileWorld::isNoGraphics() || if (ProfileWorld::isNoGraphics() ||
(!CVS->isDefferedEnabled()) || !CVS->isGLSL()) (!CVS->isDeferredEnabled()) || !CVS->isGLSL())
{ {
m_tex_config->m_srgb = false; m_tex_config->m_srgb = false;
} }
@ -217,7 +217,7 @@ void STKTexture::formatConversion(uint8_t* data, unsigned int* format,
{ {
alpha /= 255.0f; alpha /= 255.0f;
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
alpha = pow(alpha, 1.0f / 2.2f); alpha = pow(alpha, 1.0f / 2.2f);
} }

View File

@ -52,7 +52,7 @@ RubberBand::RubberBand(Plunger *plunger, AbstractKart *kart)
return; return;
} }
video::SColor color(77, 179, 0, 0); video::SColor color(77, 179, 0, 0);
if (CVS->isDefferedEnabled()) if (CVS->isDeferredEnabled())
{ {
color.setRed(SP::srgb255ToLinear(color.getRed())); color.setRed(SP::srgb255ToLinear(color.getRed()));
color.setGreen(SP::srgb255ToLinear(color.getGreen())); color.setGreen(SP::srgb255ToLinear(color.getGreen()));

View File

@ -504,7 +504,7 @@ scene::ISceneNode* KartModel::attachModel(bool animated_models, bool human_playe
irr_driver->addMesh(obj.getModel(), "kart_headlight", irr_driver->addMesh(obj.getModel(), "kart_headlight",
parent, getRenderInfo()); parent, getRenderInfo());
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (human_player && CVS->isGLSL() && CVS->isDefferedEnabled()) if (human_player && CVS->isGLSL() && CVS->isDeferredEnabled())
{ {
obj.setLight(headlight_model, each_energy, each_radius); obj.setLight(headlight_model, each_energy, each_radius);
} }

View File

@ -350,7 +350,7 @@ void Graph::createMeshSP(bool show_invisible, bool enable_transparency,
spmb->recalculateBoundingBox(); spmb->recalculateBoundingBox();
std::string shader_name = enable_transparency ? "alphablend" : "unlit"; std::string shader_name = enable_transparency ? "alphablend" : "unlit";
#ifndef SERVER_ONLY #ifndef SERVER_ONLY
if (!CVS->isDefferedEnabled()) if (!CVS->isDeferredEnabled())
{ {
shader_name = "solid"; shader_name = "solid";
} }