From 00726047fbdb1f7fe63aa5e40463c90056c1f9c1 Mon Sep 17 00:00:00 2001 From: Peter Schaefer Date: Thu, 23 Jun 2016 20:46:55 +0200 Subject: [PATCH] new Shaders Bloom optimized --- CGUE2015_Weave.sln | 4 +- Weave/Graphix/Graphix.cpp | 2 +- Weave/Graphix/Model/Model.cpp | 1 + Weave/Graphix/Shader.cpp | 12 +++- Weave/Graphix/Shader.h | 5 +- Weave/Graphix/Textures/Texture.cpp | 2 +- Weave/Graphix/Textures/Texture.h | 3 +- Weave/Scene/Scene.cpp | 92 +++++++++++++++++++----------- Weave/Scene/Scene.h | 1 + Weave/Scene/SceneObject.cpp | 12 ---- shader/basicTexture_VS.hlsl | 14 +---- shader/basic_VS.hlsl | 10 ++++ shader/blend_FS.hlsl | 2 +- shader/filterBright_FS.hlsl | 23 ++++++++ shader/filterMotion_FS.hlsl | 15 +++++ shader/lightingTexture_FS.hlsl | 13 +---- 16 files changed, 136 insertions(+), 75 deletions(-) create mode 100644 shader/filterBright_FS.hlsl create mode 100644 shader/filterMotion_FS.hlsl diff --git a/CGUE2015_Weave.sln b/CGUE2015_Weave.sln index f35b4cf..3654fbe 100644 --- a/CGUE2015_Weave.sln +++ b/CGUE2015_Weave.sln @@ -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 diff --git a/Weave/Graphix/Graphix.cpp b/Weave/Graphix/Graphix.cpp index 9faa62b..daf2ec4 100644 --- a/Weave/Graphix/Graphix.cpp +++ b/Weave/Graphix/Graphix.cpp @@ -312,7 +312,7 @@ SDL_Window* Graphix::sdl_window; SDL_GLContext Graphix::sdl_glcontext; -short Graphix::effects = EF_TRANSPARENCY | EF_BLOOM | EF_FRUSTUM_CULLING; +short Graphix::effects = EF_TRANSPARENCY | EF_BLOOM | EF_FRUSTUM_CULLING | EF_MOTION_BLUR; int Graphix::obj = -1; Fps Graphix::fps(0.3f); diff --git a/Weave/Graphix/Model/Model.cpp b/Weave/Graphix/Model/Model.cpp index e5b6a11..a8e604b 100644 --- a/Weave/Graphix/Model/Model.cpp +++ b/Weave/Graphix/Model/Model.cpp @@ -292,6 +292,7 @@ Model* Model::getPlaneModel() PlaneModel->bindShader(Shader::getShader(SH_BASICTEXTURE)); PlaneModel->bindShader(Shader::getShader(SH_BLUR)); PlaneModel->bindShader(Shader::getShader(SH_BLEND)); + PlaneModel->bindShader(Shader::getShader(SH_FILTER_BRIGHT)); } return PlaneModel; } diff --git a/Weave/Graphix/Shader.cpp b/Weave/Graphix/Shader.cpp index cf31301..a0bfe07 100644 --- a/Weave/Graphix/Shader.cpp +++ b/Weave/Graphix/Shader.cpp @@ -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; diff --git a/Weave/Graphix/Shader.h b/Weave/Graphix/Shader.h index 7358697..e127c15 100644 --- a/Weave/Graphix/Shader.h +++ b/Weave/Graphix/Shader.h @@ -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); diff --git a/Weave/Graphix/Textures/Texture.cpp b/Weave/Graphix/Textures/Texture.cpp index d977d80..a5eae56 100644 --- a/Weave/Graphix/Textures/Texture.cpp +++ b/Weave/Graphix/Textures/Texture.cpp @@ -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) diff --git a/Weave/Graphix/Textures/Texture.h b/Weave/Graphix/Textures/Texture.h index b6d0fd1..5de1672 100644 --- a/Weave/Graphix/Textures/Texture.h +++ b/Weave/Graphix/Textures/Texture.h @@ -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 diff --git a/Weave/Scene/Scene.cpp b/Weave/Scene/Scene.cpp index 652d402..109b635 100644 --- a/Weave/Scene/Scene.cpp +++ b/Weave/Scene/Scene.cpp @@ -24,7 +24,12 @@ #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); } diff --git a/Weave/Scene/Scene.h b/Weave/Scene/Scene.h index 6f8b24f..0f3cc0a 100644 --- a/Weave/Scene/Scene.h +++ b/Weave/Scene/Scene.h @@ -89,6 +89,7 @@ protected: fBufferObject* render; fBufferObject* postRender; + fBufferObject* postRenderSmall; fBufferObject** blurPingPong; fBufferObject* shadowdir; diff --git a/Weave/Scene/SceneObject.cpp b/Weave/Scene/SceneObject.cpp index b22516b..25b243d 100644 --- a/Weave/Scene/SceneObject.cpp +++ b/Weave/Scene/SceneObject.cpp @@ -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() + ")"); } diff --git a/shader/basicTexture_VS.hlsl b/shader/basicTexture_VS.hlsl index 07a1b7f..59f371a 100644 --- a/shader/basicTexture_VS.hlsl +++ b/shader/basicTexture_VS.hlsl @@ -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 +} diff --git a/shader/basic_VS.hlsl b/shader/basic_VS.hlsl index 0422927..6e53b17 100644 --- a/shader/basic_VS.hlsl +++ b/shader/basic_VS.hlsl @@ -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; + } diff --git a/shader/blend_FS.hlsl b/shader/blend_FS.hlsl index daf720b..75a7577 100644 --- a/shader/blend_FS.hlsl +++ b/shader/blend_FS.hlsl @@ -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 index 0000000..a0b002f --- /dev/null +++ b/shader/filterBright_FS.hlsl @@ -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 index 0000000..ad7712f --- /dev/null +++ b/shader/filterMotion_FS.hlsl @@ -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; + +} diff --git a/shader/lightingTexture_FS.hlsl b/shader/lightingTexture_FS.hlsl index 2e9bb76..06078a8 100644 --- a/shader/lightingTexture_FS.hlsl +++ b/shader/lightingTexture_FS.hlsl @@ -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 +} -- 2.47.3