diff --git a/BaseGLProject/BaseGLProject.vcxproj b/BaseGLProject/BaseGLProject.vcxproj index 5ec469f..4217fc4 100644 --- a/BaseGLProject/BaseGLProject.vcxproj +++ b/BaseGLProject/BaseGLProject.vcxproj @@ -184,6 +184,8 @@ + + Geometry @@ -197,6 +199,8 @@ Document + + diff --git a/BaseGLProject/BaseGLProject.vcxproj.filters b/BaseGLProject/BaseGLProject.vcxproj.filters index 3e579bb..d2878f8 100644 --- a/BaseGLProject/BaseGLProject.vcxproj.filters +++ b/BaseGLProject/BaseGLProject.vcxproj.filters @@ -148,5 +148,17 @@ Shaders + + Shaders + + + Shaders + + + Shaders + + + Shaders + \ No newline at end of file diff --git a/BaseGLProject/Dataset.h b/BaseGLProject/Dataset.h index 3e0754e..8e2fc81 100644 --- a/BaseGLProject/Dataset.h +++ b/BaseGLProject/Dataset.h @@ -5,4 +5,9 @@ class Dataset public: Dataset(); ~Dataset(); + + unsigned int nFaces; + unsigned int nVertices; + std::vector vertices; + std::vector normals; }; \ No newline at end of file diff --git a/BaseGLProject/Models/Mesh.cpp b/BaseGLProject/Models/Mesh.cpp index 3a8cc2f..05b546e 100644 --- a/BaseGLProject/Models/Mesh.cpp +++ b/BaseGLProject/Models/Mesh.cpp @@ -18,6 +18,54 @@ * Constructor, loading the specified aiMesh **/ +Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m) +{ + parent = m; + + vbo[VERTEX_BUFFER] = NULL; + vbo[TEXCOORD_BUFFER] = NULL; + vbo[NORMAL_BUFFER] = NULL; + vbo[INDEX_BUFFER] = NULL; + + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + elementCount = set.nFaces * 3; + + float *vertices = new float[set.nVertices * 3]; + for (unsigned int i = 0; i < set.nVertices; ++i) { + vertices[i * 3] = set.vertices[i].x; + vertices[i * 3 + 1] = set.vertices[i].y; + vertices[i * 3 + 2] = set.vertices[i].z; + } + + glGenBuffers(1, &vbo[VERTEX_BUFFER]); + glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]); + glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(0); + + delete[] vertices; + + float *normals = new float[set.nVertices * 3]; + for (unsigned int i = 0; i < set.nVertices; ++i) { + normals[i * 3] = set.normals[i].x; + normals[i * 3 + 1] = set.normals[i].y; + normals[i * 3 + 2] = set.normals[i].z; + } + + glGenBuffers(1, &vbo[NORMAL_BUFFER]); + glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]); + glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW); + + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL); + glEnableVertexAttribArray(1); + + delete[] normals; + +} + Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m) { parent = m; @@ -186,6 +234,13 @@ Mesh::Mesh(const char *filename, Shader *sh) } +Mesh::Mesh(Dataset &set, Shader *sh) +{ + shader = sh; + + meshEntries.push_back(new Mesh::MeshEntry(set, this)); +} + /** * Clears all loaded MeshEntries **/ @@ -198,9 +253,21 @@ Mesh::~Mesh(void) meshEntries.clear(); } +void Mesh::enableCulling() +{ + glEnable(GL_CULL_FACE); + glCullFace(cullMode); +} + +void Mesh::disableCulling() +{ + glDisable(GL_CULL_FACE); +} + void Mesh::draw(SceneContext ctx) { - shader->enable(); + shader->enable(); + enableCulling(); for (unsigned int i = 0; i < meshEntries.size(); ++i) { MeshEntry * m = meshEntries[i]; @@ -248,7 +315,8 @@ void Mesh::draw(SceneContext ctx) { meshEntries.at(i)->render(); model.glPopMatrix(); - } + } + disableCulling(); shader->disable(); } diff --git a/BaseGLProject/Models/Mesh.h b/BaseGLProject/Models/Mesh.h index 750b7bf..f289150 100644 --- a/BaseGLProject/Models/Mesh.h +++ b/BaseGLProject/Models/Mesh.h @@ -20,6 +20,14 @@ enum Transformation Scaling }; +enum CullFace +{ + NONE = GL_NONE, + FRONT = GL_FRONT, + BACK = GL_BACK, + FRONT_BACK = GL_FRONT_AND_BACK +}; + class Mesh { public: @@ -36,6 +44,7 @@ public: aiColor3D scolor; float shininessStrength; MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m); + MeshEntry(Dataset &set, Mesh *m); ~MeshEntry(); Mesh * parent; void render(); @@ -49,8 +58,12 @@ public: private: std::vector> _transformations; + + void enableCulling(); + void disableCulling(); public: Model model; + CullFace cullMode = NONE; void effectTransformations(); void addRotation(glm::vec4 vec); void addTranslation(glm::vec4 vec); diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp index 7490564..c2cd4a7 100644 --- a/BaseGLProject/MyGLWindow.cpp +++ b/BaseGLProject/MyGLWindow.cpp @@ -56,27 +56,34 @@ void MyGlWindow::setBgColor(float bgColor[3]) } void MyGlWindow::setup() -{ +{ _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))); - //shaders["ToonShader"] = Shader("light.vert", "toon.frag"); - //// Removing useless specular component - //shaders["ToonShader"].uniformFlags &= ~ShaderFlags::KS_FLAG; - //shaders["ToonShader"].uniformFlags &= ~ShaderFlags::SHINE_FLAG; + shaders["StandardLight"] = new Shader("light.vert", "light.frag"); + //shaders["FogShader"] = new Shader("fog.vert", "fog.frag"); - //meshes.emplace_back("teapot.obj", &shaders["ToonShader"]); + //shaders["SilhouetteShader"] = new Shader("silhouette.vert", "silhouette.frag"); + //shaders["SilhouetteShader"]->uniformFlags = ShaderFlags::MVP_FLAG; + //shaders["SilhouetteShader"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255)); + //shaders["SilhouetteShader"]->addUniform("sil_offset", 0.1f); + // - ToonShader = new Shader("light.vert", "toon.frag"); - ToonShader->uniformFlags &= ~ShaderFlags::KS_FLAG; - ToonShader->uniformFlags &= ~ShaderFlags::SHINE_FLAG; + //shaders["ToonShader"] = new Shader("light.vert", "toon.frag"); + ////Removing useless specular component + //shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG; + //shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; + // + meshes.push_back(new Mesh("quad.obj", shaders["StandardLight"])); - meshes.emplace_back("teapot.obj", ToonShader); - + /*meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"])); + meshes.back()->cullMode = FRONT; + meshes.push_back(new Mesh("teapot.obj", shaders["ToonShader"])); + meshes.back()->cullMode = BACK;*/ } void MyGlWindow::draw() @@ -85,12 +92,7 @@ void MyGlWindow::draw() glViewport(0, 0, m_width, m_height); glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_BUFFER); - glEnable(GL_BLEND); - //glEnable(GL_CULL_FACE); - //glCullFace(GL_BACK); - glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - //setting the view data in the scene context glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z); glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z); @@ -99,10 +101,9 @@ void MyGlWindow::draw() glm::mat4 projection = perspective(45.0f, (float)m_width / (float)m_height, 0.1f, 500.0f); _scnctx.viewMatrix = view; - _scnctx.projectionMatrix = projection; - static int i = 0; - for (auto it = meshes.begin(); it != meshes.end(); ++it) - it->draw(_scnctx); + _scnctx.projectionMatrix = projection; + for (auto it = meshes.begin(); it != meshes.end(); it++) + (*it)->draw(_scnctx); } void MyGlWindow::resize(int w, int h) diff --git a/BaseGLProject/MyGLWindow.h b/BaseGLProject/MyGLWindow.h index 4149a47..0897ab4 100644 --- a/BaseGLProject/MyGLWindow.h +++ b/BaseGLProject/MyGLWindow.h @@ -24,14 +24,13 @@ public: void draw(); void setBgColor(float bgColor[3]); - std::map shaders; - std::vector meshes; + std::map shaders; + std::vector meshes; void resize(int w, int h); Viewer viewer; -private: - Shader *ToonShader; +private: SceneContext _scnctx; int m_width; int m_height; @@ -41,7 +40,5 @@ private: GLuint _vaoHandle; GLuint _iboHandle; - std::vector _drawables; - void setup(); }; diff --git a/BaseGLProject/Shader.h b/BaseGLProject/Shader.h index 4138366..ac3e92f 100644 --- a/BaseGLProject/Shader.h +++ b/BaseGLProject/Shader.h @@ -3,6 +3,7 @@ #include #include #include +#include #include "glm/gtc/type_ptr.hpp" #include "Material.h" @@ -39,6 +40,14 @@ public: public: void setUniforms(SceneContext ctx); + void addUniform(const std::string name, glm::vec3 data) + { + _program.use(); glUniform3fv(_program.addUniform(name), 1, glm::value_ptr(data)); ; _program.disable(); + } + void addUniform(const std::string name, float data) + { + _program.use(); glUniform1fv(_program.addUniform(name), 1, &data); _program.disable(); + } private: void setMaterial(SceneContext ctx); void setCamera(SceneContext ctx); diff --git a/BaseGLProject/fog.frag b/BaseGLProject/fog.frag new file mode 100644 index 0000000..597f2d7 --- /dev/null +++ b/BaseGLProject/fog.frag @@ -0,0 +1,53 @@ +#version 430 + +in vec3 f_color; +out vec4 FragColors; + +uniform vec3 Kd; +uniform vec3 Ka; +uniform vec3 Ks; +uniform float Shininess; + +uniform int LightCount; + +struct LightInfo { + vec4 Position; + vec3 Intensity; +}; + +uniform LightInfo Light[64]; + +in vec3 fNormal; +in vec3 pos; + +void main() +{ + + vec3 finalColor; + vec3 ambient; + + ambient = Ka * Light[0].Intensity; + for (int i=0; i< LightCount; i++) + { + vec3 L = normalize(Light[i].Position.xyz - pos); + vec3 N = fNormal; + vec3 V = normalize(-pos); + //vec3 R = normalize(reflect(-L, N)); + vec3 H = normalize(V + L); + + vec3 diffuse = Kd * Light[i].Intensity * max(dot(L, N), 0.0); + vec3 specular = Ks * Light[i].Intensity * pow(max(dot(H, N), 0.0), Shininess); + finalColor = finalColor + diffuse + specular; + } + + finalColor = finalColor + ambient; + + //fog calculus + float z = abs(pos.z); + float f = (30 - z) / (30 - 1); + vec3 fogColor = vec3(1, 1, 1); + f = clamp(f, 0.0, 1.0); + finalColor = mix(fogColor, finalColor, f); + + FragColors = vec4(finalColor, 1); +} diff --git a/BaseGLProject/fog.vert b/BaseGLProject/fog.vert new file mode 100644 index 0000000..32132ff --- /dev/null +++ b/BaseGLProject/fog.vert @@ -0,0 +1,21 @@ +#version 430 + +layout(location=0) in vec3 coord3d; +layout(location=1) in vec3 v_normal; +layout(location=2) in vec3 v_color; + +uniform mat4 mvp; +uniform mat3 NormalMatrix; +uniform mat4 ModelViewMatrix; + +out vec3 fNormal; +out vec3 pos; + +void main(void) +{ + + fNormal = normalize(NormalMatrix * v_normal); + pos = (ModelViewMatrix * vec4(coord3d, 1.0)).xyz; + + gl_Position = mvp * vec4(coord3d, 1.0f); +} diff --git a/BaseGLProject/light.frag b/BaseGLProject/light.frag index bc7e5bf..3a86e0e 100644 --- a/BaseGLProject/light.frag +++ b/BaseGLProject/light.frag @@ -13,7 +13,8 @@ struct LightInfo { vec3 Intensity; }; -uniform LightInfo Light[5]; +uniform LightInfo Light[64]; +uniform int LightCount; in vec3 fNormal; @@ -26,7 +27,7 @@ void main() vec3 ambient; ambient = Ka * Light[0].Intensity; - for (int i=0; i<5; i++) + for (int i=0; i