add: added lighting classes and a shader to use multiple lights
This commit is contained in:
parent
ee9e540b5b
commit
2610da8f8c
4 changed files with 359 additions and 64 deletions
120
main.cpp
120
main.cpp
|
@ -16,6 +16,7 @@
|
|||
#include <myEngine/camera.hpp>
|
||||
#include <myEngine/model.hpp>
|
||||
#include <myEngine/object.hpp>
|
||||
#include <myEngine/lighting.hpp>
|
||||
|
||||
void framebuffer_size_callback(GLFWwindow* window, int width, int height);
|
||||
void processInput(GLFWwindow *window);
|
||||
|
@ -85,10 +86,7 @@ int main()
|
|||
ImGui_ImplOpenGL3_Init("#version 330 core");
|
||||
|
||||
// Shaders
|
||||
Shader ourShader("resources/shaders/vert.glsl", "resources/shaders/frag.glsl");
|
||||
Shader directional_lightShader("resources/shaders/vert.glsl", "resources/shaders/directional_light.glsl");
|
||||
Shader point_lightShader("resources/shaders/vert.glsl", "resources/shaders/point_light.glsl");
|
||||
Shader spotlight_lightShader("resources/shaders/vert.glsl", "resources/shaders/spotlight_light.glsl");
|
||||
Shader light_shader("resources/shaders/vert.glsl", "resources/shaders/light_shader.glsl");
|
||||
Shader light_cubeShader("resources/shaders/vert.glsl", "resources/shaders/light_object.glsl");
|
||||
|
||||
// Models
|
||||
|
@ -101,6 +99,32 @@ int main()
|
|||
Object object3(croissant, glm::vec3(-1.0f, 0.0f, 0.0f), glm::vec3(0.1f, 0.1f, 0.1f), glm::vec3(0.0f, 0.0f, 0.0f));
|
||||
Object light_cube(cube, glm::vec3(1.2f, 1.0f, 2.0f), glm::vec3(0.05f, 0.05f, 0.05f), glm::vec3(0.0f, 0.0f, 0.0f));
|
||||
|
||||
// Lights
|
||||
DirectLight directLight(glm::vec3(-0.2f, -1.0f, -0.3f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
glm::vec3(0.2f, 0.2f, 0.2f),
|
||||
glm::vec3(0.5f, 0.5f, 0.5f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f));
|
||||
SpotLight spotLight(glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
12.55f, 17.5f,
|
||||
glm::vec3(1.0f, 1.0f, 1.0f), glm::vec3(0.2f, 0.2f, 0.2f),
|
||||
glm::vec3(0.5f, 0.5f, 0.5f), glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
1.0f, 0.09f,
|
||||
0.032f);
|
||||
std::vector<PointLight> pointLights;
|
||||
pointLights.emplace_back(glm::vec3(1.2f, 1.0f, 2.0f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
glm::vec3(0.2f, 0.2f, 0.2f),
|
||||
glm::vec3(0.5f, 0.5f, 0.5f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
1.0f, 0.09f, 0.032f);
|
||||
pointLights.emplace_back(glm::vec3(-1.2f, 1.0f, 2.0f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
glm::vec3(0.2f, 0.2f, 0.2f),
|
||||
glm::vec3(0.5f, 0.5f, 0.5f),
|
||||
glm::vec3(1.0f, 1.0f, 1.0f),
|
||||
1.0f, 0.09f, 0.032f);
|
||||
|
||||
static float positionX = 0.0f;
|
||||
static float positionY = 0.0f;
|
||||
static float positionZ = 0.0f;
|
||||
|
@ -111,9 +135,6 @@ int main()
|
|||
static float* light_color = new float[3]{1.0f, 1.0f, 1.0f};
|
||||
static float light_cutoff = 12.5f;
|
||||
static float light_outerCutoff = 17.5f;
|
||||
static float light_directionX = 0.0f;
|
||||
static float light_directionY = 0.0f;
|
||||
static float light_directionZ = -1.0f;
|
||||
|
||||
while(!glfwWindowShouldClose(window))
|
||||
{
|
||||
|
@ -139,7 +160,6 @@ int main()
|
|||
|
||||
ImGui::Begin("Settings");
|
||||
ImGui::Text("FPS: %.2f", 1.0f / deltaTime);
|
||||
ImGui::Text("Camera Direction: (%.2f, %.2f, %.2f)", camera.Front.x, camera.Front.y, camera.Front.z);
|
||||
ImGui::SliderFloat("Object 1 Position X", &positionX, -5.0f, 5.0f);
|
||||
ImGui::SliderFloat("Object 1 Position Y", &positionY, -5.0f, 5.0f);
|
||||
ImGui::SliderFloat("Object 1 Position Z", &positionZ, -5.0f, 5.0f);
|
||||
|
@ -149,79 +169,53 @@ int main()
|
|||
ImGui::ColorEdit3("Light Cube Color", light_color);
|
||||
ImGui::SliderFloat("Light Cutoff", &light_cutoff, 0.0f, 90.0f);
|
||||
ImGui::SliderFloat("Light Outer Cutoff", &light_outerCutoff, 0.0f, 90.0f);
|
||||
ImGui::SliderFloat("Light Direction X", &light_directionX, -1.0f, 1.0f);
|
||||
ImGui::SliderFloat("Light Direction Y", &light_directionY, -1.0f, 1.0f);
|
||||
ImGui::SliderFloat("Light Direction Z", &light_directionZ, -1.0f, 1.0f);
|
||||
ImGui::End();
|
||||
|
||||
glm::mat4 view = camera.GetViewMatrix();
|
||||
glm::mat4 projection = glm::perspective(glm::radians(45.0f), float(width) / float(height), 0.1f, 100.0f);
|
||||
|
||||
// Bacis lighting
|
||||
ourShader.setVec3("viewPos", camera.Position);
|
||||
ourShader.setVec3("light.position", 1.2f, 1.0f, 2.0f);
|
||||
ourShader.setVec3("light.color", 1.0f, 1.0f, 1.0f);
|
||||
ourShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
|
||||
ourShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
|
||||
ourShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
|
||||
ourShader.setMat4("view", view);
|
||||
ourShader.setMat4("projection", projection);
|
||||
|
||||
light_shader.use();
|
||||
light_shader.setMat4("view", view);
|
||||
light_shader.setVec3("viewPos", camera.Position);
|
||||
light_shader.setMat4("projection", projection);
|
||||
|
||||
// Directional light
|
||||
directional_lightShader.setVec3("light.direction", -0.2f, -1.0f, -0.3f);
|
||||
directional_lightShader.setVec3("light.color", 1.0f, 1.0f, 1.0f);
|
||||
directional_lightShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
|
||||
directional_lightShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
|
||||
directional_lightShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
|
||||
directional_lightShader.setMat4("view", view);
|
||||
directional_lightShader.setMat4("projection", projection);
|
||||
directLight.use(light_shader);
|
||||
|
||||
// Spotlight
|
||||
spotLight.setPosition(camera.Position);
|
||||
spotLight.setDirection(camera.Front);
|
||||
spotLight.setCutOff(light_cutoff);
|
||||
spotLight.setOuterCutOff(light_outerCutoff);
|
||||
spotLight.use(light_shader);
|
||||
|
||||
// Point light
|
||||
point_lightShader.use();
|
||||
point_lightShader.setVec3("viewPos", camera.Position);
|
||||
point_lightShader.setVec3("light.position", lightCubePositionX, lightCubePositionY, lightCubePositionZ);
|
||||
point_lightShader.setVec3("light.color", light_color[0], light_color[1], light_color[2]);
|
||||
point_lightShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
|
||||
point_lightShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
|
||||
point_lightShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
|
||||
point_lightShader.setFloat("light.constant", 1.0f);
|
||||
point_lightShader.setFloat("light.linear", 0.09f);
|
||||
point_lightShader.setFloat("light.quadratic", 0.032f);
|
||||
point_lightShader.setMat4("view", view);
|
||||
point_lightShader.setMat4("projection", projection);
|
||||
|
||||
// Spotlight light
|
||||
spotlight_lightShader.use();
|
||||
spotlight_lightShader.setVec3("viewPos", camera.Position);
|
||||
spotlight_lightShader.setVec3("light.position", lightCubePositionX, lightCubePositionY, lightCubePositionZ);
|
||||
spotlight_lightShader.setVec3("light.direction", light_directionX, light_directionY, light_directionZ);
|
||||
spotlight_lightShader.setVec3("light.color", light_color[0], light_color[1], light_color[2]);
|
||||
spotlight_lightShader.setVec3("light.ambient", 0.2f, 0.2f, 0.2f);
|
||||
spotlight_lightShader.setVec3("light.diffuse", 0.5f, 0.5f, 0.5f);
|
||||
spotlight_lightShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);
|
||||
spotlight_lightShader.setFloat("light.constant", 1.0f);
|
||||
spotlight_lightShader.setFloat("light.linear", 0.09f);
|
||||
spotlight_lightShader.setFloat("light.quadratic", 0.032f);
|
||||
spotlight_lightShader.setFloat("light.cutOff", glm::cos(glm::radians(light_cutoff)));
|
||||
spotlight_lightShader.setFloat("light.outerCutOff", glm::cos(glm::radians(light_outerCutoff)));
|
||||
spotlight_lightShader.setMat4("view", view);
|
||||
spotlight_lightShader.setMat4("projection", projection);
|
||||
light_shader.setInt("pointLightCount", static_cast<int>(pointLights.size()));
|
||||
pointLights[0].setPosition(glm::vec3(lightCubePositionX, lightCubePositionY, lightCubePositionZ));
|
||||
pointLights[0].setColor(glm::vec3(light_color[0], light_color[1], light_color[2]));
|
||||
for (size_t i = 0; i < pointLights.size(); ++i)
|
||||
{
|
||||
pointLights[i].use(light_shader, static_cast<int>(i));
|
||||
}
|
||||
|
||||
object1.setPosition(glm::vec3(positionX, positionY, positionZ));
|
||||
object1.Draw(spotlight_lightShader, deltaTime);
|
||||
object1.Draw(light_shader, deltaTime);
|
||||
object2.setAcceleration(glm::vec3(0.0f, 0.001f, 0.0f));
|
||||
object2.Draw(spotlight_lightShader, deltaTime);
|
||||
object2.Draw(light_shader, deltaTime);
|
||||
object3.setAcceleration(glm::vec3(0.0f, -0.001f, 0.0f));
|
||||
object3.Draw(spotlight_lightShader, deltaTime);
|
||||
object3.Draw(light_shader, deltaTime);
|
||||
|
||||
// Light cube shader
|
||||
light_cubeShader.use();
|
||||
light_cubeShader.setMat4("view", view);
|
||||
light_cubeShader.setMat4("projection", projection);
|
||||
light_cubeShader.setVec3("lightColor", light_color[0], light_color[1], light_color[2]);
|
||||
|
||||
light_cube.setPosition(glm::vec3(lightCubePositionX, lightCubePositionY, lightCubePositionZ));
|
||||
light_cube.Draw(light_cubeShader, deltaTime);
|
||||
for (size_t i = 0; i < pointLights.size(); ++i)
|
||||
{
|
||||
light_cube.setPosition(pointLights[i].getPosition());
|
||||
light_cubeShader.setVec3("lightColor", pointLights[i].getColor());
|
||||
light_cube.Draw(light_cubeShader, deltaTime);
|
||||
}
|
||||
|
||||
ImGui::Render();
|
||||
ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue