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
|
// 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);
|
||||||
}
|
}
|
||||||
@ -4,6 +4,7 @@
|
|||||||
// 发光物不需要纹理,所以说需要另外的shader
|
// 发光物不需要纹理,所以说需要另外的shader
|
||||||
// 在sceneviewer中被包含
|
// 在sceneviewer中被包含
|
||||||
class Illuminant {
|
class Illuminant {
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Illuminant() {};
|
Illuminant() {};
|
||||||
|
|
||||||
|
|||||||
@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user