From a9fc5d0cf5c63b141dd940044032138177fd399f Mon Sep 17 00:00:00 2001 From: Hugo Willaume Date: Wed, 5 Jun 2019 15:57:28 +0900 Subject: [PATCH] Decided to start off a cleaner base, deleted most of uneeded code for this specific demo --- BaseGLProject/BaseGLProject.vcxproj | 2 - BaseGLProject/BaseGLProject.vcxproj.filters | 6 - BaseGLProject/DSGeometryPass.frag | 32 ++-- BaseGLProject/DSGeometryPass.vert | 9 +- BaseGLProject/Models/Mesh.cpp | 168 ++------------------ BaseGLProject/Models/Mesh.h | 8 +- BaseGLProject/MyGLWindow.cpp | 97 ++--------- BaseGLProject/MyGLWindow.h | 4 +- BaseGLProject/Shader.cpp | 72 --------- BaseGLProject/Shader.h | 44 +---- BaseGLProject/Skybox.cpp | 141 ---------------- BaseGLProject/Skybox.h | 30 ---- 12 files changed, 71 insertions(+), 542 deletions(-) delete mode 100644 BaseGLProject/Skybox.cpp delete mode 100644 BaseGLProject/Skybox.h diff --git a/BaseGLProject/BaseGLProject.vcxproj b/BaseGLProject/BaseGLProject.vcxproj index 3ef095a..281918c 100644 --- a/BaseGLProject/BaseGLProject.vcxproj +++ b/BaseGLProject/BaseGLProject.vcxproj @@ -158,7 +158,6 @@ - @@ -182,7 +181,6 @@ - diff --git a/BaseGLProject/BaseGLProject.vcxproj.filters b/BaseGLProject/BaseGLProject.vcxproj.filters index c6c8dc2..e846013 100644 --- a/BaseGLProject/BaseGLProject.vcxproj.filters +++ b/BaseGLProject/BaseGLProject.vcxproj.filters @@ -69,9 +69,6 @@ Source Files - - Source Files - Source Files @@ -134,9 +131,6 @@ Header Files - - Header Files - Header Files diff --git a/BaseGLProject/DSGeometryPass.frag b/BaseGLProject/DSGeometryPass.frag index ce17401..c0c1918 100644 --- a/BaseGLProject/DSGeometryPass.frag +++ b/BaseGLProject/DSGeometryPass.frag @@ -1,23 +1,29 @@ #version 440 -layout (location = 0) out vec3 gPosition; -layout (location = 1) out vec3 gNormal; -layout (location = 2) out vec4 gAlbedoSpec; +//layout (location = 0) out vec3 gPosition; +//layout (location = 1) out vec3 gNormal; +//layout (location = 2) out vec4 gAlbedoSpec; in vec2 TexCoords; in vec3 FragPos; in vec3 Normal; +in vec3 RawColor; -uniform sampler2D[32] tex; +out vec3 FragColor; + +uniform sampler2D tex; void main() -{ - // store the fragment position vector in the first gbuffer texture - gPosition = FragPos; - // also store the per-fragment normals into the gbuffer - gNormal = normalize(Normal); - // and the diffuse per-fragment color - gAlbedoSpec.rgb = texture(tex[0], TexCoords).rgb; - // store specular intensity in gAlbedoSpec's alpha component +{ + //gPosition = FragPos; + //gPosition = normalize(abs(FragPos)); +// gPosition = vec3(1,1,1); +// +// gNormal = normalize(Normal); +// +// gAlbedoSpec.rgb = vec3(1,0,1); +// gAlbedoSpec.a = 1; + //gAlbedoSpec.rgb = texture(tex, TexCoords).rgb; //gAlbedoSpec.a = texture(texture_specular1, TexCoords).r; - gAlbedoSpec.a = 1; + + FragColor = RawColor; } diff --git a/BaseGLProject/DSGeometryPass.vert b/BaseGLProject/DSGeometryPass.vert index c3ffa1a..9734170 100644 --- a/BaseGLProject/DSGeometryPass.vert +++ b/BaseGLProject/DSGeometryPass.vert @@ -2,20 +2,23 @@ layout(location=0) in vec3 coord3d; layout(location=1) in vec3 v_normal; +layout(location=2) in vec3 v_color; layout(location=3) in vec2 v_texmap; out vec2 TexCoords; out vec3 FragPos; +out vec3 RawColor; out vec3 Normal; +uniform mat4 mvp; uniform mat3 NormalMatrix; uniform mat4 ModelMatrix; -uniform mat4 mvp; void main(void) { Normal = v_normal * NormalMatrix; - TexCoords = v_texmap; - FragPos = (ModelMatrix * vec4(coord3d, 1.0f)).xyz; + TexCoords = v_texmap; gl_Position = mvp * vec4(coord3d, 1.0f); + FragPos = (ModelMatrix * vec4(coord3d, 1.0f)).xyz; + //FragPos = gl_Position.xyz; } \ No newline at end of file diff --git a/BaseGLProject/Models/Mesh.cpp b/BaseGLProject/Models/Mesh.cpp index ea91c25..a7a5b51 100644 --- a/BaseGLProject/Models/Mesh.cpp +++ b/BaseGLProject/Models/Mesh.cpp @@ -278,9 +278,8 @@ Mesh::MeshEntry::~MeshEntry() { /** * Renders this MeshEntry **/ -void Mesh::MeshEntry::render(SceneContext &ctx, Shader *shd) { - - textureBinding(shd); +void Mesh::MeshEntry::render(SceneContext &ctx, Shader &shd) { + glBindVertexArray(vao); if (renderType == NO_INDEX) { @@ -291,38 +290,16 @@ void Mesh::MeshEntry::render(SceneContext &ctx, Shader *shd) { int size; glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); glDrawElements(GL_TRIANGLES, size / sizeof(unsigned int), GL_UNSIGNED_INT, NULL); - } - textureUnbinding(); + } glBindVertexArray(0); } -void Mesh::MeshEntry::textureBinding(Shader * shd) -{ - for (GLuint i = 0; i < textures.size(); i++) - { - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, textures[i].tex_ref); - shd->addUniform("tex[" + std::to_string(i) + "]", (int)i); - } - //if (textures.size() > 0) - //shd->addUniform("TexCount", (int)textures.size()); -} - -void Mesh::MeshEntry::textureUnbinding() -{ - for (GLuint i = 0; i < textures.size(); i++) - { - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, 0); - } -} - /** * Mesh constructor, loads the specified filename if supported by Assimp **/ -Mesh::Mesh(const char *filename, Shader *sh) +Mesh::Mesh(const char *filename, std::string vert_shd, std::string frag_shd) { - shader = sh; + shader = Shader(vert_shd, frag_shd); std::string fullname; fullname = std::string("./Models/")+ std::string(filename); @@ -339,32 +316,11 @@ Mesh::Mesh(const char *filename, Shader *sh) { std::cout << "ERROR::ASSIMP:: " << importer.GetErrorString() << std::endl; return; - } - - // Load all textures - for (unsigned int i = 0; i < scene->mNumMaterials; i++) - { - aiMaterial* material = scene->mMaterials[i]; - if (material->GetTextureCount(aiTextureType_DIFFUSE) > 0) { //we only care diffuse texture - aiString Path; - if (material->GetTexture(aiTextureType_DIFFUSE, 0, &Path, NULL, NULL, NULL, - NULL, NULL) == AI_SUCCESS) { - std::string FullPath = directory + Path.data; //texture file - textures.emplace(FullPath, Texture(FullPath)); - } - } - } - - for (unsigned int i = 0; i < scene->mNumMeshes; ++i) { - meshEntries.push_back(new Mesh::MeshEntry(scene->mMeshes[i], scene, this)); - } - + } } -Mesh::Mesh(Dataset &set, Shader *sh) -{ - shader = sh; - +Mesh::Mesh(Dataset &set, std::string vert_shd, std::string frag_shd) : shader(vert_shd, frag_shd) +{ meshEntries.push_back(new Mesh::MeshEntry(set, this)); } @@ -380,57 +336,9 @@ Mesh::~Mesh(void) meshEntries.clear(); } -void Mesh::enableCulling() -{ - if (cullMode == NONE) - return; - glEnable(GL_CULL_FACE); - glCullFace(cullMode); -} - -void Mesh::disableCulling() -{ - if (cullMode == NONE) - return; - glDisable(GL_CULL_FACE); -} - -void Mesh::textureUnbinding() -{ - for (GLuint i = 0; i < textures.size(); i++) - { - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, 0); - } -} - -void Mesh::textureBinding(Shader *shd) -{ - int nmap_counter = 0; - int i = 0; - for (std::map::iterator it = textures.begin(); it != textures.end(); ++it) - { - glActiveTexture(GL_TEXTURE0 + i); - glBindTexture(GL_TEXTURE_2D, it->second.tex_ref); - //shd->applyTextureMaterial(it->second); - if (it->second.isNmap) - { - shd->addUniform("nmap", (int)i); - nmap_counter++; - } - else - shd->addUniform("tex[" + std::to_string(i - nmap_counter) + "]", (int)i); - i++; - } - /*if (textures.size() > 0) - shd->addUniform("TexCount", (int)textures.size() - nmap_counter);*/ -} - void Mesh::draw(SceneContext &ctx) { - shader->enable(); - textureBinding(shader); - enableCulling(); + shader.enable(); for (unsigned int i = 0; i < meshEntries.size(); ++i) { MeshEntry * m = meshEntries[i]; @@ -439,63 +347,21 @@ void Mesh::draw(SceneContext &ctx) { model.glPushMatrix(); effectTransformations(); - - //Retrieving material data from the vertex - - float shininess = meshEntries.at(i)->shininessStrength; - glm::vec3 diffuse = glm::vec3(meshEntries.at(i)->dcolor.r, meshEntries.at(i)->dcolor.g, meshEntries.at(i)->dcolor.b); - glm::vec3 specular = glm::vec3(meshEntries.at(i)->scolor.r, meshEntries.at(i)->scolor.g, meshEntries.at(i)->scolor.b); - glm::vec3 ambient = glm::vec3(meshEntries.at(i)->acolor.r, meshEntries.at(i)->acolor.g, meshEntries.at(i)->acolor.b); - - if (glm::length(ambient) == 0 && textures.size() > 0 && textures.begin()->second.mat.enabled) - ambient = textures.begin()->second.mat.ka; - else if (glm::length(ambient) == 0) - ambient = glm::vec3(0.1, 0.1, 0.1); - - if (glm::length(diffuse) == 0 && textures.size() > 0 && textures.begin()->second.mat.enabled) - diffuse = textures.begin()->second.mat.ks; - else if (glm::length(diffuse) == 0) - diffuse = glm::vec3(0.9, 0.9, 0.9); - if (glm::length(specular) == 0 && textures.size() > 0 && textures.begin()->second.mat.enabled) - specular = textures.begin()->second.mat.ks; - else if (glm::length(specular) == 0) - specular = glm::vec3(0.4, 0.4, 0.4); - - if (shininess == 0 && textures.size() > 0 && textures.begin()->second.mat.enabled) - shininess = textures.begin()->second.mat.shininess; - else if (shininess == 0) - shininess = 150.0f; - - shader->mat.ka = ambient; - shader->mat.kd = diffuse; - shader->mat.ks = specular; - shader->mat.shininess = shininess; - // Setting the space matrixes uniques to the object - ctx.modelMatrix = model.getMatrix(); - if (shader->uniformFlags & MVP_FLAG) - ctx.mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * ctx.modelMatrix; - if (shader->uniformFlags & MODELVIEW_FLAG) - ctx.modelViewMatrix = ctx.viewMatrix * ctx.modelMatrix; - if (shader->uniformFlags & NORMAL_MAT_FLAG) - ctx.normalMatrix = glm::mat3(glm::transpose(glm::inverse(ctx.modelViewMatrix))); - - //Sending the uniform data to the shader + ctx.modelMatrix = model.getMatrix(); + ctx.mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * ctx.modelMatrix; + ctx.modelViewMatrix = ctx.viewMatrix * ctx.modelMatrix; + ctx.normalMatrix = glm::mat3(glm::transpose(glm::inverse(ctx.modelViewMatrix))); - shader->setUniforms(ctx); + shader.addUniform("mvp", ctx.mvpMatrix); + shader.addUniform("NormalMatrix", ctx.normalMatrix); + shader.addUniform("ModelMatrix", ctx.modelMatrix); meshEntries.at(i)->render(ctx, shader); model.glPopMatrix(); } - disableCulling(); - textureUnbinding(); - shader->disable(); -} - -void Mesh::assignTexture(Texture &texture) -{ - //textures.emplace_back(texture); + shader.disable(); } void Mesh::effectTransformations() diff --git a/BaseGLProject/Models/Mesh.h b/BaseGLProject/Models/Mesh.h index 6902160..f8334fc 100644 --- a/BaseGLProject/Models/Mesh.h +++ b/BaseGLProject/Models/Mesh.h @@ -60,15 +60,15 @@ public: MeshEntry(Dataset &set, Mesh *m); ~MeshEntry(); Mesh * parent; - void render(SceneContext &ctx, Shader *shd); + void render(SceneContext &ctx, Shader &shd); private: void textureBinding(Shader *shd); void textureUnbinding(); }; public: - Mesh(const char *filename, Shader *sh); - Mesh(Dataset &dataset, Shader *sh); + Mesh(const char *filename, std::string vert_shd, std::string frag_shd); + Mesh(Dataset &dataset, std::string vert_shd, std::string frag_shd); ~Mesh(void); std::string directory; std::vector meshEntries; @@ -97,7 +97,7 @@ public: void removeLastTransformations(int n); glm::vec3 getPosition(); - Shader *shader; + Shader shader; void draw(SceneContext &ctx); void assignTexture(Texture &texture); diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp index b2cdac3..035b8de 100644 --- a/BaseGLProject/MyGLWindow.cpp +++ b/BaseGLProject/MyGLWindow.cpp @@ -1,5 +1,4 @@ #include "MyGlWindow.h" -#include "FreeImage.h" //Getting the projection matrix glm::mat4x4 perspective(float fovy, float aspect, float near, float far) @@ -84,62 +83,9 @@ void MyGlWindow::textureSetup() _scnctx.textures["CubeNmap"].isNmap = true; } -void MyGlWindow::shaderSetup() -{ - shaders["Simple"] = new Shader("simple.vert", "simple.frag"); - shaders["Simple"]->uniformFlags = ShaderFlags::MVP_FLAG; - - shaders["BaseLight"] = new Shader("base_light.vert", "base_light.frag"); - shaders["ShadowLight"] = new Shader("shadow_light.vert", "shadow_light.frag"); - shaders["LightPOV"] = new Shader("light_pov.vert", "light_pov.frag"); - shaders["LightPOV"]->uniformFlags = 0; - shaders["Fog"] = new Shader("fog.vert", "fog.frag"); - - shaders["TexBaseLight"] = new Shader("tex_base_light.vert", "tex_base_light.frag"); - shaders["TexNmapLight"] = new Shader("nmap.vert", "nmap.frag"); - shaders["TexNmapLight"]->uniformFlags &= ~ShaderFlags::KD_FLAG; - - shaders["SpotLight"] = new Shader("spotlight.vert", "spotlight.frag"); - shaders["SpotLight"]->light_type = Light::LightType::SPOT; - shaders["TexSpotLight"] = new Shader("tex_spotlight.vert", "tex_spotlight.frag"); - shaders["TexSpotLight"]->light_type = Light::LightType::SPOT; - - shaders["Silhouette"] = new Shader("silhouette.vert", "silhouette.frag"); - shaders["Silhouette"]->uniformFlags = ShaderFlags::MVP_FLAG; - shaders["Silhouette"]->addUniform("fColor", glm::vec3(237 / 255, 229 / 255, 194 / 255)); - shaders["Silhouette"]->addUniform("sil_offset", 0.1f); - - shaders["Toon"] = new Shader("base_light.vert", "toon.frag"); - //Removing useless specular component - shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG; - shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; - - shaders["Skybox"] = new Shader("skybox.vert", "skybox.frag"); - shaders["Skybox"]->uniformFlags = MVP_FLAG | MODEL_MATRIX_FLAG | SKYBOX_TEX_FLAG; - shaders["Skybox"]->addUniform("RefractionIndex", glm::vec3(0.65, 0.67, 0.69)); - - shaders["DSGeometryPass"] = new Shader("DSGeometryPass.vert", "DSGeometryPass.frag"); - shaders["DSGeometryPass"]->uniformFlags = MVP_FLAG; - - shaders["DSLightPass"] = new Shader("DSLightPass.vert", "DSLightPass.frag"); - shaders["DSLightPass"]->uniformFlags = LIGHTS_FLAG; - - shaders["GBufferVisual"] = new Shader("GBufferVisual.vert", "GBufferVisual.frag"); - shaders["GBufferVisual"]->uniformFlags = 0; -} - void MyGlWindow::lightSetup() { - //Showcase lights _scnctx.lights.emplace("Spotlight1", Light(glm::vec3(0.8f), glm::vec4(10, 10, 10, 1))); - // 24, 12, 2, glm::vec4(0, 1, 0, 1))); - - //Party lights - //_scnctx.lights.emplace("Light1", Light(glm::vec3(0.0f, 0.5f, 0.5f), glm::vec4(10, 10, 0, 1))); - //_scnctx.lights.emplace("Light2", Light(glm::vec3(0.0f, 0.0f, 0.5f), glm::vec4(3.09, 10, 9.51, 1))); - //_scnctx.lights.emplace("Light3", Light(glm::vec3(0.5f, 0.0f, 0.0f), glm::vec4(-8.09, 10, 5.87, 1))); - //_scnctx.lights.emplace("Light4", Light(glm::vec3(0.0f, 0.5f, 0.0f), glm::vec4(-8.09, 10, -5.87, 1))); - //_scnctx.lights.emplace("Light5", Light(glm::vec3(0.5f, 0.5f, 0.5f), glm::vec4(3.09, 10, -9.51, 1))); } void MyGlWindow::multipassSetup() @@ -151,17 +97,7 @@ void MyGlWindow::multipassSetup() _multipassManager.bindToFrameBuffer(GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, "normal_buffer"); _multipassManager.bindToFrameBuffer(GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, "color_buffer"); - _multipassManager.setDrawBuffers(); - - - //Standard post-process shader - /*_multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "depthing"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "blurring"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "sharpening"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "sepia"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "grayscale"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "sobel_filter"); - _multipassManager.shader->addSubroutine(GL_FRAGMENT_SHADER, "absolutely_no_postprocess");*/ + _multipassManager.setDrawBuffers(); } void MyGlWindow::setup() @@ -173,7 +109,6 @@ void MyGlWindow::setup() _scnctx.bg = glm::vec4(0.7, 0.7, 0.9, 1); textureSetup(); - shaderSetup(); lightSetup(); multipassSetup(); @@ -205,22 +140,23 @@ void MyGlWindow::setup() std::srand(18); int zob = std::rand(); - for (int i = 0; i < 30; i++) + for (int i = 0; i < 1; i++) { std::string cube_name = "Cube" + std::to_string(i); - meshes.emplace(cube_name, new Mesh("cube/cube.obj", shaders["DSGeometryPass"])); - meshes[cube_name]->textures["cube_tex"] = Texture("./Models/cube/color_map.png"); + meshes.emplace(cube_name, new Mesh(moddata, "DSGeometryPass.vert", "DSGeometryPass.frag")); + + /*meshes[cube_name]->textures["cube_tex"] = Texture("./Models/cube/color_map.png"); - //float pos_x = std::rand() % 100 + 50; - //float pos_z = std::rand() % 100 + 50; + float pos_x = std::rand() % 100 + 50; + float pos_z = std::rand() % 100 + 50; - //meshes[cube_name]->addStartTranslation(glm::vec4(0, 1, 0, 0)); - //meshes[cube_name]->addStartTranslation(glm::vec4(pos_x, 0, 0, 0)); - //meshes[cube_name]->addStartTranslation(glm::vec4(0, 0, pos_z, 0)); - //meshes[cube_name]->addStartRotation(glm::vec4(1, 0, 0, std::rand() % 360)); - //meshes[cube_name]->addStartRotation(glm::vec4(0, 1, 0, std::rand() % 360)); - //meshes[cube_name]->addStartRotation(glm::vec4(0, 0, 1, std::rand() % 360)); - // + meshes[cube_name]->addStartTranslation(glm::vec4(0, 1, 0, 0)); + meshes[cube_name]->addStartTranslation(glm::vec4(pos_x, 0, 0, 0)); + meshes[cube_name]->addStartTranslation(glm::vec4(0, 0, pos_z, 0)); + meshes[cube_name]->addStartRotation(glm::vec4(1, 0, 0, std::rand() % 360)); + meshes[cube_name]->addStartRotation(glm::vec4(0, 1, 0, std::rand() % 360)); + meshes[cube_name]->addStartRotation(glm::vec4(0, 0, 1, std::rand() % 360));*/ + //float light_r = (40 + std::rand() % 60) / 100.f; //float light_g = (40 + std::rand() % 60) / 100.f; //float light_b = (40 + std::rand() % 60) / 100.f; @@ -248,11 +184,12 @@ void MyGlWindow::draw() glViewport(0, 0, _scnctx.width, _scnctx.height); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - _multipassManager.enableFrameBufferTexture("position_buffer"); + //_multipassManager.enableFrameBufferTexture("position_buffer"); for (auto it = meshes.begin(); it != meshes.end(); it++) (*it).second->draw(_scnctx); - _multipassManager.drawResultToScreen(_scnctx); + + //_multipassManager.drawResultToScreen(_scnctx); } void MyGlWindow::resize(int w, int h) diff --git a/BaseGLProject/MyGLWindow.h b/BaseGLProject/MyGLWindow.h index 25bdf3e..110e0f0 100644 --- a/BaseGLProject/MyGLWindow.h +++ b/BaseGLProject/MyGLWindow.h @@ -4,7 +4,6 @@ #include "GL/glew.h" #include #include -#include "Skybox.h" #include "Shader.h" #include "ModelView.h" #include "Viewer.h" @@ -41,8 +40,7 @@ private: float _bgColor[3]; Multipass _multipassManager; - - Skybox skybox; + GLuint _vaoHandle; GLuint _iboHandle; diff --git a/BaseGLProject/Shader.cpp b/BaseGLProject/Shader.cpp index 1b127b6..5ffbd21 100644 --- a/BaseGLProject/Shader.cpp +++ b/BaseGLProject/Shader.cpp @@ -19,75 +19,3 @@ void Shader::disable() _program.disable(); } -int Shader::addSubroutine(GLenum shadertype, const std::string uniformName) -{ - return _program.addSubroutine(shadertype, uniformName); -} - -void Shader::enableSubroutine(const std::string uniformName) -{ - return _program.enableSubroutine(uniformName); -} - -void Shader::setMaterial(SceneContext ctx) -{ - if ((uniformFlags & ShaderFlags::KA_FLAG) == ShaderFlags::KA_FLAG) - glUniform3fv(_program.addUniform("Ka"), 1, glm::value_ptr(mat.ka)); - if ((uniformFlags & ShaderFlags::KD_FLAG) == ShaderFlags::KD_FLAG) - glUniform3fv(_program.addUniform("Kd"), 1, glm::value_ptr(mat.kd)); - if ((uniformFlags & ShaderFlags::KS_FLAG) == ShaderFlags::KS_FLAG) - glUniform3fv(_program.addUniform("Ks"), 1, glm::value_ptr(mat.ks)); - if ((uniformFlags & ShaderFlags::SHINE_FLAG) == ShaderFlags::SHINE_FLAG) - glUniform1f(_program.addUniform("Shininess"), mat.shininess); -} - -void Shader::setCamera(SceneContext ctx) -{ - if ((uniformFlags & ShaderFlags::MVP_FLAG) == ShaderFlags::MVP_FLAG) - glUniformMatrix4fv(_program.addUniform("mvp"), 1, GL_FALSE, glm::value_ptr(ctx.mvpMatrix)); - if ((uniformFlags & ShaderFlags::NORMAL_MAT_FLAG) == ShaderFlags::NORMAL_MAT_FLAG) - glUniformMatrix3fv(_program.addUniform("NormalMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.normalMatrix)); - if ((uniformFlags & ShaderFlags::MODELVIEW_FLAG) == ShaderFlags::MODELVIEW_FLAG) - glUniformMatrix4fv(_program.addUniform("ModelViewMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelViewMatrix)); - if ((uniformFlags & ShaderFlags::MODEL_MATRIX_FLAG) == ShaderFlags::MODEL_MATRIX_FLAG) - glUniformMatrix4fv(_program.addUniform("ModelMatrix"), 1, GL_FALSE, glm::value_ptr(ctx.modelMatrix)); -} - -void Shader::setLights(SceneContext ctx) -{ - int i = 0; - if ((uniformFlags & ShaderFlags::LIGHTS_FLAG) != ShaderFlags::LIGHTS_FLAG) - return; - for (auto light: ctx.lights) - { - if (light.second.activated && light.second.type == light_type) - { - std::string lightname = "Light[" + std::to_string(i) + "]."; - - glUniform4fv(_program.addUniform(lightname + "Position"), 1, glm::value_ptr(ctx.viewMatrix * light.second.location)); - glUniform3fv(_program.addUniform(lightname + "Intensity"), 1, glm::value_ptr(light.second.intensity)); - if (light.second.type == Light::LightType::SPOT) - { - glUniform1f(_program.addUniform(lightname + "SpotCutoff"), light.second.spot_cutoff); - glUniform1f(_program.addUniform(lightname + "SpotInnerCutoff"), light.second.spot_inner_cutoff); - glUniform1f(_program.addUniform(lightname + "SpotExponent"), light.second.spot_exponent); - glUniform3fv(_program.addUniform(lightname + "SpotDirection"), 1, glm::value_ptr(light.second.direction)); - } - i++; - } - } - glUniform1i(_program.addUniform("LightCount"), i); -} - -void Shader::setUniforms(SceneContext ctx) -{ - setCamera(ctx); - setLights(ctx); - setMaterial(ctx); - - if ((uniformFlags & ShaderFlags::SKYBOX_TEX_FLAG) == ShaderFlags::SKYBOX_TEX_FLAG) - { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_CUBE_MAP, ctx.skybox_tex); - } -} diff --git a/BaseGLProject/Shader.h b/BaseGLProject/Shader.h index e6c455a..1708cb5 100644 --- a/BaseGLProject/Shader.h +++ b/BaseGLProject/Shader.h @@ -11,38 +11,18 @@ #include "Loader.h" #include "Texture.h" -enum ShaderFlags -{ - NO_UNIFORM = 0, - KD_FLAG = 1, - KA_FLAG = 2, - KS_FLAG = 4, - SHINE_FLAG = 8, - MVP_FLAG = 16, - NORMAL_MAT_FLAG = 32, - MODELVIEW_FLAG = 64, - LIGHTS_FLAG = 128, - MODEL_MATRIX_FLAG = 256, - SKYBOX_TEX_FLAG = 512, -}; - class Shader { public: Shader() {}; Shader(const std::string vtx_name, const std::string frag_name); ~Shader(); - - int uniformFlags = KD_FLAG | KA_FLAG | KS_FLAG | SHINE_FLAG | MVP_FLAG | NORMAL_MAT_FLAG | MODELVIEW_FLAG | LIGHTS_FLAG; - Light::LightType light_type = Light::LightType::BASE; + Material mat; void enable(); void disable(); - int addSubroutine(GLenum shadertype, const std::string uniformName); - void enableSubroutine(const std::string uniformName); - public: void setUniforms(SceneContext ctx); @@ -62,25 +42,15 @@ public: _program.use(); glUniform1fv(_program.addUniform(name), 1, &data); } + void addUniform(const std::string name, glm::mat3x3 &data) + { + _program.use(); glUniformMatrix3fv(_program.addUniform(name), 1, GL_FALSE, glm::value_ptr(data)); + } + void addUniform(const std::string name, glm::mat4x4 &data) { _program.use(); glUniformMatrix4fv(_program.addUniform(name), 1, GL_FALSE, glm::value_ptr(data)); - } - - void applyTextureMaterial(Texture &tex) - { - if (mat.enabled) - { - addUniform("Ka", tex.mat.ka); - addUniform("Kd", tex.mat.kd); - addUniform("Ks", tex.mat.ks); - } - } - -private: - void setMaterial(SceneContext ctx); - void setCamera(SceneContext ctx); - void setLights(SceneContext ctx); + } ShaderProgram _program; }; \ No newline at end of file diff --git a/BaseGLProject/Skybox.cpp b/BaseGLProject/Skybox.cpp deleted file mode 100644 index 0928a74..0000000 --- a/BaseGLProject/Skybox.cpp +++ /dev/null @@ -1,141 +0,0 @@ -#include "Skybox.h" -#include "imgui/stb_image.h" - -Skybox::Skybox() -{ - float side = 50.0f; //size of cube - float side2 = side / 2.0f; - float v[24 * 3] = { - // Front - -side2, -side2, side2, - side2, -side2, side2, - side2, side2, side2, - -side2, side2, side2, - // Right - side2, -side2, side2, - side2, -side2, -side2, - side2, side2, -side2, - side2, side2, side2, - // Back - -side2, -side2, -side2, - -side2, side2, -side2, - side2, side2, -side2, - side2, -side2, -side2, - // Left - -side2, -side2, side2, //12 - -side2, side2, side2, //13 - -side2, side2, -side2, //14 - -side2, -side2, -side2, //15 - // Bottom - -side2, -side2, side2, - -side2, -side2, -side2, - side2, -side2, -side2, - side2, -side2, side2, - // Top - -side2, side2, side2, - side2, side2, side2, - side2, side2, -side2, - -side2, side2, -side2 - }; - - GLuint el[] = { - 0,2,1, 0,3,2, 4,6,5, 4,7,6, - 8,10,9, 8,11,10, 12,14,13, 12,15,14, - 16,18,17, 16,19,18, 20,22,21, 20,23,22 - }; - - glGenVertexArrays(1, &vao); - glBindVertexArray(vao); - - glGenBuffers(1, &vector_vbo); - glBindBuffer(GL_ARRAY_BUFFER, vector_vbo); - glBufferData(GL_ARRAY_BUFFER, 24 * 3 * sizeof(GLfloat), v, GL_STATIC_DRAW); - - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL); - glEnableVertexAttribArray(0); - - glGenBuffers(1, &ibo); - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36 * sizeof(GLuint), el, GL_STATIC_DRAW); - - glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 0, NULL); - glEnableVertexAttribArray(4); - -} - -void Skybox::initialize(std::string skybox_dir, Shader *sky) -{ - glActiveTexture(GL_TEXTURE0); - glGenTextures(1, &texID); //set the texID as a member variable - glBindTexture(GL_TEXTURE_CUBE_MAP, texID); - - - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); - - const char * suffixes[] = { "left", "right", "top", "down", "back", "front"}; - - GLuint targets[] = { - GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X, - GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, - GL_TEXTURE_CUBE_MAP_POSITIVE_Z, GL_TEXTURE_CUBE_MAP_NEGATIVE_Z - }; - - for (int i = 0; i < 6; i++) { - int channel, width, height; - unsigned char *image; - std::string filename; - filename = std::string(skybox_dir + suffixes[i]) + std::string(".JPG"); - image = stbi_load(filename.c_str(), &width, &height, &channel, 0); - glTexImage2D(targets[i], 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, image); - glGenerateMipmap(GL_TEXTURE_2D); - stbi_image_free(image); - } - - glBindTexture(GL_TEXTURE_CUBE_MAP, 0); - sky->enable(); - sky->addUniform("DrawSkyBox", (int)GL_FALSE); - sky->addUniform("CubeMapTex", (int)0); - sky->disable(); -} - -Skybox::~Skybox() -{ - glDeleteBuffers(1, &vector_vbo); - glDeleteBuffers(1, &ibo); - glDeleteVertexArrays(1, &vao); -} - - -// //Things to add -// //Per model : -// // - ModelMatrix -// // - MaterialColor - -void Skybox::draw(Shader *sky_shader, SceneContext &ctx) -{ - sky_shader->enable(); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - glm::mat4x4 modelMatrix = glm::scale(glm::mat4(1.0f), glm::vec3(scale)); - glm::mat4x4 mvpMatrix = ctx.projectionMatrix * ctx.viewMatrix * modelMatrix; - sky_shader->addUniform("mvp", mvpMatrix); - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_CUBE_MAP, texID); - glBindVertexArray(vao); - sky_shader->addUniform("DrawSkyBox", (int)GL_TRUE); - - - int size; - glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size); - glDrawElements(GL_TRIANGLES, size / sizeof(GLuint), GL_UNSIGNED_INT, 0); - - sky_shader->addUniform("DrawSkyBox", (int)GL_FALSE); - glBindVertexArray(0); - glBindTexture(GL_TEXTURE_CUBE_MAP, 0); - glDisable(GL_CULL_FACE); - sky_shader->disable(); -} diff --git a/BaseGLProject/Skybox.h b/BaseGLProject/Skybox.h deleted file mode 100644 index 6f9b350..0000000 --- a/BaseGLProject/Skybox.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include "Shader.h" -#include "SceneContext.h" - -class Skybox -{ -private: - unsigned int vao; - unsigned int vector_vbo; - unsigned int ibo; - GLuint texID; -public: - Skybox(); - float scale = 1; - void initialize(std::string skybox_dir, Shader *sky); - GLuint getTexID() { return texID; } - ~Skybox(); - void draw(Shader *sky_shader, SceneContext &ctx); -}; -