mirror of
https://github.com/Linloir/SceneEditor.git
synced 2025-12-17 15:38:11 +08:00
lighting without abstraction
This commit is contained in:
parent
8adf864c39
commit
d181aefde7
@ -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);
|
||||
}
|
||||
@ -4,6 +4,7 @@
|
||||
// 发光物不需要纹理,所以说需要另外的shader
|
||||
// 在sceneviewer中被包含
|
||||
class Illuminant {
|
||||
|
||||
public:
|
||||
Illuminant() {};
|
||||
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ private:
|
||||
// List of objects currently in the scene
|
||||
std::vector<Renderable> _objects;
|
||||
// List of light casters in the scene
|
||||
std::vector<LightCaster> _casters;
|
||||
std::vector<Illuminant> _illuminants;
|
||||
// Shader program for objects
|
||||
ShaderProgram _shaderProgram = ShaderProgram::empty();
|
||||
// Main camera
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user