]> git.leopard-lacewing.eu Git - cgue_weave.git/commitdiff
new Shaders
authorPeter Schaefer <schaeferpm@gmail.com>
Thu, 23 Jun 2016 18:46:55 +0000 (20:46 +0200)
committerPeter Schaefer <schaeferpm@gmail.com>
Thu, 23 Jun 2016 18:46:55 +0000 (20:46 +0200)
Bloom optimized

16 files changed:
CGUE2015_Weave.sln
Weave/Graphix/Graphix.cpp
Weave/Graphix/Model/Model.cpp
Weave/Graphix/Shader.cpp
Weave/Graphix/Shader.h
Weave/Graphix/Textures/Texture.cpp
Weave/Graphix/Textures/Texture.h
Weave/Scene/Scene.cpp
Weave/Scene/Scene.h
Weave/Scene/SceneObject.cpp
shader/basicTexture_VS.hlsl
shader/basic_VS.hlsl
shader/blend_FS.hlsl
shader/filterBright_FS.hlsl [new file with mode: 0644]
shader/filterMotion_FS.hlsl [new file with mode: 0644]
shader/lightingTexture_FS.hlsl

index f35b4cfb4d6943d04c97511c1e7ab1a1588065bc..3654fbee1706b39984e0c07aedc8c0ae48c89152 100644 (file)
@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 14
-VisualStudioVersion = 14.0.25123.0
+VisualStudioVersion = 14.0.25029.0
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Weave", "Weave\Weave.vcxproj", "{A2F0B06D-880C-4B90-9D4B-8B174418E1BE}"
 EndProject
@@ -13,6 +13,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "shader", "shader", "{75179E
                shader\basicTexture_VS.hlsl = shader\basicTexture_VS.hlsl
                shader\blend_FS.hlsl = shader\blend_FS.hlsl
                shader\blur_FS.hlsl = shader\blur_FS.hlsl
+               shader\filterBright_FS.hlsl = shader\filterBright_FS.hlsl
+               shader\filterMotion_FS.hlsl = shader\filterMotion_FS.hlsl
                shader\lightingTexture_FS.hlsl = shader\lightingTexture_FS.hlsl
                shader\perspective_VS.hlsl = shader\perspective_VS.hlsl
                shader\pointlight_FS.hlsl = shader\pointlight_FS.hlsl
index 9faa62b5b01e9cf03f139b941dcb4d07158f7f9e..daf2ec4fab30af9fb18664030594b8a7a65ef76f 100644 (file)
@@ -312,7 +312,7 @@ SDL_Window* Graphix::sdl_window;
 \r
 SDL_GLContext Graphix::sdl_glcontext;\r
 \r
-short Graphix::effects = EF_TRANSPARENCY | EF_BLOOM | EF_FRUSTUM_CULLING;\r
+short Graphix::effects = EF_TRANSPARENCY | EF_BLOOM | EF_FRUSTUM_CULLING | EF_MOTION_BLUR;\r
 \r
 int Graphix::obj = -1;\r
 Fps Graphix::fps(0.3f);\r
index e5b6a11f7d3d223aae4caf4c5020fd99ce9c64bb..a8e604beefbc6eb649f8747261ccdffa259a0f25 100644 (file)
@@ -292,6 +292,7 @@ Model* Model::getPlaneModel()
                PlaneModel->bindShader(Shader::getShader(SH_BASICTEXTURE));\r
                PlaneModel->bindShader(Shader::getShader(SH_BLUR));\r
                PlaneModel->bindShader(Shader::getShader(SH_BLEND));\r
+               PlaneModel->bindShader(Shader::getShader(SH_FILTER_BRIGHT));\r
        }\r
        return PlaneModel;\r
 }\r
index cf31301c60d177686cd3afc30dd828a1c09d9453..a0bfe07f5d98662ea402301c12b8bf62613d5f8a 100644 (file)
@@ -6,7 +6,7 @@
 
 using namespace std;
 
