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);