lighting without abstraction

This commit is contained in:
ayachi3 2022-12-15 18:43:04 +08:00
parent 8adf864c39
commit d181aefde7
4 changed files with 69 additions and 18 deletions

View File

@ -10,6 +10,7 @@ uniform sampler2D texture_specular1;
// above 2 uniform can caculate objectColor // above 2 uniform can caculate objectColor
uniform vec3 lightPos; uniform vec3 lightPos;
uniform vec3 viewPos;
uniform vec3 lightColor; uniform vec3 lightColor;
void main() void main()
@ -17,7 +18,7 @@ void main()
vec3 objectColor = texture(texture_specular1, TexCoords).rgb; vec3 objectColor = texture(texture_specular1, TexCoords).rgb;
objectColor = texture(texture_diffuse1, TexCoords).rgb; objectColor = texture(texture_diffuse1, TexCoords).rgb;
// ambient // ambient
float ambientStrength = 0; float ambientStrength = 0.3;
vec3 ambient = ambientStrength * lightColor; vec3 ambient = ambientStrength * lightColor;
// diffuse // diffuse
@ -26,6 +27,13 @@ void main()
float diff = max(dot(norm, lightDir), 0.0); float diff = max(dot(norm, lightDir), 0.0);
vec3 diffuse = diff * lightColor; 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); FragColor = vec4(result, 1.0);
} }

View File

@ -4,6 +4,7 @@
// 发光物不需要纹理所以说需要另外的shader // 发光物不需要纹理所以说需要另外的shader
// 在sceneviewer中被包含 // 在sceneviewer中被包含
class Illuminant { class Illuminant {
public: public:
Illuminant() {}; Illuminant() {};

View File

@ -14,6 +14,14 @@
using std::vector; 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) SceneViewer::SceneViewer(QWidget* parent)
: QOpenGLWidget(parent) : QOpenGLWidget(parent)
{ {
@ -29,16 +37,24 @@ SceneViewer::SceneViewer(QWidget* parent)
} }
// Copy the shaders to the folder // Copy the shaders to the folder
if (QFile::exists("./temp/shaders/vertexshader.vs")) { //if (QFile::exists("./temp/shaders/vertexshader.vs")) {
QFile::remove("./temp/shaders/vertexshader.vs"); // QFile::remove("./temp/shaders/vertexshader.vs");
} //}
QFile::copy(":/shaders/vertexshader.vs", "./temp/shaders/vertexshader.vs"); //QFile::copy(":/shaders/vertexshader.vs", "./temp/shaders/vertexshader.vs");
QFile::setPermissions("./temp/shaders/vertexshader.vs", QFileDevice::ReadOwner | QFileDevice::WriteOwner); //QFile::setPermissions("./temp/shaders/vertexshader.vs", QFileDevice::ReadOwner | QFileDevice::WriteOwner);
if (QFile::exists("./temp/shaders/fragmentshader.fs")) { //
QFile::remove("./temp/shaders/fragmentshader.fs"); //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); //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() { SceneViewer::~SceneViewer() {
@ -52,7 +68,7 @@ void SceneViewer::initializeGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_TEST);
glEnable(GL_FRAMEBUFFER_SRGB);
Logger::info("Currently running on OpenGL version: " + std::string((const char*)glGetString(GL_VERSION))); Logger::info("Currently running on OpenGL version: " + std::string((const char*)glGetString(GL_VERSION)));
_shaderProgram.ensureInitialized(); _shaderProgram.ensureInitialized();
@ -65,7 +81,7 @@ void SceneViewer::initializeGL() {
vertexShader.dispose(); vertexShader.dispose();
fragmentShader.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"); Logger::info("Model loaded");
Renderable backpack(backpackModel); Renderable backpack(backpackModel);
_objects.push_back(backpack); _objects.push_back(backpack);
@ -175,9 +191,35 @@ void SceneViewer::wheelEvent(QWheelEvent* event) {
update(); update();
} }
double rr = 1.0;
void SceneViewer::update_light() { 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("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();
} }

View File

@ -23,7 +23,7 @@ private:
// List of objects currently in the scene // List of objects currently in the scene
std::vector<Renderable> _objects; std::vector<Renderable> _objects;
// List of light casters in the scene // List of light casters in the scene
std::vector<LightCaster> _casters; std::vector<Illuminant> _illuminants;
// Shader program for objects // Shader program for objects
ShaderProgram _shaderProgram = ShaderProgram::empty(); ShaderProgram _shaderProgram = ShaderProgram::empty();
// Main camera // Main camera