-#define SHADER_NUM 8
+#define SHADER_NUM 10
 
 Shader::Shader(string _shader1, string _shader2)
 {
@@ -132,6 +132,14 @@ int Shader::setUniformLocation(const string& _name, const int& _i) const
        return tmp;
 }
 
+int Shader::setUniformLocation(const string& _name, const float& _i) const
+{
+       int tmp = glGetUniformLocation(handle, _name.c_str());
+       if (tmp >= 0)
+               glUniform1f(tmp, _i);
+       return tmp;
+}
+
 
 
 
@@ -240,6 +248,8 @@ void Shader::init()
                shList[SH_BLEND] = new Shader("basic_VS.hlsl", "blend_FS.hlsl");
                shList[SH_SHADOWDIR] = new Shader("shadowmapDir_VS.hlsl", "shadowmapDir_FS.hlsl");
                shList[SH_POINTLIGHT] = new Shader("pointlight_VS.hlsl", "pointlight_FS.hlsl");
+               shList[SH_FILTER_BRIGHT] = new Shader("basic_VS.hlsl", "filterBright_FS.hlsl");
+               shList[SH_FILTER_MOTION] = new Shader("basic_VS.hlsl", "filterMotion_FS.hlsl");
        }
 
        initShader = true;
index 7358697f7c57d1e07611011aba3a34b66401e3dd..e127c15184efade835b7ce613fe72cad7dacf5f8 100644 (file)
@@ -17,7 +17,9 @@ enum ShaderTarget {
        SH_BLUR = 4,
        SH_BLEND = 5,
        SH_SHADOWDIR = 6,
-       SH_POINTLIGHT = 7
+       SH_POINTLIGHT = 7,
+       SH_FILTER_BRIGHT = 8,
+       SH_FILTER_MOTION = 9
 }; //Don't forget to resize the shList Array at the begining of shader.cpp!
 
 class Shader
@@ -45,6 +47,7 @@ public:
        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;
+       int setUniformLocation(const string& name, const float& i) const;
 
        static const Shader* getShader(ShaderTarget shTarget = SH_ACTIVE);
 
index d977d809d1c19daa2fdc3fa68778130bc169078d..a5eae56a76400d5cd33720d1ea3809ddc16193f5 100644 (file)
@@ -9,7 +9,7 @@
 using std::string;
 using std::unordered_map;
 
-string bindTargets[] = {"uColorTexture", "uBlendTexture", "uPointLightXP", "uPointLightXM", "uPointLightYP", "uPointLightYM", "uPointLightZP", "uPointLightZM" };
+string bindTargets[] = {"uColorTexture", "uBlendTexture", "uPointLightXP", "uPointLightXM", "uPointLightYP", "uPointLightYM", "uPointLightZP", "uPointLightZM", "uBlurVec2" };
 
 
 Texture::Texture(texTarget _target, unsigned int _type)
index b6d0fd14548e5d3f764c70968099d6796f52a28f..5de1672312408b841f6ed1e01e25138c68a04ac8 100644 (file)
@@ -22,7 +22,8 @@ enum bindTarget {
        uPLightYP = 4,
        uPLightYM = 5,
        uPLightZP = 6,
-       uPLightZM = 7
+       uPLightZM = 7,
+       uBLURVEC2 = 8
 }; //Don't forget to assign the correct name in bindTargets at the beginning of Texture.cpp!
 
 class Texture
index 652d402bed24b33b5a3d89658b6e0937f67f6b00..109b635a22686ad2eff8c13479b84f99a9c5d9c2 100644 (file)
 
 #define NELEMS(x)  (sizeof(x) / sizeof((x)[0]))
 
-ShaderTarget shader[] = { SH_BASIC,SH_BASICTEXTURE,SH_LIGHTING, SH_SHADOWDIR };
+ShaderTarget shader[] = {SH_BASIC, SH_BASICTEXTURE, SH_LIGHTING, SH_SHADOWDIR, SH_FILTER_MOTION};
+
+#define W_HEIGHT Graphix::getWindowHeight()
+#define W_WIDTH Graphix::getWindowWidth()
+
+#define SMALL_F 4
 
 
 using std::list;
