diff --git a/shaders/lighting/Frag.glsl b/shaders/lighting/Frag.glsl index c116c83..a3d7ace 100644 --- a/shaders/lighting/Frag.glsl +++ b/shaders/lighting/Frag.glsl @@ -1,4 +1,11 @@ #version 330 core +struct Material { + vec3 ambient; + vec3 diffuse; + vec3 specular; + float shininess; +}; + out vec4 FragColor; in vec3 FragPos; @@ -8,30 +15,28 @@ uniform vec3 ourColor; uniform vec3 lightColor; uniform vec3 lightPos; uniform vec3 viewPos; +uniform Material material; void main() { - float ambientStrength = 0.15; - float specularStrength = 0.5; - - //msc + //misc vec3 norm = normalize(Normal); vec3 lightDir = normalize(lightPos - FragPos); // ambient - vec3 ambient = ambientStrength * lightColor; + vec3 ambient = vec3(0.2) * (lightColor * material.ambient); // diffuse float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = diff * lightColor; + vec3 diffuse = lightColor * (diff * material.diffuse); // specular vec3 viewDir = normalize(viewPos - FragPos); vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), 150); - vec3 specular = specularStrength * spec * lightColor; + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + vec3 specular = vec3(0.5) * (lightColor * (spec * material.specular)); - // out - vec3 result = (ambient + diffuse+specular) * ourColor; + //out + vec3 result = ambient + diffuse + specular; FragColor = vec4(result, 1.0); } diff --git a/src/main.cpp b/src/main.cpp index 2960d54..454c0a4 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,8 +12,7 @@ void processInput(GLFWwindow *window); void framebuffer_size_callback(GLFWwindow *window, int width, int height); - -int main(void) { +GLFWwindow *init() { glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); @@ -29,7 +28,10 @@ int main(void) { glViewport(0, 0, 800, 600); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + return window; +} +unsigned int meshInit() { unsigned int VBO, VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); @@ -43,30 +45,32 @@ int main(void) { (void *)(3 * sizeof(float))); glEnableVertexAttribArray(0); glEnableVertexAttribArray(1); + return VAO; +} + +int main(void) { + glm::vec3 lightPos = glm::vec3(1, 2.0f, 1); + glm::vec3 cameraPos = glm::vec3(2.3, 3, 5); + glm::vec3 lightColor = glm::vec3(1); + + GLFWwindow *window = init(); + Camera *cam = new Camera(cameraPos, -115.0f, -25.0f, 45, 800.0 / 600); + glfwSetWindowUserPointer(window, cam); Shader *cubeShader = new Shader("./shaders/lighting/Vert.glsl", "./shaders/lighting/Frag.glsl"); - Mesh *cube = new Mesh(cubeShader, VAO, 36); - cube->setOwnedShader(true); - Shader *lightShader = new Shader("./shaders/lighting/Vert.glsl", "./shaders/lighting/LightFrag.glsl"); + + uint VAO = meshInit(); + Mesh *cube = new Mesh(cubeShader, VAO, 36); Mesh *light = new Mesh(lightShader, VAO, 36); + cube->setOwnedShader(true); light->setOwnedShader(true); - glm::vec3 lightPos = glm::vec3(1, 2.0f, 1); light->setPosition(lightPos); light->setScale(glm::vec3(.3)); - Camera *cam = - new Camera(glm::vec3(0.0, 0.0, 5.0), -90.0f, 0.0f, 45.0, 800.0 / 600); - glfwSetWindowUserPointer(window, cam); - - glm::vec3 cPos = glm::vec3(2.3, 3, 5); - cam->setPos(cPos); - cam->setRotate(-90.0f - 25.0f, -25.0f); - - glm::vec3 lightc = glm::vec3(1); glEnable(GL_DEPTH_TEST); while (!glfwWindowShouldClose(window)) { glClearColor(0.2f, 0.3f, 0.3f, 1.0f); @@ -74,15 +78,22 @@ int main(void) { Shader *s = cube->getShader(); s->use(); - s->setVec3("lightColor", lightc); - s->setVec3("ourColor", glm::vec3(1.0f, 0.5f, 0.31f)); + s->setVec3("lightColor", lightColor); + s->setVec3("ourColor", glm::vec3(0.24725, 0.1995, 0.0745)); s->setVec3("lightPos", lightPos); s->setVec3("viewPos", glm::vec3(0.0, 0.0, 5.0)); + + /*mat taken from*/ + /*http://devernay.free.fr/cours/opengl/materials.html*/ + s->setVec3("material.ambient", glm::vec3(0.24725, 0.1995, 0.0745)); + s->setVec3("material.diffuse", glm::vec3(0.75164, 0.60648, 0.22648)); + s->setVec3("material.specular", glm::vec3(0.628281, 0.555802, 0.366065)); + s->setFloat("material.shininess", 0.4 * 128); cube->draw(cam); s = light->getShader(); s->use(); - s->setVec3("ourColor", lightc); + s->setVec3("ourColor", lightColor); light->draw(cam); glfwSwapBuffers(window);