AmbientLight::~AmbientLight()
{
-}
+}
\ No newline at end of file
virtual ~AmbientLight();
/*Change Light*/
-
+ //void usePreProcess();
protected:
#include "DirectionalLight.h"
+#include "../Shader.h"
+#include "../../GLM.h"
-DirectionalLight::DirectionalLight(const vec3& _position, const vec3& _color, const vec3& _direction) :
+DirectionalLight::DirectionalLight(const vec3& _color, const float _size, const vec3& _direction) :
Light(_color),
- position(_position),
- direction(_direction)
+ size(_size),
+ direction(normalize(_direction))
{
-
+ lightview = lookAt(direction, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f));
+ proj = scale(vec3(size));
+ invproj = scale(vec3(1 / size));
+
+ Shader::getShader(SH_LIGHTING)->useShader();
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("DirectionalLightDirection", direction);
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("dirLightView", lightview);
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("dirLightProj", proj);
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("dirLightColor", color);
}
DirectionalLight::~DirectionalLight()
}
-void DirectionalLight::changePosition(const vec3& _position)
+void DirectionalLight::changeSize(const float _size)
{
- position = _position;
+ size = _size;
+
+ proj = scale(vec3(size));
+ invproj = scale(vec3(1 / size));
}
void DirectionalLight::changeDirection(const vec3& _direction)
{
- direction = _direction;
+ direction = normalize(_direction);
+
+ lightview = lookAt(direction, vec3(0.0f, 0.0f, 0.0f), vec3(0.0f, 1.0f, 0.0f));
+}
+
+void DirectionalLight::useLight()
+{
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uView", lightview);
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uProjection", proj);
+ Shader::getShader(SH_ACTIVE)->setUniformLocation("uInvProjection", invproj);
}
\ No newline at end of file
: public Light
{
public:
- DirectionalLight(const vec3& _color, const vec3& _position, const vec3& _direction);
+ DirectionalLight(const vec3& _color, const float size, const vec3& _direction);
virtual ~DirectionalLight();
/*Change Light*/
- virtual void changePosition(const vec3& position);
+ virtual void changeSize(const float size);
virtual void changeDirection(const vec3& direction);
+ void useLight();
+
protected:
- vec3 position;
+ float size;
vec3 direction;
+ mat4 lightview;
+ mat4 proj;
+ mat4 invproj;
};
\ No newline at end of file
virtual void switchLight(swLight = SWITCH);
//Calculate DepthBuffers & CO
- virtual void usePreProcess();
+ //virtual void usePreProcess();
//Load light Position and DephBuffers
- virtual void useFinalDraw(); //ID? for LightArrayPosition
+ //virtual void useFinalDraw(); //ID? for LightArrayPosition
/*Change Light*/
virtual void changeColor(const vec3& color);
return tmp;
}
+int Shader::setUniformLocation(const string& _name, const vec3& _vec) const
+{
+ int tmp = glGetUniformLocation(handle, _name.c_str());
+ if (tmp >= 0)
+ glUniform3fv(tmp, 1, value_ptr(_vec));
+ return tmp;
+}
+
int Shader::setUniformLocation(const string& _name, const int& _i) const
{
int tmp = glGetUniformLocation(handle, _name.c_str());
int setUniformLocation(const string& name, const mat4& mat) const;
int setUniformLocation(const string& name, const vec4& vec) const;
+ int setUniformLocation(const string& name, const vec3& vec) const;
int setUniformLocation(const string& name, const int& i) const;
static const Shader* getShader(ShaderTarget shTarget = SH_ACTIVE);
camera(fovy, (float)width/height, zNear, zFar),
lookat(_lookat)
{
+ //Lights
+ dirLight = new DirectionalLight(vec3(1.2f), 0.2f, vec3(-1.f, -0.5f, -0.5f));
+ //dirLight = new DirectionalLight(vec3(1.2f), 0.2f, vec3(0.0f, 0.0f, -1.0f));
+
+
currenttime = 0.0f;
if (lookat != nullptr)
timestamps.push(Timestamp(0.0f, _lookat->getModelMat(), lookat->ySpeed));
shadowdir->useBuffer();
glClear(GL_DEPTH_BUFFER_BIT);
Shader::getShader(SH_SHADOWDIR)->useShader();
+ dirLight->useLight();
drawSceneObjects();
+ camera.useCamera();
+ render->useBuffer();
+ Shader::getShader(SH_LIGHTING)->useShader();
+ fBufferObject::clearBuffer();
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+ shadowdir->getTexture()->useTexture(uPLightXP);
#include "Camera.h"
#include "Timestamp.h"
+#include "../Graphix/Lights.h"
+
#include <list>
#include <set>
#include <btBulletDynamicsCommon.h>
fBufferObject* postRender;
fBufferObject** blurPingPong;
fBufferObject* shadowdir;
+
+ DirectionalLight* dirLight;
};
<ClCompile Include="Game.cpp" />\r
<ClCompile Include="GLM.cpp" />\r
<ClCompile Include="Graphix\Graphix.cpp" />\r
+ <ClCompile Include="Graphix\Lights\AmbientLight.cpp" />\r
+ <ClCompile Include="Graphix\Lights\DirectionalLight.cpp" />\r
+ <ClCompile Include="Graphix\Lights\Light.cpp" />\r
+ <ClCompile Include="Graphix\Lights\PointLight.cpp" />\r
<ClCompile Include="Graphix\Model\Animation.cpp" />\r
<ClCompile Include="Graphix\Model\BBox.cpp" />\r
<ClCompile Include="Graphix\Model\IAnimMesh.cpp" />\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="Average.h" />\r
+ <ClInclude Include="Graphix\Lights.h" />\r
+ <ClInclude Include="Graphix\Lights\AmbientLight.h" />\r
+ <ClInclude Include="Graphix\Lights\DirectionalLight.h" />\r
+ <ClInclude Include="Graphix\Lights\Light.h" />\r
+ <ClInclude Include="Graphix\Lights\PointLight.h" />\r
<ClInclude Include="Graphix\Textures\BufferObject.h" />\r
<ClInclude Include="Graphix\Debug.h" />\r
<ClInclude Include="Graphix\Model.h" />\r
<ClCompile Include="Scene\Camera.cpp">\r
<Filter>Source Files</Filter>\r
</ClCompile>\r
+ <ClCompile Include="Graphix\Lights\AmbientLight.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="Graphix\Lights\DirectionalLight.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="Graphix\Lights\Light.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
+ <ClCompile Include="Graphix\Lights\PointLight.cpp">\r
+ <Filter>Source Files</Filter>\r
+ </ClCompile>\r
</ItemGroup>\r
<ItemGroup>\r
<ClInclude Include="Fps.h">\r
<ClInclude Include="Scene\Camera.h">\r
<Filter>Header Files</Filter>\r
</ClInclude>\r
+ <ClInclude Include="Graphix\Lights\AmbientLight.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="Graphix\Lights\DirectionalLight.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="Graphix\Lights\Light.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="Graphix\Lights\PointLight.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
+ <ClInclude Include="Graphix\Lights.h">\r
+ <Filter>Header Files</Filter>\r
+ </ClInclude>\r
</ItemGroup>\r
</Project>
\ No newline at end of file
out vec3 PointLightPosition1, DirectionalLightDirection1;
+//out vec3 fPosition;
+
+out vec4 DirLightSpacePos;
+
//uniform vec3 PointLightPosition1, DirectionalLightDirection1;
+uniform vec3 DirectionalLightDirection;
uniform mat4 uProjection, uView, uModel=mat4(1.f);
+uniform mat4 dirLightProj, dirLightView;
uniform int uEnableBloom = 1;
uniform int uEnableTransp = 1;
void main()
{
PointLightPosition1 = (uView * vec4(0.0f, 1.0f, 0.0f, 1.f)).xyz;
- DirectionalLightDirection1 = normalize((uView * vec4(-1.f, -.5f, -.5f, 0.f)).xyz);
+ DirectionalLightDirection1 = normalize((uView * vec4(DirectionalLightDirection, 0.0f)).xyz);
+
+ DirLightSpacePos = dirLightProj * dirLightView * uModel * vec4(aPosition, 1.0);
fUVs = aUV;
worldNormal = normalize((uView * uModel * vec4(Normal, 0.0f)).xyz);
gl_Position = uProjection * vec4(eyePosition,1.f);
+
+
+ //fPosition = aPosition;
+ //gl_Position = vec4(aPosition, 1.0f);
}
\ No newline at end of file
in vec3 PointLightPosition1, DirectionalLightDirection1;
+//in vec3 fPosition;
+
+in vec4 DirLightSpacePos;
+
layout(location = 0) out vec4 FragColor;
uniform sampler2D uColorTexture;
+uniform sampler2D uPointLightXP;
uniform vec4 material; //vec4 in the form (ambient, point, directional, glossyness); so far it was (1, 1, 1, 3)
+uniform vec3 dirLightColor;
+
+float DirLightCalcShadowFactor(vec4 LightSpacePos)
+{
+ vec3 ProjCoords = LightSpacePos.xyz / LightSpacePos.w;
+ vec2 UVCoords = vec2(0.5f * ProjCoords.x + 0.5f, 0.5f * ProjCoords.y + 0.5f);
+ float z = 0.5f * ProjCoords.z + 0.5f;
+
+ if (UVCoords.x < 0 || UVCoords.x > 1 || UVCoords.y < 0 || UVCoords.y > 1 || z < 0 || z > 1)
+ return 0.0f;
+
+ float Depth = texture(uPointLightXP, UVCoords).x;
+ if (Depth < (z + 0.00001f))
+ return 0.0f;
+ else
+ return 1.0f;
+}
void main()
{
+
float specularConst = material[3];
vec4 uvColor = texture(uColorTexture, fUVs);
vec3 AmbientLightColor = .5f * vec3(0.1f, 0.1f, 0.1f);
vec3 PointLightColor1 = 2 * vec3(1.0f, 1.0f, 1.0f);
- vec3 DirectionalLightColor1 = 2 * vec3(0.6f, 0.6f, 0.6f);
vec3 cameraVec = normalize(eyePosition);
vec3 worldPointLightDir1 = PointLightPosition1 - eyePosition;
FragColor = vec4(uvColor.rgb * (AmbientLightColor * material[0]
+ PointLightColor1 * material[1] * (cosThetaPoint1 + pow(SpecularCosPoint1, specularConst)) / squaredist1
- + DirectionalLightColor1 * material[2] * (cosThetaDirection1 + pow(SpecularCosDirection1, specularConst))
+ + DirLightCalcShadowFactor(DirLightSpacePos) * dirLightColor * material[2] * (cosThetaDirection1 + pow(SpecularCosDirection1, specularConst))
), uvColor.a);
-
+
//FragColor = vec4((normalize(worldNormal)+1)/2, 1.0f);
//FragColor = vec4(length(DirectionalLightDirection1) - 1.0f, length(DirectionalLightDirection1) - 1.0f, length(DirectionalLightDirection1) - 1.0f, 1.0f);
//vec3 uvColor = texture(uColorTexture, fUVs).rgb;
//FragColor = vec4(uvColor, 1.0);
-}
+
+ //vec3 uvColor = vec3(1.0 - (1.0 - texture(uPointLightXP, fUVs).x) * 25.0);
+ //vec3 uvColor = vec3(texture(uPointLightXP, vec2(fPosition.x / 2 + 0.5f, fPosition.y / 2 + 0.5f)).x);
+ //FragColor = vec4(uvColor, 1.0);
+}
\ No newline at end of file