@@ -82,21 +87,24 @@ lookat(_lookat)
        bt_dynamics_world->setGravity(btVector3(0, YFALL_SPEED, 0));
 
        /*BUFFERS*/
-       render = new fBufferObject();
-       render->bindBuffer(Graphix::getWindowWidth(), Graphix::getWindowHeight());
+       render = new fBufferObject(2);
+       render->bindBuffer(W_WIDTH, W_HEIGHT);
 
        blurPingPong = new fBufferObject*[2];
        for (int i = 0; i < 2; i++)
        {
                blurPingPong[i] = new fBufferObject(1, false);
-               blurPingPong[i]->bindBuffer(Graphix::getWindowWidth()/2, Graphix::getWindowHeight()/2);
+               blurPingPong[i]->bindBuffer(W_WIDTH/ SMALL_F, W_HEIGHT/ SMALL_F);
        }
 
        shadowdir = new dBufferObject();
        shadowdir->bindBuffer(1024, 1024);
 
-       postRender = new fBufferObject(2, false);
-       postRender->bindBuffer(Graphix::getWindowWidth()/2, Graphix::getWindowHeight()/2);
+       postRender = new fBufferObject(1, false);
+       postRender->bindBuffer(W_WIDTH, W_HEIGHT);
+
+       postRenderSmall = new fBufferObject(1, false);
+       postRenderSmall->bindBuffer(W_WIDTH / SMALL_F, W_HEIGHT / SMALL_F);
 
        fBufferObject::clearBuffer();
 
@@ -139,6 +147,7 @@ Scene::~Scene()
 
        delete shadowdir;
        delete postRender;
+       delete postRenderSmall;
 
 
        //if (viewPort != nullptr)
@@ -285,16 +294,18 @@ void Scene::draw() const
        glEnable(GL_POLYGON_OFFSET_FILL);
        glPolygonOffset(4.f, 0.f);
        glViewport(0, 0, 1024, 1024);
+
        shadowdir->useBuffer();
-       glClear(GL_DEPTH_BUFFER_BIT);
        Shader::getShader(SH_SHADOWDIR)->useShader();
+       glClear(GL_DEPTH_BUFFER_BIT);
+
        dirLight->useLight();
        drawSceneObjects(DRAW_Model,false);
 
 
        glCullFace(GL_BACK);
        glDisable(GL_POLYGON_OFFSET_FILL);
-       glViewport(0, 0, Graphix::getWindowWidth(), Graphix::getWindowHeight());
+       glViewport(0, 0, W_WIDTH, W_HEIGHT);
 
        /* Prepare DRAW SCENE */
        camera.useCamera();
@@ -308,7 +319,7 @@ void Scene::draw() const
 
 
        /* DRAW SCENE */
