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