43 DeferredLightingRenderShader::DeferredLightingRenderShader(
Renderer* renderer)
64 "shader/" + shaderVersion +
"/framebuffer",
65 "render_vertexshader.vert",
66 "#define HAVE_DEPTH_FOG"
72 "shader/" + shaderVersion +
"/framebuffer",
73 "deferred_lighting_fragmentshader.frag",
75 "#define HAVE_DEPTH_FOG\n" +
76 "#define LIGHT_COUNT " + to_string(
Engine::LIGHTS_MAX) +
"\n#define USE_PUNCTUAL\n#define MATERIAL_METALLICROUGHNESS\n#define USE_IBL\n" +
77 "#define DECAL_COUNT " + to_string(
DECAL_COUNT) +
"\n" +
78 FileSystem::getInstance()->getContentAsString(
79 "shader/" + shaderVersion +
"/functions/specular",
80 "specular_lighting.inc.glsl"
83 FileSystem::getInstance()->getContentAsString(
84 "shader/" + shaderVersion +
"/functions/pbr",
85 "tonemapping.inc.glsl"
88 FileSystem::getInstance()->getContentAsString(
89 "shader/" + shaderVersion +
"/functions/pbr",
93 FileSystem::getInstance()->getContentAsString(
94 "shader/" + shaderVersion +
"/functions/pbr",
95 "pbr_lighting.inc.glsl"
206 string environmentType =
"studio_grey";
209 "pbr-environment-diffuse",
210 envDiffuseTextures[0] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_left.png"),
211 envDiffuseTextures[1] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_right.png"),
212 envDiffuseTextures[2] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_top.png"),
213 envDiffuseTextures[3] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_bottom.png"),
214 envDiffuseTextures[4] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_front.png"),
215 envDiffuseTextures[5] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/diffuse",
"diffuse_back.png"),
220 "pbr-environment-specular",
221 envSpecularTextures[0] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_left.png"),
222 envSpecularTextures[1] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_right.png"),
223 envSpecularTextures[2] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_top.png"),
224 envSpecularTextures[3] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_bottom.png"),
225 envSpecularTextures[4] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_front.png"),
226 envSpecularTextures[5] = TextureReader::read(
"resources/engine/environments/" + environmentType +
"/specular",
"specular_back.png"),
299 if (light->isEnabled() ==
false)
continue;
331 if (light->isEnabled() ==
false)
continue;
332 const auto& ambient = light->getAmbient();
333 const auto& diffuse = light->getDiffuse();
334 const auto& position = light->getPosition();
346 if (decalsTextureAtlas.isRequiringUpdate() ==
true) {
347 decalsTextureAtlas.
update();
348 if (decalsTextureAtlas.getAtlasTexture() !=
nullptr) {
359 auto decalsTextureAtlasTexture = decalsTextureAtlas.getAtlasTexture();
360 if (decalsTextureAtlasTexture !=
nullptr) {
361 auto decalCount = Math::min(
DECAL_COUNT, decalEntities.size());
363 if (decalCount > 0) {
364 auto decalsTextureAtlasTextureWidth = decalsTextureAtlasTexture->getTextureWidth();
365 auto decalsTextureAtlasTextureHeight = decalsTextureAtlasTexture->getTextureHeight();
369 for (
auto i = 0; i < decalCount && i <
DECAL_COUNT; i++) {
370 auto decalObject = decalEntities[i];
371 auto atlasTextureIdx = decalsTextureAtlas.getTextureIdx(decalObject->getDecalTexture());
372 if (atlasTextureIdx == -1)
continue;
373 auto atlasTexture = decalsTextureAtlas.getAtlasTexture(atlasTextureIdx);
374 if (atlasTexture ==
nullptr)
continue;
381 static_cast<float>(atlasTexture->left) /
static_cast<float>(decalsTextureAtlasTextureWidth),
382 static_cast<float>(atlasTexture->top) /
static_cast<float>(decalsTextureAtlasTextureHeight)
389 static_cast<float>(atlasTexture->width) /
static_cast<float>(decalsTextureAtlasTextureWidth),
390 static_cast<float>(atlasTexture->height) /
static_cast<float>(decalsTextureAtlasTextureHeight)
397 static_cast<float>(decalObject->getTextureHorizontalSprites()),
398 static_cast<float>(decalObject->getTextureVerticalSprites())
const Matrix4x4 & getModelViewProjectionInvertedMatrix() const
const Matrix4x4 & getCameraMatrix() const
Light * getLightAt(int32_t idx)
Returns light at idx (0 <= idx < 8)
TextureAtlas & getDecalsTextureAtlas()
static Engine * getInstance()
Returns engine instance.
static TextureManager * getTextureManager()
static BRDFLUTShader * getBRDFLUTShader()
int32_t getColorTextureId() override
Deferred lighint render shader.
int32_t uniformGeometryBufferTextureId1
int32_t uniformColorBufferTextureUnit2
int32_t uniformDecalsTextureUnit
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightSpotCosCutoff
array< int32_t, DECAL_COUNT > uniformDecalSpriteSheetDimension
int32_t textureDiffuseEnvSampler
void initialize()
Initialize.
int32_t uniformColorBufferTextureUnit3
array< int32_t, DECAL_COUNT > uniformDecalSpriteIndex
array< int32_t, DECAL_COUNT > uniformDecalWorldToDecalSpace
int32_t decalsTextureAtlasTextureId
int32_t uniformColorBufferTextureUnit4
array< int32_t, DECAL_COUNT > uniformDecalAtlasTexturePosition
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightLinearAttenuation
int32_t textureSpecularEnvSampler
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightSpotExponent
~DeferredLightingRenderShader()
Public destructor.
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightPosition
int32_t uniformGeometryBufferTextureId2
int32_t uniformColorBufferTextureUnit5
int32_t uniformDiffuseEnvSampler
static constexpr int DECAL_COUNT
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightSpecular
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightRange
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightInnerConeCos
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightRadius
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightDirection
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightDiffuse
int32_t uniformSpecularEnvSampler
array< int32_t, DECAL_COUNT > uniformDecalAtlasTextureDimension
array< Texture *, 6 > envSpecularTextures
int32_t uniformDepthBufferTextureUnit
array< int32_t, DECAL_COUNT > uniformDecalAtlasTextureOrientation
int32_t uniformProjectionCameraMatrixInverted
int32_t uniformCameraMatrix
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightOuterConeCos
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightConstantAttenuation
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightPosition
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightColor
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightIntensity
int32_t uniformColorBufferTextureUnit1
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightQuadraticAttenuation
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightEnabled
array< int32_t, Engine::LIGHTS_MAX > uniformPBRLightType
array< Texture *, 6 > envDiffuseTextures
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightSpotDirection
int32_t uniformDecalCount
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightEnabled
array< int32_t, Engine::LIGHTS_MAX > uniformSpecularLightAmbient
void useProgram(Engine *engine, vector< Decal * > &decalEntities)
Use render program.
void unUseProgram()
Un use render program.
int32_t uniformGeometryBufferTextureId3
void removeTexture(Texture *texture)
Removes a texture from manager.
int32_t addCubeMapTexture(const string &id, Texture *textureLeft, Texture *textureRight, Texture *textureTop, Texture *textureBottom, Texture *textureFront, Texture *textureBack, int contextIdx=0)
Adds a cube map texture to manager.
virtual void setTextureUnit(int contextIdx, int32_t textureUnit)=0
Sets up texture unit.
virtual void bindCubeMapTexture(int contextIdx, int32_t textureId)=0
Binds a cube map texture with given id or unbinds when using ID_NONE.
virtual int32_t loadShader(int32_t type, const string &pathName, const string &fileName, const string &definitions=string(), const string &functions=string())=0
Loads a shader.
int32_t SHADER_FRAGMENT_SHADER
virtual void setProgramUniformFloatVec4(int contextIdx, int32_t uniformId, const array< float, 4 > &data)=0
Set up a float vec4 uniform value.
int32_t SHADER_VERTEX_SHADER
virtual int32_t createProgram(int type)=0
Creates a shader program.
virtual void setProgramUniformFloatVec2(int contextIdx, int32_t uniformId, const array< float, 2 > &data)=0
Set up a float vec2 uniform value.
virtual bool isUsingProgramAttributeLocation()=0
virtual int32_t getTextureUnit(int contextIdx)=0
Get texture unit.
virtual void setProgramAttributeLocation(int32_t programId, int32_t location, const string &name)=0
Bind attribute to a input location.
virtual int32_t createTexture()=0
Creates a texture.
virtual void setProgramUniformInteger(int contextIdx, int32_t uniformId, int32_t value)=0
Set up a integer uniform value.
virtual bool linkProgram(int32_t programId)=0
Links attached shaders to a program.
virtual void bindTexture(int contextIdx, int32_t textureId)=0
Binds a texture with given id or unbinds when using ID_NONE.
void setLighting(int contextIdx, int32_t lighting)
Set current lighting model.
virtual void attachShaderToProgram(int32_t programId, int32_t shaderId)=0
Attaches a shader to a program.
virtual void setProgramUniformFloatMatrix4x4(int contextIdx, int32_t uniformId, const array< float, 16 > &value)=0
Set up a float matrix 4x4 uniform value.
virtual int32_t getProgramUniformLocation(int32_t programId, const string &name)=0
Returns location of given uniform variable.
virtual void disposeTexture(int32_t textureId)=0
Dispose a texture.
virtual void uploadTexture(int contextIdx, Texture *texture)=0
Uploads texture data to current bound texture.
int32_t CONTEXTINDEX_DEFAULT
virtual void useProgram(int contextIdx, int32_t programId)=0
Use shader program.
virtual void setProgramUniformFloatVec3(int contextIdx, int32_t uniformId, const array< float, 3 > &data)=0
Set up a float vec3 uniform value.
Vector3 & getCameraPosition()
virtual const string getShaderVersion()=0
virtual void setProgramUniformFloat(int contextIdx, int32_t uniformId, float value)=0
Set up a float uniform value.
Buffers used to transfer data between main memory to graphics board memory.
const array< float, 16 > & getArray() const
const array< float, 3 > & getArray() const
File system singleton class.
void update()
Update texture atlas.