-       if (Graphix::testEffect(EF_BLOOM))
+       if (Graphix::testEffect(EF_BLOOM) || Graphix::testEffect(EF_MOTION_BLUR))
        {
                render->useBuffer();
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -326,17 +337,23 @@ void Scene::draw() const
 
 
        Shader::getShader(SH_LIGHTING)->useShader();
+       drawSceneObjects();
+
+
        /* MOTION BLUR */
        if (Graphix::testEffect(EF_MOTION_BLUR))
        {
+               postRender->useBuffer();
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+               Shader::getShader(SH_FILTER_MOTION)->useShader();
                camera.useOldProjView();
-               Shader::getShader(SH_ACTIVE)->setUniformLocation("uDelta",Graphix::fps.getCappedDelta());
-               //upload deltaT
+               Shader::getShader(SH_ACTIVE)->setUniformLocation("uDelta", Graphix::fps.getCappedDelta());
                drawSceneObjects(DRAW_ModelMotionBlur);
        }
        else
        {
-               drawSceneObjects();
+               
        }
 
        //Pointlights & their shadows
@@ -384,28 +401,29 @@ void Scene::draw() const
        if (Graphix::testEffect(EF_BLOOM))
        {
                /* DRAW BRIGHTNESS */
-               glViewport(0, 0, Graphix::getWindowWidth() / 2, Graphix::getWindowHeight() / 2);
-               postRender->useBuffer();
-               render->getTexture()->downscale(1);
-               //glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+               glViewport(0, 0, W_WIDTH / SMALL_F, W_HEIGHT / SMALL_F);
+               postRenderSmall->useBuffer();
                glClear(GL_COLOR_BUFFER_BIT);
-               Shader::getShader(SH_BASICTEXTURE)->useShader();
-               Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uBrightness", 1);
+               //glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
+
+               render->getTexture()->downscale(1);
+               
+               Shader::getShader(SH_FILTER_BRIGHT)->useShader();
+               Shader::getShader(SH_ACTIVE)->setUniformLocation("uFilterThreshold",1.2f);
                render->getTexture()->useTexture();
                Model::getPlaneModel()->drawModel(mat4(1.f));
-               Shader::getShader(SH_BASICTEXTURE)->setUniformLocation("uBrightness", 0);
-
+               
                /* BLUR BRIGHTNESS */
                Shader::getShader(SH_BLUR)->useShader();
 
                for (int i = 0; i < 4; i++)
                {
                        blurPingPong[horizontal]->useBuffer();
-                       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-                       Shader::getShader(SH_BLUR)->setUniformLocation("uHorizontal", horizontal);
+                       glClear(GL_COLOR_BUFFER_BIT);
+                       Shader::getShader(SH_ACTIVE)->setUniformLocation("uHorizontal", horizontal);
                        if (firstit)
                        {
-                               postRender->getTexture(1)->useTexture();
+                               postRenderSmall->getTexture()->useTexture();
                                firstit = false;
                        }
                        else
@@ -415,7 +433,7 @@ void Scene::draw() const
 
                        horizontal = !horizontal;
                }
-               glViewport(0, 0, Graphix::getWindowWidth(), Graphix::getWindowHeight());
+               glViewport(0, 0, W_WIDTH, W_HEIGHT);
        }
 
 
@@ -431,18 +449,23 @@ void Scene::draw() const
 
        if (Graphix::testEffect(EF_BLOOM))
        {
-               /* BLEND BRIGHTNESS TO ORIGINAL*/
-               Shader::getShader(SH_BLEND)->useShader();
-               //Shader::getShader(SH_BASICTEXTURE)->useShader();
-
                fBufferObject::clearBuffer();
                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-               //SceneObjects.front()->gTexture()->useTexture();
-               //shadowdir->getTexture()->useTexture();
-               
+
+               /* BLEND BRIGHTNESS TO ORIGINAL*/
+               Shader::getShader(SH_BLEND)->useShader();
                render->getTexture(0)->useTexture(uCOLOR);
-               //postRender->getTexture(1)->useTexture(uCOLOR);
                blurPingPong[!horizontal]->getTexture()->useTexture(uBLEND);
+
+
+
+               //Shader::getShader(SH_BASICTEXTURE)->useShader();
+               //postRender->getTexture(1)->useTexture(uCOLOR);
+               //SceneObjects.front()->gTexture()->useTexture();
+               //blurPingPong[!horizontal]->getTexture()->useTexture();
+               //postRenderSmall->getTexture()->useTexture();
+
+
                Model::getPlaneModel()->drawModel(mat4(1.f));
        }
 
@@ -518,9 +541,10 @@ void Scene::setView(unsigned int width, unsigned int height, bool updateProjecti
        }
 
        render->updateSize(width, height);
-       postRender->updateSize(width / 2, height / 2);
+       postRender->updateSize(width, height);
+       postRenderSmall->updateSize(width / SMALL_F, height / SMALL_F);
        for (int i = 0; i < 2; i++)
-               blurPingPong[i]->updateSize(width / 2, height / 2);
+               blurPingPong[i]->updateSize(width / SMALL_F, height / SMALL_F);
        //shadowdir->updateSize(width, height);
 
 }
