From: LockedLunatic Date: Mon, 16 May 2016 01:29:31 +0000 (+0200) Subject: Directional Light Shadows X-Git-Url: https://git.leopard-lacewing.eu/?a=commitdiff_plain;h=27814abc7d8dbdd4bc966e7c2cdbad39d028c28e;p=cgue_weave.git Directional Light Shadows Shadow Volume doesn't move yet (and is rather small) ...finally <(^^<) <(^^)> (>^^)> --- diff --git a/Weave/Graphix/Lights/AmbientLight.cpp b/Weave/Graphix/Lights/AmbientLight.cpp index 444e80b..af8e60d 100644 --- a/Weave/Graphix/Lights/AmbientLight.cpp +++ b/Weave/Graphix/Lights/AmbientLight.cpp @@ -7,4 +7,4 @@ AmbientLight::AmbientLight(const vec3 & _color) : AmbientLight::~AmbientLight() { -} +} \ No newline at end of file diff --git a/Weave/Graphix/Lights/AmbientLight.h b/Weave/Graphix/Lights/AmbientLight.h index f8301cf..47a6dff 100644 --- a/Weave/Graphix/Lights/AmbientLight.h +++ b/Weave/Graphix/Lights/AmbientLight.h @@ -12,7 +12,7 @@ public: virtual ~AmbientLight(); /*Change Light*/ - + //void usePreProcess(); protected: diff --git a/Weave/Graphix/Lights/DirectionalLight.cpp b/Weave/Graphix/Lights/DirectionalLight.cpp index 026cf2c..4789afc 100644 --- a/Weave/Graphix/Lights/DirectionalLight.cpp +++ b/Weave/Graphix/Lights/DirectionalLight.cpp @@ -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 diff --git a/Weave/Graphix/Lights/DirectionalLight.h b/Weave/Graphix/Lights/DirectionalLight.h index 6447fe6..05d6966 100644 --- a/Weave/Graphix/Lights/DirectionalLight.h +++ b/Weave/Graphix/Lights/DirectionalLight.h @@ -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 diff --git a/Weave/Graphix/Lights/Light.h b/Weave/Graphix/Lights/Light.h index 3a64e92..7a449ad 100644 --- a/Weave/Graphix/Lights/Light.h +++ b/Weave/Graphix/Lights/Light.h @@ -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); diff --git a/Weave/Graphix/Shader.cpp b/Weave/Graphix/Shader.cpp index d7e7d1d..5812bd1 100644 --- a/Weave/Graphix/Shader.cpp +++ b/Weave/Graphix/Shader.cpp @@ -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()); diff --git a/Weave/Graphix/Shader.h b/Weave/Graphix/Shader.h index 9970b16..46bcc30 100644 --- a/Weave/Graphix/Shader.h +++ b/Weave/Graphix/Shader.h @@ -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); diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index a7b1590..6addf35 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -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); diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index 63f7754..a3072b7 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -6,6 +6,8 @@ #include "Camera.h" #include "Timestamp.h" +#include "../Graphix/Lights.h" + #include #include #include @@ -77,4 +79,6 @@ protected: fBufferObject* postRender; fBufferObject** blurPingPong; fBufferObject* shadowdir; + + DirectionalLight* dirLight; }; diff --git a/Weave/Weave.vcxproj b/Weave/Weave.vcxproj index 454b423..7cba953 100644 --- a/Weave/Weave.vcxproj +++ b/Weave/Weave.vcxproj @@ -97,6 +97,10 @@ + + + + @@ -124,6 +128,11 @@ + + + + + diff --git a/Weave/Weave.vcxproj.filters b/Weave/Weave.vcxproj.filters index 89e5f83..e649099 100644 --- a/Weave/Weave.vcxproj.filters +++ b/Weave/Weave.vcxproj.filters @@ -102,6 +102,18 @@ Source Files + + Source Files + + + Source Files + + + Source Files + + + Source Files + @@ -206,5 +218,20 @@ Header Files + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + \ No newline at end of file diff --git a/shader/basicTexture_VS.hlsl b/shader/basicTexture_VS.hlsl index b2cc1cf..de9ea7b 100644 --- a/shader/basicTexture_VS.hlsl +++ b/shader/basicTexture_VS.hlsl @@ -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 diff --git a/shader/lightingTexture_FS.hlsl b/shader/lightingTexture_FS.hlsl index 7b8cb9d..dc8f1e0 100644 --- a/shader/lightingTexture_FS.hlsl +++ b/shader/lightingTexture_FS.hlsl @@ -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