From 608b0fb71adf76e012a7a6e7a1a5f4179a2fd71f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=83=A4=E9=BE=99?= <68932014+12gch138@users.noreply.github.com> Date: Wed, 14 Dec 2022 17:49:43 +0800 Subject: [PATCH 01/10] skybox v0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 旧UI最后版本存档 --- FinalProject/FinalProject.vcxproj | 1 + FinalProject/FinalProject.vcxproj.filters | 3 +++ FinalProject/sceneviewer.cpp | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj index 75e1a28..b3ece53 100644 --- a/FinalProject/FinalProject.vcxproj +++ b/FinalProject/FinalProject.vcxproj @@ -132,6 +132,7 @@ + diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters index 20d5f67..adf8bd8 100644 --- a/FinalProject/FinalProject.vcxproj.filters +++ b/FinalProject/FinalProject.vcxproj.filters @@ -147,6 +147,9 @@ Header Files\Utils + + Header Files\OpenGL Abstractions + diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 2ddb15f..aa6bfef 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -65,7 +65,7 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); - Model* backpackModel = new Model("E:\\Repositories\\CollegeProjects\\CGAssignments\\FinalProject\\Models\\backpack\\backpack.obj"); + Model* backpackModel = new Model("D:\\ProgrammingFile\\SceneEditor\\Models\\backpack\\backpack.obj"); Logger::info("Model loaded"); Renderable backpack(backpackModel); _objects.push_back(backpack); From 294cf7efb319adf43c23cb28e69a6177a4f73b56 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Wed, 14 Dec 2022 20:14:16 +0800 Subject: [PATCH 02/10] lighting v0.0 --- FinalProject/FinalProject.vcxproj | 2 ++ FinalProject/FinalProject.vcxproj.filters | 6 ++++++ FinalProject/lightCaster.cpp | 0 FinalProject/lightCaster.h | 1 + FinalProject/sceneviewer.cpp | 2 +- FinalProject/sceneviewer.h | 3 +++ 6 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 FinalProject/lightCaster.cpp create mode 100644 FinalProject/lightCaster.h diff --git a/FinalProject/FinalProject.vcxproj b/FinalProject/FinalProject.vcxproj index b3ece53..307d05e 100644 --- a/FinalProject/FinalProject.vcxproj +++ b/FinalProject/FinalProject.vcxproj @@ -105,6 +105,7 @@ + @@ -129,6 +130,7 @@ + diff --git a/FinalProject/FinalProject.vcxproj.filters b/FinalProject/FinalProject.vcxproj.filters index adf8bd8..383d1d7 100644 --- a/FinalProject/FinalProject.vcxproj.filters +++ b/FinalProject/FinalProject.vcxproj.filters @@ -100,6 +100,9 @@ Source Files\Utils + + Source Files\OpenGL Abstractions + @@ -150,6 +153,9 @@ Header Files\OpenGL Abstractions + + Header Files\OpenGL Abstractions + diff --git a/FinalProject/lightCaster.cpp b/FinalProject/lightCaster.cpp new file mode 100644 index 0000000..e69de29 diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/FinalProject/lightCaster.h @@ -0,0 +1 @@ +#pragma once diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index aa6bfef..406b3f9 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -65,7 +65,7 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); - Model* backpackModel = new Model("D:\\ProgrammingFile\\SceneEditor\\Models\\backpack\\backpack.obj"); + Model* backpackModel = new Model("D:\\code\\ComputerGraphic\\nanosuit\\nanosuit.obj"); Logger::info("Model loaded"); Renderable backpack(backpackModel); _objects.push_back(backpack); diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index a854b32..b45fd4e 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -12,6 +12,7 @@ #include "renderable.h" #include "vao.h" #include "utils.h" +#include "lightCaster.h" class SceneViewer : public QOpenGLWidget, protected QOpenGLFunctions { @@ -21,6 +22,8 @@ private: // OpenGL section------------------------------------- // List of objects currently in the scene std::vector _objects; + // List of light casters in the scene + std::vector _casters; // Shader program for objects ShaderProgram _shaderProgram = ShaderProgram::empty(); // Main camera From df803c8deaa1910bf4e870cb3e4a3180f170496d Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Thu, 15 Dec 2022 11:23:52 +0800 Subject: [PATCH 03/10] add light and change shader --- FinalProject/fragmentshader.fs | 2 ++ FinalProject/lightCaster.cpp | 2 ++ FinalProject/lightCaster.h | 9 +++++++++ FinalProject/sceneviewer.cpp | 7 +++++++ 4 files changed, 20 insertions(+) diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.fs index 556286e..229dce5 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.fs @@ -5,9 +5,11 @@ in vec2 TexCoords; uniform sampler2D texture_diffuse1; uniform sampler2D texture_specular1; +uniform vec3 lightColor; void main() { FragColor = texture(texture_specular1, TexCoords); FragColor = texture(texture_diffuse1, TexCoords); + FragColor = vec4(FragColor * vec4(lightColor,1.0f)); } \ No newline at end of file diff --git a/FinalProject/lightCaster.cpp b/FinalProject/lightCaster.cpp index e69de29..4e6e08d 100644 --- a/FinalProject/lightCaster.cpp +++ b/FinalProject/lightCaster.cpp @@ -0,0 +1,2 @@ +#include"lightCaster.h" + diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index 6f70f09..e01b132 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -1 +1,10 @@ #pragma once +#include"shader.h" + +// ﲻҪ˵Ҫshader +// sceneviewerб +class LightCaster { +public: + LightCaster() {}; + +}; \ No newline at end of file diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 406b3f9..0f12183 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -87,6 +87,13 @@ void SceneViewer::paintGL() { glm::mat4 projection = glm::perspective(glm::radians(_camera.zoomVal()), (float)width() / (float)height(), 0.1f, 100.0f); _shaderProgram.setUniform("view", view); _shaderProgram.setUniform("projection", projection); + + + ///////////////////////////////////////ղӦ÷ + _shaderProgram.setUniform("lightColor", 0.0f, 1.0f, 0.0f); + ////////////////////////////////////// + + for (auto object : _objects) { object.render(_shaderProgram); From 8adf864c398ac2655fd5ab481a4ad064170401fa Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Thu, 15 Dec 2022 16:13:52 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E5=B0=86=E6=96=87=E4=BB=B6=E7=9A=84?= =?UTF-8?q?=E5=A4=8D=E5=88=B6=E4=B8=8E=E7=BB=99=E4=BA=88=E6=9D=83=E9=99=90?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E6=88=90=E4=B8=80=E4=B8=AA=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E3=80=82=20=E6=B7=BB=E5=8A=A0=E5=85=89=E7=85=A7=E6=B8=B2?= =?UTF-8?q?=E6=9F=93=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FinalProject/fragmentshader.fs | 24 ++++++++++++++++++++---- FinalProject/illuminant.fs | 0 FinalProject/illuminant.vs | 11 +++++++++++ FinalProject/lightCaster.h | 4 ++-- FinalProject/sceneviewer.cpp | 13 ++++++++++--- FinalProject/sceneviewer.h | 1 + FinalProject/vertexshader.vs | 7 ++++++- 7 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 FinalProject/illuminant.fs create mode 100644 FinalProject/illuminant.vs diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.fs index 229dce5..620dc74 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.fs @@ -2,14 +2,30 @@ out vec4 FragColor; in vec2 TexCoords; +in vec3 Normal; +in vec3 FragPos; uniform sampler2D texture_diffuse1; uniform sampler2D texture_specular1; +// above 2 uniform can caculate objectColor + +uniform vec3 lightPos; uniform vec3 lightColor; void main() -{ - FragColor = texture(texture_specular1, TexCoords); - FragColor = texture(texture_diffuse1, TexCoords); - FragColor = vec4(FragColor * vec4(lightColor,1.0f)); +{ + vec3 objectColor = texture(texture_specular1, TexCoords).rgb; + objectColor = texture(texture_diffuse1, TexCoords).rgb; + // ambient + float ambientStrength = 0; + vec3 ambient = ambientStrength * lightColor; + + // diffuse + vec3 norm = normalize(Normal); + vec3 lightDir = normalize(lightPos - FragPos); + float diff = max(dot(norm, lightDir), 0.0); + vec3 diffuse = diff * lightColor; + + vec3 result = (ambient + diffuse) * objectColor; + FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/FinalProject/illuminant.fs b/FinalProject/illuminant.fs new file mode 100644 index 0000000..e69de29 diff --git a/FinalProject/illuminant.vs b/FinalProject/illuminant.vs new file mode 100644 index 0000000..c875a90 --- /dev/null +++ b/FinalProject/illuminant.vs @@ -0,0 +1,11 @@ +#version 430 core +layout (location = 0) in vec3 aPos; + +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + gl_Position = projection * view * model * vec4(aPos, 1.0); +} \ No newline at end of file diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index e01b132..d23d3ad 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -3,8 +3,8 @@ // ﲻҪ˵Ҫshader // sceneviewerб -class LightCaster { +class Illuminant { public: - LightCaster() {}; + Illuminant() {}; }; \ No newline at end of file diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 0f12183..453a00c 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -5,7 +5,7 @@ #include #include #include - +#include #include "vbo.h" #include "vao.h" #include "shader.h" @@ -89,8 +89,8 @@ void SceneViewer::paintGL() { _shaderProgram.setUniform("projection", projection); - ///////////////////////////////////////ղӦ÷ - _shaderProgram.setUniform("lightColor", 0.0f, 1.0f, 0.0f); + ///////////////////////////////////////йմ + update_light(); ////////////////////////////////////// @@ -174,3 +174,10 @@ void SceneViewer::wheelEvent(QWheelEvent* event) { // Update the view update(); } + +void SceneViewer::update_light() { + auto r = time(NULL); + Logger::debug("1\n"); + _shaderProgram.setUniform("lightPos", (float)sin(r), (float)sin(r/4), (float)sin(r/2.1)); + _shaderProgram.setUniform("lightColor", 1.0f, 1.0f, 1.0f); +} diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index b45fd4e..2d9bd31 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -41,6 +41,7 @@ private: public: SceneViewer(QWidget* parent = 0); ~SceneViewer(); + void update_light(); protected: // OpenGL functions diff --git a/FinalProject/vertexshader.vs b/FinalProject/vertexshader.vs index 73091f6..fc9d2cf 100644 --- a/FinalProject/vertexshader.vs +++ b/FinalProject/vertexshader.vs @@ -4,6 +4,8 @@ layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; out vec2 TexCoords; +out vec3 FragPos; +out vec3 Normal; uniform mat4 model; uniform mat4 view; @@ -11,6 +13,9 @@ uniform mat4 projection; void main() { + FragPos = vec3(model * vec4(aPos, 1.0)); + Normal = aNormal; + TexCoords = aTexCoords; - gl_Position = projection * view * model * vec4(aPos, 1.0); + gl_Position = projection * view * vec4(FragPos, 1.0); } \ No newline at end of file From d181aefde7de619eefe7f1375f3c2bd4f8b842aa Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Thu, 15 Dec 2022 18:43:04 +0800 Subject: [PATCH 05/10] lighting without abstraction --- FinalProject/fragmentshader.fs | 12 +++++- FinalProject/lightCaster.h | 1 + FinalProject/sceneviewer.cpp | 72 +++++++++++++++++++++++++++------- FinalProject/sceneviewer.h | 2 +- 4 files changed, 69 insertions(+), 18 deletions(-) diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.fs index 620dc74..9f4baa5 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.fs @@ -10,6 +10,7 @@ uniform sampler2D texture_specular1; // above 2 uniform can caculate objectColor uniform vec3 lightPos; +uniform vec3 viewPos; uniform vec3 lightColor; void main() @@ -17,7 +18,7 @@ void main() vec3 objectColor = texture(texture_specular1, TexCoords).rgb; objectColor = texture(texture_diffuse1, TexCoords).rgb; // ambient - float ambientStrength = 0; + float ambientStrength = 0.3; vec3 ambient = ambientStrength * lightColor; // diffuse @@ -26,6 +27,13 @@ void main() float diff = max(dot(norm, lightDir), 0.0); vec3 diffuse = diff * lightColor; - vec3 result = (ambient + diffuse) * objectColor; + // specular + float specularStrength = 0.5; + vec3 viewDir = normalize(viewPos - FragPos); + vec3 reflectDir = reflect(-lightDir, norm); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); + vec3 specular = specularStrength * spec * lightColor; + + vec3 result = (ambient + diffuse + specular) * objectColor; FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index d23d3ad..3343dcd 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -4,6 +4,7 @@ // ﲻҪ˵Ҫshader // sceneviewerб class Illuminant { + public: Illuminant() {}; diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 453a00c..7966706 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -14,6 +14,14 @@ using std::vector; +void copyFile(std::string name) { + if (QFile::exists(("./temp/shaders/" + name).c_str())) { + QFile::remove(("./temp/shaders/" + name).c_str()); + } + QFile::copy((":/shaders/" + name).c_str(), ("./temp/shaders/" + name).c_str()); + QFile::setPermissions(("./temp/shaders/" + name).c_str(), QFileDevice::ReadOwner | QFileDevice::WriteOwner); +} + SceneViewer::SceneViewer(QWidget* parent) : QOpenGLWidget(parent) { @@ -29,16 +37,24 @@ SceneViewer::SceneViewer(QWidget* parent) } // Copy the shaders to the folder - if (QFile::exists("./temp/shaders/vertexshader.vs")) { - QFile::remove("./temp/shaders/vertexshader.vs"); - } - QFile::copy(":/shaders/vertexshader.vs", "./temp/shaders/vertexshader.vs"); - QFile::setPermissions("./temp/shaders/vertexshader.vs", QFileDevice::ReadOwner | QFileDevice::WriteOwner); - if (QFile::exists("./temp/shaders/fragmentshader.fs")) { - QFile::remove("./temp/shaders/fragmentshader.fs"); - } - QFile::copy(":/shaders/fragmentshader.fs", "./temp/shaders/fragmentshader.fs"); - QFile::setPermissions("./temp/shaders/fragmentshader.fs", QFile::ReadOwner | QFile::WriteOwner); + //if (QFile::exists("./temp/shaders/vertexshader.vs")) { + // QFile::remove("./temp/shaders/vertexshader.vs"); + //} + //QFile::copy(":/shaders/vertexshader.vs", "./temp/shaders/vertexshader.vs"); + //QFile::setPermissions("./temp/shaders/vertexshader.vs", QFileDevice::ReadOwner | QFileDevice::WriteOwner); + // + //if (QFile::exists("./temp/shaders/fragmentshader.fs")) { + // QFile::remove("./temp/shaders/fragmentshader.fs"); + //} + //QFile::copy(":/shaders/fragmentshader.fs", "./temp/shaders/fragmentshader.fs"); + //QFile::setPermissions("./temp/shaders/fragmentshader.fs", QFile::ReadOwner | QFile::WriteOwner); + + copyFile("vertexshader.vs"); + copyFile("fragmentshader.fs"); + //copyFile("illuminant.vs"); + //copyFile("illuminant.fs"); + + } SceneViewer::~SceneViewer() { @@ -52,7 +68,7 @@ void SceneViewer::initializeGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); - + glEnable(GL_FRAMEBUFFER_SRGB); Logger::info("Currently running on OpenGL version: " + std::string((const char*)glGetString(GL_VERSION))); _shaderProgram.ensureInitialized(); @@ -65,7 +81,7 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); - Model* backpackModel = new Model("D:\\code\\ComputerGraphic\\nanosuit\\nanosuit.obj"); + Model* backpackModel = new Model("D:\\code\\ComputerGraphic\\backpack\\backpack.obj"); Logger::info("Model loaded"); Renderable backpack(backpackModel); _objects.push_back(backpack); @@ -175,9 +191,35 @@ void SceneViewer::wheelEvent(QWheelEvent* event) { update(); } +double rr = 1.0; void SceneViewer::update_light() { - auto r = time(NULL); - Logger::debug("1\n"); + // ڷ壬 + //model is in Illuminate + // view is from camera + // projection is from caller + + rr += time(NULL) / 1000000000.0; + rr = (long long)rr % 10000; + double r = rr / 100; + _shaderProgram.setUniform("lightPos", (float)sin(r), (float)sin(r/4), (float)sin(r/2.1)); - _shaderProgram.setUniform("lightColor", 1.0f, 1.0f, 1.0f); + _shaderProgram.setUniform("lightColor", 0.8+0.2*(float)sin(r), 0.8 + 0.2 * (float)sin(r / 3), 0.8 + 0.2 * (float)sin(r / 2.1)); + + _shaderProgram.setUniform("viewPos", _camera.position()); + // ҪɫviewPos + + + //// 滻Ⱦshaderprogram + //ShaderProgram illuminantShader = ShaderProgram::empty(); + + + //illuminantShader.ensureInitialized(); + //Logger::info("Shader Program initialized"); + + //VertexShader vertexShader("./temp/shaders/illuminant.vs"); + //FragmentShader fragmentShader("./temp/shaders/illuminant.fs"); + //_shaderProgram.attachShader(vertexShader); + //_shaderProgram.attachShader(fragmentShader); + //vertexShader.dispose(); + //fragmentShader.dispose(); } diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index 2d9bd31..5f9b9be 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -23,7 +23,7 @@ private: // List of objects currently in the scene std::vector _objects; // List of light casters in the scene - std::vector _casters; + std::vector _illuminants; // Shader program for objects ShaderProgram _shaderProgram = ShaderProgram::empty(); // Main camera From 759f4ad68890be97c3febc438ce205c09a107d70 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Fri, 16 Dec 2022 16:03:53 +0800 Subject: [PATCH 06/10] add shininess attribute in mesh class --- FinalProject/fragmentshader.fs | 49 ++++++++++++++++++++-------------- FinalProject/lightCaster.cpp | 17 ++++++++++++ FinalProject/lightCaster.h | 24 ++++++++++++++--- FinalProject/mesh.cpp | 2 ++ FinalProject/mesh.h | 5 ++++ FinalProject/renderable.cpp | 4 +++ FinalProject/sceneviewer.cpp | 30 ++++----------------- FinalProject/sceneviewer.h | 5 +++- FinalProject/vertexshader.vs | 4 +-- 9 files changed, 88 insertions(+), 52 deletions(-) diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.fs index 9f4baa5..b2d475d 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.fs @@ -1,39 +1,48 @@ #version 430 core out vec4 FragColor; -in vec2 TexCoords; -in vec3 Normal; + +struct Material { + sampler2D texture_diffuse1; + sampler2D texture_specular1; + float shininess; +}; + +struct Light { + vec3 position; + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + + in vec3 FragPos; +in vec3 Normal; +in vec2 TexCoords; -uniform sampler2D texture_diffuse1; -uniform sampler2D texture_specular1; -// above 2 uniform can caculate objectColor -uniform vec3 lightPos; uniform vec3 viewPos; -uniform vec3 lightColor; +uniform Material material; +uniform Light light; + void main() { - vec3 objectColor = texture(texture_specular1, TexCoords).rgb; - objectColor = texture(texture_diffuse1, TexCoords).rgb; - // ambient - float ambientStrength = 0.3; - vec3 ambient = ambientStrength * lightColor; - +// ambient + vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb; + // diffuse vec3 norm = normalize(Normal); - vec3 lightDir = normalize(lightPos - FragPos); + vec3 lightDir = normalize(light.position - FragPos); float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = diff * lightColor; - + vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb; + // specular - float specularStrength = 0.5; vec3 viewDir = normalize(viewPos - FragPos); vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32); - vec3 specular = specularStrength * spec * lightColor; + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb; - vec3 result = (ambient + diffuse + specular) * objectColor; + vec3 result = ambient + diffuse + specular; FragColor = vec4(result, 1.0); } \ No newline at end of file diff --git a/FinalProject/lightCaster.cpp b/FinalProject/lightCaster.cpp index 4e6e08d..08e10e6 100644 --- a/FinalProject/lightCaster.cpp +++ b/FinalProject/lightCaster.cpp @@ -1,2 +1,19 @@ #include"lightCaster.h" +Illuminant::Illuminant() { + _position = glm::vec3(0.0f); + _color = glm::vec3(1.0f); +} +Illuminant::Illuminant(glm::vec3 position, glm::vec3 color) { + _position = position; + _color = color; +} + + + +void Illuminant::setPosition(glm::vec3 position) { + _position = position; +} +void Illuminant::setColor(glm::vec3 color) { + _color = color; +} \ No newline at end of file diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index 3343dcd..ca4b7e1 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -1,11 +1,27 @@ #pragma once #include"shader.h" - +#include // ﲻҪ˵Ҫshader // sceneviewerб class Illuminant { - +private: + glm::vec3 _position; + glm::vec3 _color; public: - Illuminant() {}; + Illuminant(); + Illuminant(glm::vec3 position, glm::vec3 color); -}; \ No newline at end of file + inline glm::vec3 position(); + glm::vec3 color(); + + void setPosition(glm::vec3 position); + void setColor(glm::vec3 color); + +}; + +inline glm::vec3 Illuminant::position() { + return _position; +} +inline glm::vec3 Illuminant::color() { + return _color; +} \ No newline at end of file diff --git a/FinalProject/mesh.cpp b/FinalProject/mesh.cpp index 0f70513..2bdffe8 100644 --- a/FinalProject/mesh.cpp +++ b/FinalProject/mesh.cpp @@ -27,6 +27,8 @@ void Mesh::render(const ShaderProgram& shader) const { // retrieve texture number (the N in diffuse_textureN) std::string number; std::string name = _textures[i].type() == TextureType::DIFFUSE ? "texture_diffuse" : "texture_specular"; + name = "material." + name; + if (_textures[i].type() == TextureType::DIFFUSE) number = std::to_string(diffuseNr++); else if (_textures[i].type() == TextureType::SPECULAR) diff --git a/FinalProject/mesh.h b/FinalProject/mesh.h index 56e07c5..574737a 100644 --- a/FinalProject/mesh.h +++ b/FinalProject/mesh.h @@ -13,6 +13,9 @@ private: std::vector _indices; std::vector _textures; + // we can control shininess in mesh + float _shininess = 64.0f; + VertexArrayObject _vao = VertexArrayObject::empty(); public: @@ -23,6 +26,8 @@ public: inline std::vector vertices() const { return _vertices; } inline std::vector indices() const { return _indices; } inline std::vector textures() const { return _textures; } + inline float shininess() { return _shininess; } + inline void setShininess(float shininess) { _shininess = shininess; } inline VertexArrayObject vao() const { return _vao; } diff --git a/FinalProject/renderable.cpp b/FinalProject/renderable.cpp index 86463a1..45fccab 100644 --- a/FinalProject/renderable.cpp +++ b/FinalProject/renderable.cpp @@ -33,6 +33,10 @@ void Renderable::setScale(float scale) { void Renderable::render(ShaderProgram shader) { // Set model matrix shader.setUniform("model", modelMatrix()); + // set diffuse + //shader.setUniform("") + + // Render _model->render(shader); } diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 7966706..5149f61 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -6,12 +6,8 @@ #include #include #include -#include "vbo.h" -#include "vao.h" -#include "shader.h" -#include "logger.h" -#include "model.h" +#include "lightCaster.h" using std::vector; void copyFile(std::string name) { @@ -25,6 +21,7 @@ void copyFile(std::string name) { SceneViewer::SceneViewer(QWidget* parent) : QOpenGLWidget(parent) { + _illuminants.push_back(Illuminant()); QSurfaceFormat format; format.setProfile(QSurfaceFormat::CoreProfile); format.setVersion(4, 3); @@ -191,35 +188,18 @@ void SceneViewer::wheelEvent(QWheelEvent* event) { update(); } -double rr = 1.0; + void SceneViewer::update_light() { // ڷ壬 //model is in Illuminate // view is from camera // projection is from caller - rr += time(NULL) / 1000000000.0; - rr = (long long)rr % 10000; - double r = rr / 100; - _shaderProgram.setUniform("lightPos", (float)sin(r), (float)sin(r/4), (float)sin(r/2.1)); - _shaderProgram.setUniform("lightColor", 0.8+0.2*(float)sin(r), 0.8 + 0.2 * (float)sin(r / 3), 0.8 + 0.2 * (float)sin(r / 2.1)); + _shaderProgram.setUniform("lightPos",_illuminants[0].position()); + _shaderProgram.setUniform("lightColor", _illuminants[0].color()); _shaderProgram.setUniform("viewPos", _camera.position()); // ҪɫviewPos - - - //// 滻Ⱦshaderprogram - //ShaderProgram illuminantShader = ShaderProgram::empty(); - - //illuminantShader.ensureInitialized(); - //Logger::info("Shader Program initialized"); - - //VertexShader vertexShader("./temp/shaders/illuminant.vs"); - //FragmentShader fragmentShader("./temp/shaders/illuminant.fs"); - //_shaderProgram.attachShader(vertexShader); - //_shaderProgram.attachShader(fragmentShader); - //vertexShader.dispose(); - //fragmentShader.dispose(); } diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index 5f9b9be..d42ad39 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -4,7 +4,6 @@ #include #include #include - #include #include "camera.h" @@ -13,6 +12,10 @@ #include "vao.h" #include "utils.h" #include "lightCaster.h" +#include "vbo.h" +#include "logger.h" +#include "model.h" + class SceneViewer : public QOpenGLWidget, protected QOpenGLFunctions { diff --git a/FinalProject/vertexshader.vs b/FinalProject/vertexshader.vs index fc9d2cf..97c08db 100644 --- a/FinalProject/vertexshader.vs +++ b/FinalProject/vertexshader.vs @@ -3,9 +3,9 @@ layout (location = 0) in vec3 aPos; layout (location = 1) in vec3 aNormal; layout (location = 2) in vec2 aTexCoords; -out vec2 TexCoords; out vec3 FragPos; out vec3 Normal; +out vec2 TexCoords; uniform mat4 model; uniform mat4 view; @@ -14,7 +14,7 @@ uniform mat4 projection; void main() { FragPos = vec3(model * vec4(aPos, 1.0)); - Normal = aNormal; + Normal = mat3(transpose(inverse(model))) * aNormal; TexCoords = aTexCoords; gl_Position = projection * view * vec4(FragPos, 1.0); From f26402461a40d3e27c48366851a1d0f45d71a544 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Fri, 16 Dec 2022 23:05:08 +0800 Subject: [PATCH 07/10] add function to provide interface --- FinalProject/fragmentshader.fs | 138 +++++++++++++++++--- FinalProject/lightCaster.cpp | 231 +++++++++++++++++++++++++++++++-- FinalProject/lightCaster.h | 85 ++++++++++-- FinalProject/mesh.cpp | 1 + FinalProject/mesh.h | 2 +- FinalProject/sceneviewer.cpp | 34 +++-- FinalProject/sceneviewer.h | 3 + FinalProject/vertexshader.vs | 4 +- 8 files changed, 440 insertions(+), 58 deletions(-) diff --git a/FinalProject/fragmentshader.fs b/FinalProject/fragmentshader.fs index b2d475d..5dbf34b 100644 --- a/FinalProject/fragmentshader.fs +++ b/FinalProject/fragmentshader.fs @@ -1,20 +1,48 @@ #version 430 core out vec4 FragColor; - struct Material { sampler2D texture_diffuse1; sampler2D texture_specular1; float shininess; }; -struct Light { - vec3 position; +struct DirLight { + vec3 direction; + vec3 ambient; vec3 diffuse; vec3 specular; }; +struct PointLight { + vec3 position; + + float constant; + float linear; + float quadratic; + + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + +struct SpotLight { + vec3 position; + vec3 direction; + float cutOff; + float outerCutOff; + + float constant; + float linear; + float quadratic; + + vec3 ambient; + vec3 diffuse; + vec3 specular; +}; + +#define NR_POINT_LIGHTS 4 in vec3 FragPos; in vec3 Normal; @@ -22,27 +50,99 @@ in vec2 TexCoords; uniform vec3 viewPos; +uniform DirLight dirLight; +uniform PointLight pointLights[NR_POINT_LIGHTS]; +uniform SpotLight spotLight; uniform Material material; -uniform Light light; +// function prototypes +vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir); +vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir); +vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir); void main() -{ -// ambient - vec3 ambient = light.ambient * texture(material.diffuse, TexCoords).rgb; - - // diffuse +{ + // properties vec3 norm = normalize(Normal); - vec3 lightDir = normalize(light.position - FragPos); - float diff = max(dot(norm, lightDir), 0.0); - vec3 diffuse = light.diffuse * diff * texture(material.diffuse, TexCoords).rgb; - - // specular vec3 viewDir = normalize(viewPos - FragPos); - vec3 reflectDir = reflect(-lightDir, norm); - float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); - vec3 specular = light.specular * spec * texture(material.specular, TexCoords).rgb; - - vec3 result = ambient + diffuse + specular; + + // == ===================================================== + // Our lighting is set up in 3 phases: directional, point lights and an optional flashlight + // For each phase, a calculate function is defined that calculates the corresponding color + // per lamp. In the main() function we take all the calculated colors and sum them up for + // this fragment's final color. + // == ===================================================== + // phase 1: directional lighting + vec3 result = CalcDirLight(dirLight, norm, viewDir); + // phase 2: point lights + for(int i = 0; i < NR_POINT_LIGHTS; i++) + result += CalcPointLight(pointLights[i], norm, FragPos, viewDir); + // phase 3: spot light + result += CalcSpotLight(spotLight, norm, FragPos, viewDir); + FragColor = vec4(result, 1.0); +} + +// calculates the color when using a directional light. +vec3 CalcDirLight(DirLight light, vec3 normal, vec3 viewDir) +{ + vec3 lightDir = normalize(-light.direction); + // diffuse shading + float diff = max(dot(normal, lightDir), 0.0); + // specular shading + vec3 reflectDir = reflect(-lightDir, normal); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + // combine results + vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + return (ambient + diffuse + specular); +} + +// calculates the color when using a point light. +vec3 CalcPointLight(PointLight light, vec3 normal, vec3 fragPos, vec3 viewDir) +{ + vec3 lightDir = normalize(light.position - fragPos); + // diffuse shading + float diff = max(dot(normal, lightDir), 0.0); + // specular shading + vec3 reflectDir = reflect(-lightDir, normal); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + // attenuation + float distance = length(light.position - fragPos); + float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance)); + // combine results + vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + ambient *= attenuation; + diffuse *= attenuation; + specular *= attenuation; + return (ambient + diffuse + specular); +} + +// calculates the color when using a spot light. +vec3 CalcSpotLight(SpotLight light, vec3 normal, vec3 fragPos, vec3 viewDir) +{ + vec3 lightDir = normalize(light.position - fragPos); + // diffuse shading + float diff = max(dot(normal, lightDir), 0.0); + // specular shading + vec3 reflectDir = reflect(-lightDir, normal); + float spec = pow(max(dot(viewDir, reflectDir), 0.0), material.shininess); + // attenuation + float distance = length(light.position - fragPos); + float attenuation = 1.0 / (light.constant + light.linear * distance + light.quadratic * (distance * distance)); + // spotlight intensity + float theta = dot(lightDir, normalize(-light.direction)); + float epsilon = light.cutOff - light.outerCutOff; + float intensity = clamp((theta - light.outerCutOff) / epsilon, 0.0, 1.0); + // combine results + vec3 ambient = light.ambient * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 diffuse = light.diffuse * diff * vec3(texture(material.texture_diffuse1, TexCoords)); + vec3 specular = light.specular * spec * vec3(texture(material.texture_specular1, TexCoords)); + ambient *= attenuation * intensity; + diffuse *= attenuation * intensity; + specular *= attenuation * intensity; + return (ambient + diffuse + specular); } \ No newline at end of file diff --git a/FinalProject/lightCaster.cpp b/FinalProject/lightCaster.cpp index 08e10e6..836d0a4 100644 --- a/FinalProject/lightCaster.cpp +++ b/FinalProject/lightCaster.cpp @@ -1,19 +1,228 @@ #include"lightCaster.h" -Illuminant::Illuminant() { - _position = glm::vec3(0.0f); - _color = glm::vec3(1.0f); +ShaderProgram* lastShader = NULL; + +queue available = queue(); + +Illuminant::Illuminant(){ + Logger::debug("We do not recommend to construct illuminant without parameter"); } -Illuminant::Illuminant(glm::vec3 position, glm::vec3 color) { +// white color by default +Illuminant::Illuminant(glm::vec3 position, LightType lightType){ _position = position; - _color = color; + setType(lightType); } - - - -void Illuminant::setPosition(glm::vec3 position) { +// set up with one color +Illuminant::Illuminant(glm::vec3 position, glm::vec3 color, LightType lightType){ _position = position; + _ambient = color * 0.05f; + _diffuse = color * 0.8f; + _specular = color; + setType(lightType); } -void Illuminant::setColor(glm::vec3 color) { - _color = color; +//set up by assign all colors +Illuminant::Illuminant(glm::vec3 position, glm::vec3 ambient, + glm::vec3 diffuse, glm::vec3 specular, LightType lightType){ + _position = position; + _ambient = ambient; + _diffuse = diffuse; + _specular = specular; + setType(lightType); +} +// set up with one colorƽйԴʹ +Illuminant::Illuminant(LightType lightType, glm::vec3 direction, glm::vec3 color) { + _direction = direction; + _ambient = color * 0.05f; + _diffuse = color * 0.8f; + _specular = color; + setType(lightType); +} + +// set up with one color۹ƹԴʹ +Illuminant::Illuminant(glm::vec3 position, glm::vec3 direction, glm::vec3 color, LightType lightType) { + _direction = direction; + _position = position; + _ambient = color * 0.05f; + _diffuse = color * 0.8f; + _specular = color; + setType(lightType); +} + +Illuminant::~Illuminant() { + switchOff(); + if (_lightType == point) { + available.push(this->pointID); + } + +} + +void Illuminant::setAttenuation(float constant, float linear, float quadratic){ + _constant = constant; + _linear = linear; + _quadratic = quadratic; +} + +glm::vec3 Illuminant::direction(){ + return _direction; +} +glm::vec3 Illuminant::position(){ + return _position; +} +glm::vec3 Illuminant::ambient(){ + return _ambient; +} +glm::vec3 Illuminant::diffuse(){ + return _diffuse; +} +glm::vec3 Illuminant::specular(){ + return _specular; +} + +Illuminant::LightType Illuminant::type(){ + return _lightType; +} + +void Illuminant::move(glm::vec3 deltaPos){ + _position += deltaPos; +} +void Illuminant::setPosition(glm::vec3 Pos){ + _position = Pos; +} + +void Illuminant::setColor(glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular){ + _ambient = ambient; + _diffuse = diffuse; + _specular = specular; +} + +// ʹĬϵķϵ +void Illuminant::setColor(glm::vec3 color){ + _ambient = color * 0.05f; + _diffuse = color * 0.8f; + _specular = color; +} +void Illuminant::setDirection(glm::vec3 direction) { + _direction = direction; +} + +void Illuminant::setType(LightType type){ + + if (available.size() == 0 and type == point) { + Logger::error("Point light number exceed!\n"); + return; + } + _lightType = type; + if (type == point) { + pointID = available.front(); + available.pop(); + } +} + +void Illuminant::updateLight(ShaderProgram& shader) { + if (_lightType == dir) { + // directional light + shader.setUniform("dirLight.direction", _direction); + shader.setUniform("dirLight.ambient", _ambient); + shader.setUniform("dirLight.diffuse", _diffuse); + shader.setUniform("dirLight.specular",_specular); + } + else if (_lightType == point) + { // point light 1 + string prefix = "pointLights[" + std::to_string(pointID) + "]."; + + shader.setUniform(prefix+"position", _position); + shader.setUniform(prefix + "ambient", _ambient); + shader.setUniform(prefix + "diffuse", _diffuse); + shader.setUniform(prefix + "specular", _specular); + shader.setUniform(prefix + "constant",_constant); + shader.setUniform(prefix + "linear", _linear); + shader.setUniform(prefix + "quadratic", _quadratic); + + } + else { + // spotLight + shader.setUniform("spotLight.position", _position); + shader.setUniform("spotLight.direction", _direction); + shader.setUniform("spotLight.ambient", _ambient); + shader.setUniform("spotLight.diffuse", _diffuse); + shader.setUniform("spotLight.specular", _specular); + shader.setUniform("spotLight.constant", _constant); + shader.setUniform("spotLight.linear", _linear); + shader.setUniform("spotLight.quadratic", _quadratic); + shader.setUniform("spotLight.cutOff", glm::cos(glm::radians(12.5f))); + shader.setUniform("spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); + } + + +} + +void Illuminant::switchOff() { + // ֻҪûɫ + setColor(glm::vec3(0.0f, 0.0f, 0.0f)); + if (lastShader != NULL) { + updateLight(*lastShader); + } +} + +void init_queue() { + for (int i = 0; i < Illuminant::MAXPOINTLIGHT; i++) { + available.push(i); + Logger::info("23533423q543"); + } +} +double r = 1; + +// ʼб +void setAllLigntUniform(ShaderProgram& shader) { + r = r + 1; + double rr = sin(r / 20)*8; + + shader.setUniform("dirLight.direction",0,1,0); + shader.setUniform("dirLight.ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("dirLight.diffuse", 0.0f, 100.0f, 220.0f); + shader.setUniform("dirLight.specular", 00.0f, 0.0f, 0.0f); + // point light 1 + + shader.setUniform("pointLights[0].position", 0, 0, 0); + shader.setUniform("pointLights[0].ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[0].diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[0].specular", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[0].constant", 1.0f); + shader.setUniform("pointLights[0].linear", 0.09f); + shader.setUniform("pointLights[0].quadratic", 0.032f); + // point light 2 + shader.setUniform("pointLights[1].position", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[1].ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[1].diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[1].specular", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[1].constant", 1.0f); + shader.setUniform("pointLights[1].linear", 0.09f); + shader.setUniform("pointLights[1].quadratic", 0.032f); + // point light 3 + shader.setUniform("pointLights[2].position", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[2].ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[2].diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[2].specular", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[2].constant", 1.0f); + shader.setUniform("pointLights[2].linear", 0.09f); + shader.setUniform("pointLights[2].quadratic", 0.032f); + // point light 4 + shader.setUniform("pointLights[3].position", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[3].ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[3].diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[3].specular", 0.0f, 0.0f, 0.0f); + shader.setUniform("pointLights[3].constant", 1.0f); + shader.setUniform("pointLights[3].linear", 0.09f); + shader.setUniform("pointLights[3].quadratic", 0.032f); + // spotLight + shader.setUniform("spotLight.position", 0.0f, 0.0f, 3.0f); + shader.setUniform("spotLight.direction", -0.0f,-0.0f, -1.0f); + shader.setUniform("spotLight.ambient", 0.0f, 0.0f, 0.0f); + shader.setUniform("spotLight.diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("spotLight.specular", 0.0f, 0.0f, 0.0f); + shader.setUniform("spotLight.constant", 1.0f); + shader.setUniform("spotLight.linear", 0.09f); + shader.setUniform("spotLight.quadratic", 0.032f); + shader.setUniform("spotLight.cutOff", glm::cos(glm::radians(12.5f))); + shader.setUniform("spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); } \ No newline at end of file diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index ca4b7e1..986becf 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -1,27 +1,86 @@ #pragma once #include"shader.h" #include +#include +#include"logger.h" +#include + +using std::queue; +using std::string; // ﲻҪ˵Ҫshader // sceneviewerб class Illuminant { -private: - glm::vec3 _position; - glm::vec3 _color; public: + enum LightType { dir, spot, point }; + int pointID = -1; +private: + LightType _lightType = dir; + + glm::vec3 _direction = glm::vec3(0,2,-1); + glm::vec3 _position = glm::vec3(0.0f); + glm::vec3 _ambient = glm::vec3(0.05f, 0.05f, 0.05f); + glm::vec3 _diffuse = glm::vec3(0.8f, 0.8f, 0.8f); + glm::vec3 _specular = glm::vec3(0.8f, 0.8f, 0.8f); + + float _constant = 1.0f; + float _linear = 0.09f; + float _quadratic = 0.032f; + + +public: + // ޸Ĵ˴ͬ޸fragment shader鶨䣬ĿǰֵΪ4 + const static int MAXPOINTLIGHT = 4; + Illuminant(); - Illuminant(glm::vec3 position, glm::vec3 color); + // white color by default + Illuminant(glm::vec3 position, LightType lightType); + // set up with one colorԴʹ + Illuminant(glm::vec3 position,glm::vec3 color, LightType lightType); - inline glm::vec3 position(); - glm::vec3 color(); + // set up with one colorƽйԴʹ + Illuminant(LightType lightType,glm::vec3 direction, glm::vec3 color); - void setPosition(glm::vec3 position); + // set up with one color۹ƹԴʹ + Illuminant(glm::vec3 position, glm::vec3 direction,glm::vec3 color, LightType lightType); + + //set up by assign all colors + Illuminant(glm::vec3 position, glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular, LightType lightType); + + // УǵԴӦӿõԴĿʱûʵ֣ϲп + // Σ˺Ϊɫ + ~Illuminant(); + void setAttenuation(float constant, float linear, float quadratic); + + glm::vec3 direction(); + glm::vec3 position(); + glm::vec3 ambient(); + glm::vec3 diffuse(); + glm::vec3 specular(); + LightType type(); + + void move(glm::vec3 deltaPos); + void setPosition(glm::vec3 Pos); + // ƽйֵͲô + void setDirection(glm::vec3 direction); + + void setColor(glm::vec3 ambient, glm::vec3 diffuse, glm::vec3 specular); + // ʹĬϵķϵ void setColor(glm::vec3 color); + // ԴϢݸɫ + void updateLight(ShaderProgram& shader); + + + +private: + // ֻ趨ԴͣûбҪڼ޸ + void setType(LightType type); + + // ɾ + void switchOff(); }; -inline glm::vec3 Illuminant::position() { - return _position; -} -inline glm::vec3 Illuminant::color() { - return _color; -} \ No newline at end of file +// ʼб +void setAllLigntUniform(ShaderProgram& lightingShader); + +void init_queue(); \ No newline at end of file diff --git a/FinalProject/mesh.cpp b/FinalProject/mesh.cpp index 2bdffe8..bcd149e 100644 --- a/FinalProject/mesh.cpp +++ b/FinalProject/mesh.cpp @@ -22,6 +22,7 @@ Mesh::Mesh(const std::vector& vertices, const std::vector& text void Mesh::render(const ShaderProgram& shader) const { unsigned int diffuseNr = 1; unsigned int specularNr = 1; + shader.setUniform("material.shininess",_shininess); for (int i = 0; i < _textures.size(); i++) { OPENGL_EXTRA_FUNCTIONS->glActiveTexture(GL_TEXTURE0 + i); // activate proper texture unit before binding // retrieve texture number (the N in diffuse_textureN) diff --git a/FinalProject/mesh.h b/FinalProject/mesh.h index 574737a..014a206 100644 --- a/FinalProject/mesh.h +++ b/FinalProject/mesh.h @@ -14,7 +14,7 @@ private: std::vector _textures; // we can control shininess in mesh - float _shininess = 64.0f; + float _shininess = 32.0f; VertexArrayObject _vao = VertexArrayObject::empty(); diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index 5149f61..ef8448b 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -60,7 +60,7 @@ SceneViewer::~SceneViewer() { void SceneViewer::initializeGL() { initializeOpenGLFunctions(); - + glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); @@ -78,6 +78,12 @@ void SceneViewer::initializeGL() { vertexShader.dispose(); fragmentShader.dispose(); + // йճʼ + setAllLigntUniform(_shaderProgram); + init_queue(); + // ù + + Model* backpackModel = new Model("D:\\code\\ComputerGraphic\\backpack\\backpack.obj"); Logger::info("Model loaded"); Renderable backpack(backpackModel); @@ -190,16 +196,20 @@ void SceneViewer::wheelEvent(QWheelEvent* event) { void SceneViewer::update_light() { - // ڷ壬 - //model is in Illuminate - // view is from camera - // projection is from caller + + setAllLigntUniform(_shaderProgram); + for (int i = 0; i < _illuminants.size(); i++) { + _illuminants[i].updateLight(_shaderProgram); + } - - _shaderProgram.setUniform("lightPos",_illuminants[0].position()); - _shaderProgram.setUniform("lightColor", _illuminants[0].color()); - - _shaderProgram.setUniform("viewPos", _camera.position()); - // ҪɫviewPos - } + +void SceneViewer::addDirLight(glm::vec3 direction, glm::vec3 color) { + _illuminants.push_back(Illuminant(Illuminant::LightType::dir, direction,color)); +} +void SceneViewer::addPointLight(glm::vec3 position, glm::vec3 color) { + _illuminants.push_back(Illuminant(position, color, Illuminant::LightType::point)); +} +void SceneViewer::addSpotLight(glm::vec3 direction, glm::vec3 position, glm::vec3 color) { + _illuminants.push_back(Illuminant(position,direction, color, Illuminant::LightType::spot)); +} \ No newline at end of file diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index d42ad39..9f47fc4 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -45,6 +45,9 @@ public: SceneViewer(QWidget* parent = 0); ~SceneViewer(); void update_light(); + void addDirLight(glm::vec3 direction, glm::vec3 color); + void addPointLight(glm::vec3 position, glm::vec3 color); + void addSpotLight(glm::vec3 direction,glm::vec3 position, glm::vec3 color); protected: // OpenGL functions diff --git a/FinalProject/vertexshader.vs b/FinalProject/vertexshader.vs index 97c08db..056e569 100644 --- a/FinalProject/vertexshader.vs +++ b/FinalProject/vertexshader.vs @@ -15,7 +15,7 @@ void main() { FragPos = vec3(model * vec4(aPos, 1.0)); Normal = mat3(transpose(inverse(model))) * aNormal; - - TexCoords = aTexCoords; + TexCoords = aTexCoords; + gl_Position = projection * view * vec4(FragPos, 1.0); } \ No newline at end of file From f62b15eabde5dacacd421e6840675f6b6d344089 Mon Sep 17 00:00:00 2001 From: ayachi3 <1592757525@qq.com> Date: Sat, 17 Dec 2022 00:32:24 +0800 Subject: [PATCH 08/10] add interface in sceneviewer --- FinalProject/lightCaster.cpp | 20 ++++++++++++-------- FinalProject/lightCaster.h | 2 +- FinalProject/sceneviewer.cpp | 11 +++++++++-- FinalProject/sceneviewer.h | 2 ++ 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/FinalProject/lightCaster.cpp b/FinalProject/lightCaster.cpp index 836d0a4..8fddfa1 100644 --- a/FinalProject/lightCaster.cpp +++ b/FinalProject/lightCaster.cpp @@ -11,6 +11,7 @@ Illuminant::Illuminant(){ Illuminant::Illuminant(glm::vec3 position, LightType lightType){ _position = position; setType(lightType); + Logger::info("55555555555"); } // set up with one color Illuminant::Illuminant(glm::vec3 position, glm::vec3 color, LightType lightType){ @@ -19,6 +20,7 @@ Illuminant::Illuminant(glm::vec3 position, glm::vec3 color, LightType lightType) _diffuse = color * 0.8f; _specular = color; setType(lightType); + Logger::info("4444444444444444444"); } //set up by assign all colors Illuminant::Illuminant(glm::vec3 position, glm::vec3 ambient, @@ -28,7 +30,9 @@ Illuminant::Illuminant(glm::vec3 position, glm::vec3 ambient, _diffuse = diffuse; _specular = specular; setType(lightType); + Logger::info("333333333333333"); } + // set up with one colorƽйԴʹ Illuminant::Illuminant(LightType lightType, glm::vec3 direction, glm::vec3 color) { _direction = direction; @@ -36,6 +40,7 @@ Illuminant::Illuminant(LightType lightType, glm::vec3 direction, glm::vec3 color _diffuse = color * 0.8f; _specular = color; setType(lightType); + Logger::info("22222222222222222"); } // set up with one color۹ƹԴʹ @@ -46,6 +51,7 @@ Illuminant::Illuminant(glm::vec3 position, glm::vec3 direction, glm::vec3 color, _diffuse = color * 0.8f; _specular = color; setType(lightType); + Logger::info("1111111111111111111"); } Illuminant::~Illuminant() { @@ -119,6 +125,7 @@ void Illuminant::setType(LightType type){ } void Illuminant::updateLight(ShaderProgram& shader) { + lastShader = &shader; if (_lightType == dir) { // directional light shader.setUniform("dirLight.direction", _direction); @@ -170,17 +177,14 @@ void init_queue() { Logger::info("23533423q543"); } } -double r = 1; -// ʼб +// uniformûбãֲܻԤ֪ĺ void setAllLigntUniform(ShaderProgram& shader) { - r = r + 1; - double rr = sin(r / 20)*8; - shader.setUniform("dirLight.direction",0,1,0); - shader.setUniform("dirLight.ambient", 0.0f, 0.0f, 0.0f); - shader.setUniform("dirLight.diffuse", 0.0f, 100.0f, 220.0f); - shader.setUniform("dirLight.specular", 00.0f, 0.0f, 0.0f); + shader.setUniform("dirLight.direction",0,0,-1); + shader.setUniform("dirLight.ambient", 0.1f, 0.1f, 0.1f); + shader.setUniform("dirLight.diffuse", 0.0f, 0.0f, 0.0f); + shader.setUniform("dirLight.specular", 0.0f, 0.0f, 0.0f); // point light 1 shader.setUniform("pointLights[0].position", 0, 0, 0); diff --git a/FinalProject/lightCaster.h b/FinalProject/lightCaster.h index 986becf..5a53e4a 100644 --- a/FinalProject/lightCaster.h +++ b/FinalProject/lightCaster.h @@ -16,7 +16,7 @@ public: private: LightType _lightType = dir; - glm::vec3 _direction = glm::vec3(0,2,-1); + glm::vec3 _direction = glm::vec3(0,0,-1); glm::vec3 _position = glm::vec3(0.0f); glm::vec3 _ambient = glm::vec3(0.05f, 0.05f, 0.05f); glm::vec3 _diffuse = glm::vec3(0.8f, 0.8f, 0.8f); diff --git a/FinalProject/sceneviewer.cpp b/FinalProject/sceneviewer.cpp index ef8448b..bb039bf 100644 --- a/FinalProject/sceneviewer.cpp +++ b/FinalProject/sceneviewer.cpp @@ -21,7 +21,6 @@ void copyFile(std::string name) { SceneViewer::SceneViewer(QWidget* parent) : QOpenGLWidget(parent) { - _illuminants.push_back(Illuminant()); QSurfaceFormat format; format.setProfile(QSurfaceFormat::CoreProfile); format.setVersion(4, 3); @@ -82,7 +81,12 @@ void SceneViewer::initializeGL() { setAllLigntUniform(_shaderProgram); init_queue(); // ù - + addDirLight(glm::vec3(0.3, 0.5, -1), glm::vec3(0.2, 0.1, 0.2)); + addSpotLight(glm::vec3(0.3, 0.5, -1), glm::vec3(-0.3, -0.5, 3), glm::vec3(0.2, 1, 0.1)); + addPointLight(glm::vec3(0.5, 0.9, 0.4), glm::vec3(1, 0.2, 0.4)); + addPointLight(glm::vec3(-0.3, -0.9, 0.4), glm::vec3(0, 0.2, 0.9)); + //deleteLight(1); + Model* backpackModel = new Model("D:\\code\\ComputerGraphic\\backpack\\backpack.obj"); Logger::info("Model loaded"); @@ -212,4 +216,7 @@ void SceneViewer::addPointLight(glm::vec3 position, glm::vec3 color) { } void SceneViewer::addSpotLight(glm::vec3 direction, glm::vec3 position, glm::vec3 color) { _illuminants.push_back(Illuminant(position,direction, color, Illuminant::LightType::spot)); +} +void SceneViewer::deleteLight(int index) { + _illuminants.erase(_illuminants.begin() + index); } \ No newline at end of file diff --git a/FinalProject/sceneviewer.h b/FinalProject/sceneviewer.h index 9f47fc4..857e089 100644 --- a/FinalProject/sceneviewer.h +++ b/FinalProject/sceneviewer.h @@ -48,6 +48,8 @@ public: void addDirLight(glm::vec3 direction, glm::vec3 color); void addPointLight(glm::vec3 position, glm::vec3 color); void addSpotLight(glm::vec3 direction,glm::vec3 position, glm::vec3 color); + // ɾ± + void deleteLight(int index); protected: // OpenGL functions From 8c4eb6284b92670fe47d8e54c96be26f304694d5 Mon Sep 17 00:00:00 2001 From: Linloir <30849181+Linloir@users.noreply.github.com> Date: Sat, 17 Dec 2022 12:04:48 +0800 Subject: [PATCH 09/10] Update mesh.h --- FinalProject/mesh.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/FinalProject/mesh.h b/FinalProject/mesh.h index 014a206..86390ce 100644 --- a/FinalProject/mesh.h +++ b/FinalProject/mesh.h @@ -26,7 +26,8 @@ public: inline std::vector vertices() const { return _vertices; } inline std::vector indices() const { return _indices; } inline std::vector textures() const { return _textures; } - inline float shininess() { return _shininess; } + + inline float shininess() const { return _shininess; } inline void setShininess(float shininess) { _shininess = shininess; } inline VertexArrayObject vao() const { return _vao; } @@ -36,4 +37,4 @@ public: private: void setupMesh(); -}; \ No newline at end of file +}; From 468798b2e26661a4fcc1cf2fb820a56244890b2a Mon Sep 17 00:00:00 2001 From: Linloir <30849181+Linloir@users.noreply.github.com> Date: Sat, 17 Dec 2022 12:05:23 +0800 Subject: [PATCH 10/10] Update renderable.cpp --- FinalProject/renderable.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/FinalProject/renderable.cpp b/FinalProject/renderable.cpp index 45fccab..bc530b9 100644 --- a/FinalProject/renderable.cpp +++ b/FinalProject/renderable.cpp @@ -33,9 +33,6 @@ void Renderable::setScale(float scale) { void Renderable::render(ShaderProgram shader) { // Set model matrix shader.setUniform("model", modelMatrix()); - // set diffuse - //shader.setUniform("") - // Render _model->render(shader);