index 6f8b24fe57d4d6ab0dc4f08948031cea750d3e08..0f3cc0ab5d5322b67d7b3bcd6d671f0660ec3a5f 100644 (file)
@@ -89,6 +89,7 @@ protected:
 
        fBufferObject* render;
        fBufferObject* postRender;
+       fBufferObject* postRenderSmall;
        fBufferObject** blurPingPong;
        fBufferObject* shadowdir;
 
index b22516bdf89ae3297ae61d1b075b1c075f207c0d..25b243d931728eb3ea32888863cef479af9129ac 100644 (file)
@@ -248,18 +248,6 @@ void SceneObject::bindShaderCollision(const Shader* _shader)
 
 void SceneObject::collides(SceneObject* _other, btPersistentManifold* _contactManifold, float _deltaT)
 {
-       //int numContacts = _contactManifold->getNumContacts();
-       ////For each contact point in that manifold
-       //double pdist = _contactManifold->getContactPoint(0).getDistance();
-       //for (int j = 0; j < numContacts; j++) {
-       //      //Get the contact information
-       //      btManifoldPoint& pt = _contactManifold->getContactPoint(j);
-       //      btVector3 ptA = pt.getPositionWorldOnA();
-       //      pdist = min((double)pt.getDistance(),pdist);
-       //}
-       
-//     if (!ignore && !_other->ignore && pdist <= 0)
-//             Message::info((std::string)"Kollision! " + std::to_string(pdist) + " (" + (std::string)*model + " with " + (std::string)*_other->getModel() + ")");
 
 }
 
index 07a1b7fd57e076d5f73b18c4414fafec295d0a9f..59f371a3c272dfac9c0f58fc26467d8530790c1e 100644 (file)
@@ -9,10 +9,6 @@ out vec2 fUVs;
 
 out vec3  PointLightPosition1, DirectionalLightDirection1;
 
-out mat4 new2old;
-
-//out vec3 fPosition;
-
 out vec4 DirLightSpacePos;
 
 //uniform vec3 PointLightPosition1, DirectionalLightDirection1;
@@ -22,13 +18,8 @@ uniform mat4 dirLightProj, dirLightView;
 
 uniform mat4 uOldProjView, uInvProjView, uCur2OldModel;
 
-uniform int uEnableBloom = 1;
-uniform int uEnableTransp = 1;
-
 void main()
 {
-       new2old = uOldProjView * uCur2OldModel * uInvProjView;
-
        PointLightPosition1 = (uView * vec4(0.0f, 1.0f, 0.0f, 1.f)).xyz;
        DirectionalLightDirection1 = normalize((uView * vec4(DirectionalLightDirection, 0.0f)).xyz);
 
@@ -45,8 +36,7 @@ void main()
                Normal[i] = 1/(scale[i][i])*aNormal[i];
        worldNormal = normalize((uView * uModel * vec4(Normal, 0.0f)).xyz);
 
-       gl_Position = uProjection * vec4(eyePosition,1.f);
-
+       gl_Position = uProjection * vec4(eyePosition, 1.f);
 
        //gl_Position = vec4(aPosition, 1.0f);
-}
\ No newline at end of file
+}
index 04229273e2a99e1b8a0821bae9948892d5e90b2e..6e53b171a6d52ba6328f1b92de62ead856f4d202 100644 (file)
@@ -4,10 +4,17 @@
 in vec3 aPosition;
 in vec2 aUV;
 
+out vec4 pixPosition;
+out mat4 new2old;
+
+
 uniform mat4 uProjection = mat4(1.f);
 uniform mat4 uModel = mat4(1.f);
 uniform mat4 uView = mat4(1.f);
 
