]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
Directional Light Shadows
authorLockedLunatic <locked.lunatic@aon.at>
Mon, 16 May 2016 01:29:31 +0000 (03:29 +0200)
committerLockedLunatic <locked.lunatic@aon.at>
Mon, 16 May 2016 01:29:31 +0000 (03:29 +0200)
Shadow Volume doesn't move yet (and is rather small)

...finally
<(^^<) <(^^)> (>^^)>

13 files changed:
Weave/Graphix/Lights/AmbientLight.cpp
Weave/Graphix/Lights/AmbientLight.h
Weave/Graphix/Lights/DirectionalLight.cpp
Weave/Graphix/Lights/DirectionalLight.h
Weave/Graphix/Lights/Light.h
Weave/Graphix/Shader.cpp
Weave/Graphix/Shader.h
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Weave.vcxproj
Weave/Weave.vcxproj.filters
shader/basicTexture_VS.hlsl
shader/lightingTexture_FS.hlsl

index 444e80befad3782c2e5ce5b667e2f38061e08879..af8e60dcb416da9df47adb671ca2a6ce21a5e741 100644 (file)
@@ -7,4 +7,4 @@ AmbientLight::AmbientLight(const vec3 & _color) :
 
 AmbientLight::~AmbientLight()
 {
-}
+}
\ No newline at end of file
index f8301cf41a96b1655cf3aff50b2757ba276e04bb..47a6dffb87719502f6d1b6f0d85f446acf55c704 100644 (file)
@@ -12,7 +12,7 @@ public:
        virtual ~AmbientLight();
 
        /*Change Light*/
-
+       //void usePreProcess();
 
 protected:
 
index 026cf2ce7e40226ae8d69487f63b469462cb5272..4789afc8d017d48cb5cd623d7a277e4e603d2dd7 100644 (file)
@@ -1,11 +1,21 @@
 #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()
@@ -13,12 +23,24 @@ 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
index 6447fe643d1f5ce0c56ff7e1edadb718e59eb704..05d6966250c626f2499ce75449dd2c7ec601d48e 100644 (file)
@@ -7,15 +7,20 @@ class DirectionalLight
        : 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
index 3a64e927885b1c37607786bd3debce9d38de66c4..7a449ad070cf29f181ec3e1deda80f8c19188646 100644 (file)
@@ -19,10 +19,10 @@ public:
        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);
index d7e7d1d0c4ea46f23a925904fc7aa2e88e2b9eee..5812bd121532e0702b2216a6037eae62342c2566 100644 (file)
@@ -116,6 +116,14 @@ int Shader::setUniformLocation(const string& _name, const vec4& _vec) const
        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());
index 9970b1680ad09a81c2ac25d57307a985ba25a477..46bcc3064175901089745f11b0582985a3c40459 100644 (file)
@@ -42,6 +42,7 @@ public:
 
        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);
index a7b1590a68d2d074ecbb653f889279c008a5863c..6addf353167bd05387bbe1612427c8f28cb277ed 100644 (file)
@@ -40,6 +40,11 @@ Scene::Scene(unsigned int x, unsigned int y, unsigned int width, unsigned int he
 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));
@@ -234,7 +239,14 @@ void Scene::draw() const
        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);
 
 
 
index 63f77544c8a1fdfd04e01b7fb0d6f3bc4ccfffa1..a3072b7337cd349258344020a306cff7af89d6d6 100644 (file)
@@ -6,6 +6,8 @@
 #include "Camera.h"
 #include "Timestamp.h"
 
+#include "../Graphix/Lights.h"
+
 #include <list>
 #include <set>
 #include <btBulletDynamicsCommon.h>
@@ -77,4 +79,6 @@ protected:
        fBufferObject* postRender;
        fBufferObject** blurPingPong;
        fBufferObject* shadowdir;
+
+       DirectionalLight* dirLight;
 };
index 454b4231869f87e210e24d12f66b4822e0df59df..7cba953e050c15ad7874e74aaa1a9ea12d699a0d 100644 (file)
     <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
index 89e5f83f7d11aca8b4626da5980aac411a70b516..e6490990985230179c8241d62de78ed5cc6b2c8b 100644 (file)
     <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
index b2cc1cfa1e88edd87643b607bf396c35de049f18..de9ea7bfe156b0e0e937799bf3c75e6d05b5c4d8 100644 (file)
@@ -9,8 +9,14 @@ out vec2 fUVs;
 
 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;
@@ -18,7 +24,9 @@ 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;
@@ -30,4 +38,8 @@ void main()
        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
index 7b8cb9d75b0b135f7393bd75887844c8ca654a66..dc8f1e0b44020a49feb60ce03567810b7630717d 100644 (file)
@@ -5,19 +5,41 @@ in vec2 fUVs;
 
 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;
@@ -39,12 +61,16 @@ void main()
 
        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