diff --git a/assets/shaders/lighting_blinn-phong.frag b/assets/shaders/lighting_blinn-phong.frag deleted file mode 100644 index 66f4c45..0000000 --- a/assets/shaders/lighting_blinn-phong.frag +++ /dev/null @@ -1,39 +0,0 @@ -//----------------------------------------------------------------------------- -// Fragment shader for Blinn-Phong lighting -//----------------------------------------------------------------------------- -#version 330 core - -in vec2 TexCoord; -in vec3 FragPos; -in vec3 Normal; - -uniform sampler2D texture_map; -uniform vec3 lightPos; // for diffuse -uniform vec3 lightColor; // for diffuse -uniform vec3 viewPos; // for specular - -out vec4 frag_color; - -void main() -{ - // Ambient --------------------------------------------------------- - float ambientFactor = 0.1f; - vec3 ambient = lightColor * ambientFactor; - - // Diffuse ------------------------------------ - vec3 normal = normalize(Normal); - vec3 lightDir = normalize(lightPos - FragPos); - float NDotL = max(dot(normal, lightDir), 0.0); - vec3 diffuse = lightColor * NDotL; - - // Specular (Blinn-Phong)------------------------------------------- - float specularFactor = 0.8f; - float shininess = 32.0f; - vec3 viewDir = normalize(viewPos - FragPos); - vec3 halfDir = normalize(lightDir + viewDir); - float NDotH = max(dot(normal, halfDir), 0.0); - vec3 specular = lightColor * specularFactor * pow(NDotH, shininess); - - vec4 texel = texture(texture_map, TexCoord); - frag_color = vec4(ambient + diffuse + specular, 1.0f) * texel; -} diff --git a/assets/shaders/lighting_blinn-phong.vert b/assets/shaders/lighting_blinn-phong.vert deleted file mode 100644 index e5cf278..0000000 --- a/assets/shaders/lighting_blinn-phong.vert +++ /dev/null @@ -1,26 +0,0 @@ -//----------------------------------------------------------------------------- -// Vertex shader for phong lighting -//----------------------------------------------------------------------------- -#version 330 core - -layout (location = 0) in vec3 pos; -layout (location = 1) in vec3 normal; -layout (location = 2) in vec2 texCoord; - -uniform mat4 model; // model matrix -uniform mat4 view; // view matrix -uniform mat4 projection; // projection matrix - -out vec3 FragPos; -out vec3 Normal; -out vec2 TexCoord; - -void main() -{ - FragPos = vec3(model * vec4(pos, 1.0f)); // vertex position in world space - Normal = normal; - - TexCoord = texCoord; - - gl_Position = projection * view * model * vec4(pos, 1.0f); -} diff --git a/include/engine.h b/include/engine.h index 820aea3..32eeeda 100644 --- a/include/engine.h +++ b/include/engine.h @@ -46,7 +46,7 @@ namespace djalim { double previousSeconds = 0.0; double elapsedSeconds; int frameCount = 0; - ShaderProgram shaderProgram; + std::map shaderPrograms; FPSCamera Camera = FPSCamera(glm::vec3(0.0f, 2.0f, 10.0f)); Objects3D objects; diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 9425807..f1dcc0d 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -44,9 +44,15 @@ djalim::OpenGlEngine::OpenGlEngine(const char* title, int width, int height) { loadCallbacks(); - bool loaded = shaderProgram.loadShaders("../assets/shaders/vertex.glsl", "../assets/shaders/fragment.glsl"); + bool loaded = shaderPrograms["default"].loadShaders("assets/shaders/vertex.glsl", "assets/shaders/fragment.glsl"); if (!loaded) { - std::cerr << "Failed to load shaders correctly" << std::endl; + std::cerr << "Failed to load default shaders correctly" << std::endl; + exit(1); + } + + loaded = shaderPrograms["phong"].loadShaders("assets/shaders/lighting_blinn-phong.vert", "assets/shaders/lighting_blinn-phong.frag"); + if (!loaded) { + std::cerr << "Failed to load phong shaders correctly" << std::endl; exit(1); } @@ -92,11 +98,14 @@ void djalim::OpenGlEngine::createObject(std::string name, std::string textures, glBufferData(GL_ARRAY_BUFFER, sizeof(float)*(objects[name])->meshVertices.size(), (objects[name])->meshVertices.data(), GL_STATIC_DRAW); // Attribut de position - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); - // Attribut de coordonnée de texture - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + // Attribut de normale + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); + // Attribut de coordonnée de texture + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); + glEnableVertexAttribArray(2); } djalim::OpenGlEngine::~OpenGlEngine() { @@ -138,7 +147,7 @@ void djalim::OpenGlEngine::draw(djalim::Mesh3D* object){ model = glm::translate(model, object->position); model = glm::scale(model, object->scale); - shaderProgram.setUniform("model", model); + shaderPrograms["phong"].setUniform("model", model); glBindVertexArray(object->VAO); glDrawArrays(GL_TRIANGLES, 0, object->numFaces * 3); diff --git a/src/onCreate.cpp b/src/onCreate.cpp index 6d6ab79..0453ae7 100644 --- a/src/onCreate.cpp +++ b/src/onCreate.cpp @@ -7,15 +7,15 @@ void djalim::OpenGlEngine::onCreate(){ stbi_set_flip_vertically_on_load(true); createObject("mimikyu", - "../assets/textures/crate.jpg", - "../assets/models/destiny island.obj", + "assets/textures/crate.jpg", + "assets/models/destiny island.obj", glm::vec3(0.0,0.0,0.0), glm::vec3(0.0,0.0,0.0), glm::vec3(.1,.1,.1) ); createObject("cube", - "../assets/textures/crate.jpg", - "../assets/models/crate.obj", + "assets/textures/crate.jpg", + "assets/models/crate.obj", glm::vec3(1.0,1.0,1.0), glm::vec3(0.0,1.0,0.0), glm::vec3(1.0,1.0,1.0) diff --git a/src/onUpdate.cpp b/src/onUpdate.cpp index cb3c0e7..f41385a 100644 --- a/src/onUpdate.cpp +++ b/src/onUpdate.cpp @@ -6,8 +6,8 @@ void djalim::OpenGlEngine::onUpdate(){ showFps(); - shaderProgram.use(); - shaderProgram.setUniform("ourTexture", 0); + shaderPrograms["phong"].use(); + shaderPrograms["phong"].setUniform("ourTexture", 0); glm::mat4 model(1.0), view(1.0), projection(1.0); @@ -18,8 +18,11 @@ void djalim::OpenGlEngine::onUpdate(){ projection = glm::perspective(glm::radians(Camera.getFOV()), (float)windowWidth / (float)windowHeight, 0.1f, 200.0f); // Matrice de Projection - shaderProgram.setUniform("projection", projection); - shaderProgram.setUniform("view", view); + shaderPrograms["phong"].setUniform("projection", projection); + shaderPrograms["phong"].setUniform("view", view); + shaderPrograms["phong"].setUniform("viewPos", Camera.getPosition()); + shaderPrograms["phong"].setUniform("lightPos", glm::vec3(0.0f, 10.0f, 0.0f)); + shaderPrograms["phong"].setUniform("lightColor", glm::vec3(1.0f, 1.0f, 1.0f)); draw((objects["cube"]).get()); draw((objects["mimikyu"]).get());