+uniform mat4 uOldProjView, uInvProjView, uCur2OldModel;
+
+
 uniform bool uFar = false;
 uniform bool uPlain = false;
 
@@ -17,6 +24,7 @@ void main()
 {
        vec4 position;
        fUVs = aUV;
+       new2old = uOldProjView * uCur2OldModel * uInvProjView;
 
        if(uPlain)
                position = vec4(aPosition, 1.f);
@@ -28,4 +36,6 @@ void main()
        else
                gl_Position = position;
 
+       pixPosition = gl_Position;
+
 }
index daf720bd7933e507571b8ce676bffbeaa245122e..75a7577e35e7f31ade02d96e40302a75e5823008 100644 (file)
@@ -1,6 +1,6 @@
 //Fragment Shader
 #version 330 core
-//in worldNormal;
+
 in vec2 fUVs;
 
 layout(location = 0) out vec4 FragColor;
diff --git a/shader/filterBright_FS.hlsl b/shader/filterBright_FS.hlsl
new file mode 100644 (file)
index 0000000..a0b002f
--- /dev/null
@@ -0,0 +1,23 @@
+//Fragment Shader
+#version 330 core
+
+in vec2 fUVs;
+
+layout(location = 0) out vec4 BrightColor;
+
+uniform sampler2D uColorTexture;
+uniform vec3 uFilterColor = vec3(0.2126f, 0.7152f, 0.0722f);
+uniform float uFilterThreshold = 1.f;
+
+void main()
+{
+       vec4 FragColor = texture(uColorTexture, fUVs);
+
+       float brightness = dot(FragColor.rgb, uFilterColor);
+
+       if (brightness > uFilterThreshold)
+               BrightColor = vec4(FragColor.rgb, 1.0);
+       else
+               BrightColor = vec4(0.);
+}
diff --git a/shader/filterMotion_FS.hlsl b/shader/filterMotion_FS.hlsl
new file mode 100644 (file)
index 0000000..ad7712f
--- /dev/null
@@ -0,0 +1,15 @@
+//Fragment Shader
+#version 330 core
+
+in vec4 pixPosition;
+in mat4 new2old;
+
+layout(location = 0) out vec3 MotionVec;
+void main()
+{
+       vec3 currentPos = pixPosition.xyz / pixPosition.w;
+       vec4 oldPos = new2old * vec4(currentPos, 1);
+       MotionVec = oldPos.xyz / oldPos.w - currentPos.xyz;
+
+}
index 2e9bb765a35de5c9c2d032f87e4906067dcd9b1a..06078a8fe90281e58b800147a6d517592f2a367e 100644 (file)
@@ -1,14 +1,9 @@
-//Fragment Shader
+//Fragment Shader
 #version 330
+
 in vec3 eyePosition, worldNormal;
 in vec2 fUVs;
-
 in vec3 PointLightPosition1, DirectionalLightDirection1;
-
-in mat4 new2old;
-
-//in vec3 fPosition;
-
 in vec4 DirLightSpacePos;
 
 layout(location = 0) out vec4 FragColor;
@@ -19,8 +14,6 @@ uniform vec4 material;                                        //vec4 in the form (ambient, point, directional, glos
 uniform vec3 dirLightColor;
 uniform vec3 AmbientLightColor;
 
-uniform float uDelta;
-
 float DirLightCalcShadowFactor(vec4 LightSpacePos)
 {
        vec3 pos = LightSpacePos.xyz / LightSpacePos.w;
@@ -70,4 +63,4 @@ void main()
        //vec3 uvColor = vec3(1.0 - (1.0 - texture(uPointLightXP, fUVs).x) * 25.0);
        //vec3 uvColor = vec3(textureProj(uPointLightXP, DirLightSpacePos));
        //FragColor = vec4(uvColor, 1.0);
-}
\ No newline at end of file
+}