Try to get some simple lighting working
This commit is contained in:
parent
13e6b34243
commit
b4ad64d5c5
|
@ -2,18 +2,27 @@
|
||||||
|
|
||||||
in vec3 vs_position;
|
in vec3 vs_position;
|
||||||
in mat4 vs_transform;
|
in mat4 vs_transform;
|
||||||
in vec3 vs_color;
|
|
||||||
in vec2 vs_texcoord;
|
in vec2 vs_texcoord;
|
||||||
|
in vec3 vs_normal;
|
||||||
|
in vec3 vs_to_light;
|
||||||
|
|
||||||
uniform bool texture_is_set;
|
uniform bool texture_is_set;
|
||||||
uniform sampler2D vs_texture;
|
uniform sampler2D vs_texture;
|
||||||
|
uniform vec3 light_color;
|
||||||
|
|
||||||
out vec4 fs_color;
|
out vec4 fs_color;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
|
vec3 unit_normal = normalize(vs_normal);
|
||||||
|
vec3 unit_light_vector = normalize(vs_to_light);
|
||||||
|
|
||||||
|
float dot_prod = dot(unit_normal, unit_light_vector);
|
||||||
|
float brightness = max(dot_prod, 0.f);
|
||||||
|
vec3 diffuse = brightness * light_color;
|
||||||
|
|
||||||
if (texture_is_set) {
|
if (texture_is_set) {
|
||||||
fs_color = texture(vs_texture, vs_texcoord) * vec4(vs_color, 1.0);
|
fs_color = vec4(diffuse, 1.f) * texture(vs_texture, vs_texcoord);
|
||||||
} else {
|
} else {
|
||||||
fs_color = vec4(vs_color, 1.0);
|
fs_color = vec4(diffuse, 1.f);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,25 +1,31 @@
|
||||||
#version 440
|
#version 440
|
||||||
|
|
||||||
layout (location = 0) in vec3 vertex_position;
|
layout (location = 0) in vec3 vertex_position;
|
||||||
layout (location = 1) in vec3 vertex_color;
|
layout (location = 1) in vec2 vertex_texcoord;
|
||||||
layout (location = 2) in vec2 vertex_texcoord;
|
layout (location = 2) in vec3 vertex_normal;
|
||||||
|
|
||||||
out vec3 vs_position;
|
out vec3 vs_position;
|
||||||
out vec3 vs_color;
|
|
||||||
out vec2 vs_texcoord;
|
out vec2 vs_texcoord;
|
||||||
out mat4 vs_transform;
|
out mat4 vs_transform;
|
||||||
|
out vec3 vs_normal;
|
||||||
|
out vec3 vs_to_light;
|
||||||
|
|
||||||
uniform mat4 transform_matrix;
|
uniform mat4 transform_matrix;
|
||||||
uniform mat4 view_matrix;
|
uniform mat4 view_matrix;
|
||||||
uniform mat4 projection_matrix;
|
uniform mat4 projection_matrix;
|
||||||
|
uniform vec3 light_position;
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vs_position = vertex_position;
|
vec4 world_pos = (transform_matrix * vec4(vertex_position, 1.f));
|
||||||
|
|
||||||
|
vs_position = world_pos.xyz;
|
||||||
vs_transform = transform_matrix;
|
vs_transform = transform_matrix;
|
||||||
vs_color = vertex_color;
|
|
||||||
vs_texcoord = vertex_texcoord;
|
vs_texcoord = vertex_texcoord;
|
||||||
|
|
||||||
gl_Position = projection_matrix * view_matrix * transform_matrix * vec4(vertex_position, 1.0f);
|
gl_Position = projection_matrix * view_matrix * world_pos;
|
||||||
|
|
||||||
|
vs_normal = (transform_matrix * vec4(vertex_normal, 0.f)).xyz;
|
||||||
|
vs_to_light = light_position - world_pos.xyz;
|
||||||
|
|
||||||
/* vs_position = vec4(transform_matrix * vec4(vertex_position, 1.f)).xyz;
|
/* vs_position = vec4(transform_matrix * vec4(vertex_position, 1.f)).xyz;
|
||||||
vs_transform = transform_matrix;
|
vs_transform = transform_matrix;
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#include "simpleengine/camera.h"
|
#include "simpleengine/camera.h"
|
||||||
|
#include "simpleengine/gfx/light.h"
|
||||||
#include "simpleengine/gfx/model.h"
|
#include "simpleengine/gfx/model.h"
|
||||||
#include "simpleengine/gfx/texture.h"
|
#include "simpleengine/gfx/texture.h"
|
||||||
#include "simpleengine/vector.h"
|
#include "simpleengine/vector.h"
|
||||||
#include <glm/ext/matrix_clip_space.hpp>
|
#include <glm/ext/matrix_clip_space.hpp>
|
||||||
|
#include <glm/fwd.hpp>
|
||||||
#include <simpleengine/gfx/shader.h>
|
#include <simpleengine/gfx/shader.h>
|
||||||
#include <simpleengine/renderable.h>
|
#include <simpleengine/renderable.h>
|
||||||
#include <simpleengine/event/event.h>
|
#include <simpleengine/event/event.h>
|
||||||
|
@ -45,11 +47,19 @@ int main(int argc, char *argv[]) {
|
||||||
/* simpleengine::gfx::Texture wall_texture("resources/wall.jpg");
|
/* simpleengine::gfx::Texture wall_texture("resources/wall.jpg");
|
||||||
simpleengine::gfx::Texture crate_texture("resources/container.jpg", true, true); */
|
simpleengine::gfx::Texture crate_texture("resources/container.jpg", true, true); */
|
||||||
|
|
||||||
simpleengine::gfx::Texture stall_texture("resources/stallTexture.png");
|
|
||||||
|
|
||||||
|
auto light = std::make_shared<simpleengine::gfx::Light>(core_shader, glm::vec3(0.f, 0.f, -20.f), glm::vec3(1.f, 1.f, 1.f));
|
||||||
|
game.add_event(light);
|
||||||
|
|
||||||
|
simpleengine::gfx::Texture white_texture("resources/white_texture.jpg");
|
||||||
|
auto dragon = std::make_shared<simpleengine::objects_3d::ObjModel>(game.get_window(), core_shader, white_texture, "resources/dragon.obj");
|
||||||
|
dragon->translate(0.f, -5.f, -25.f);
|
||||||
|
game.add_event(dragon);
|
||||||
|
|
||||||
|
/* simpleengine::gfx::Texture stall_texture("resources/stallTexture.png");
|
||||||
auto stall = std::make_shared<simpleengine::objects_3d::ObjModel>(game.get_window(), core_shader, stall_texture, "resources/stall.obj");
|
auto stall = std::make_shared<simpleengine::objects_3d::ObjModel>(game.get_window(), core_shader, stall_texture, "resources/stall.obj");
|
||||||
stall->translate(0.f, -4.f, -18.f);
|
stall->translate(0.f, -4.f, -25.f);
|
||||||
game.add_event(stall);
|
game.add_event(stall); */
|
||||||
|
|
||||||
/* std::vector<simpleengine::Vertex> square_vertices = {
|
/* std::vector<simpleengine::Vertex> square_vertices = {
|
||||||
{ simpleengine::Vectorf(0.5f, 0.5f, -1.f), glm::vec3(1.f, 0.f, 0.f), glm::vec2(0.f, 0.f) }, // top right
|
{ simpleengine::Vectorf(0.5f, 0.5f, -1.f), glm::vec3(1.f, 0.f, 0.f), glm::vec2(0.f, 0.f) }, // top right
|
||||||
|
@ -129,7 +139,7 @@ int main(int argc, char *argv[]) {
|
||||||
auto cube = std::make_shared<simpleengine::gfx::Model>(game.get_window(), core_shader, cube_vertices, cube_indicies);
|
auto cube = std::make_shared<simpleengine::gfx::Model>(game.get_window(), core_shader, cube_vertices, cube_indicies);
|
||||||
game.add_event(cube); */
|
game.add_event(cube); */
|
||||||
|
|
||||||
auto camera = std::make_shared<simpleengine::Camera>(game.get_window(), core_shader);
|
auto camera = std::make_shared<simpleengine::Camera>(game.get_window(), core_shader, 70, glm::vec3(0, 0, -10));
|
||||||
game.add_event(camera);
|
game.add_event(camera);
|
||||||
|
|
||||||
return game.run();
|
return game.run();
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "shader.h"
|
||||||
|
#include "../renderable.h"
|
||||||
|
|
||||||
|
#include <glm/glm.hpp>
|
||||||
|
|
||||||
|
namespace simpleengine::gfx {
|
||||||
|
class Light : public simpleengine::Renderable {
|
||||||
|
public:
|
||||||
|
gfx::Shader shader;
|
||||||
|
glm::vec3 position;
|
||||||
|
glm::vec3 color;
|
||||||
|
|
||||||
|
Light(gfx::Shader shader, glm::vec3 position, glm::vec3 color) : shader(shader), position(position), color(color) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void update(const float& delta_time) override {
|
||||||
|
shader.use();
|
||||||
|
shader.set_uniform_float_vec3("light_position", position, false);
|
||||||
|
shader.set_uniform_float_vec3("light_color", color, false);
|
||||||
|
shader.unuse();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void render(GLFWwindow* target) override {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -22,7 +22,15 @@ namespace simpleengine::objects_3d {
|
||||||
std::vector<std::string> split_string(std::string str, const char delim);
|
std::vector<std::string> split_string(std::string str, const char delim);
|
||||||
static void process_vertex(const std::vector<std::string>& vertex_data, std::vector<GLuint>& indicies, const std::vector<glm::vec2>& in_textures,
|
static void process_vertex(const std::vector<std::string>& vertex_data, std::vector<GLuint>& indicies, const std::vector<glm::vec2>& in_textures,
|
||||||
const std::vector<glm::vec3>& in_normals, std::vector<glm::vec2>& out_textures, std::vector<glm::vec3>& out_normals);
|
const std::vector<glm::vec3>& in_normals, std::vector<glm::vec2>& out_textures, std::vector<glm::vec3>& out_normals);
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief This is replaced with `lit_vertices`!!!!
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
using simpleengine::gfx::Model::vertices;
|
||||||
public:
|
public:
|
||||||
|
std::vector<LitVertex> lit_vertices;
|
||||||
|
|
||||||
ObjModel(GLFWwindow *window, gfx::Shader shader, gfx::Texture texture, std::string filename);
|
ObjModel(GLFWwindow *window, gfx::Shader shader, gfx::Texture texture, std::string filename);
|
||||||
ObjModel(GLFWwindow *window, gfx::Shader shader, gfx::Texture texture, std::ifstream file_stream);
|
ObjModel(GLFWwindow *window, gfx::Shader shader, gfx::Texture texture, std::ifstream file_stream);
|
||||||
|
|
||||||
|
|
|
@ -93,7 +93,7 @@ namespace simpleengine {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void scale(float scalar) {
|
virtual void scale(float scalar) {
|
||||||
transform_matrix = scalar * transform_matrix;
|
transform_matrix = glm::scale(transform_matrix, glm::vec3(scalar, scalar, scalar));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -11,6 +11,8 @@ namespace simpleengine {
|
||||||
private:
|
private:
|
||||||
glm::vec<3, VectorType, glm::defaultp> inner_vec;
|
glm::vec<3, VectorType, glm::defaultp> inner_vec;
|
||||||
public:
|
public:
|
||||||
|
Vector() = default;
|
||||||
|
|
||||||
Vector(VectorType x, VectorType y, VectorType z) : inner_vec(x, y, z) {
|
Vector(VectorType x, VectorType y, VectorType z) : inner_vec(x, y, z) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <functional>
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
|
@ -15,13 +16,33 @@
|
||||||
namespace simpleengine {
|
namespace simpleengine {
|
||||||
class Vertex {
|
class Vertex {
|
||||||
public:
|
public:
|
||||||
//glm::vec3 position;
|
|
||||||
simpleengine::Vectorf position;
|
simpleengine::Vectorf position;
|
||||||
glm::vec3 color;
|
glm::vec3 color;
|
||||||
glm::vec2 tex_coord;
|
glm::vec2 tex_coord;
|
||||||
|
|
||||||
|
Vertex() = default;
|
||||||
|
|
||||||
Vertex(simpleengine::Vectorf position, glm::vec3 color, glm::vec2 tex_coord) : position(position), color(color), tex_coord(tex_coord) {
|
Vertex(simpleengine::Vectorf position, glm::vec3 color, glm::vec2 tex_coord) : position(position), color(color), tex_coord(tex_coord) {
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A `Vertex` that can be lit up.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
class LitVertex {
|
||||||
|
public:
|
||||||
|
simpleengine::Vectorf position;
|
||||||
|
glm::vec3 color;
|
||||||
|
glm::vec2 tex_coord;
|
||||||
|
glm::vec3 normal;
|
||||||
|
|
||||||
|
LitVertex() = default;
|
||||||
|
|
||||||
|
LitVertex(simpleengine::Vectorf position, glm::vec3 color, glm::vec2 tex_coord, glm::vec3 normal) :
|
||||||
|
position(position), color(color), tex_coord(tex_coord), normal(normal) {
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
|
@ -89,21 +89,17 @@ namespace simpleengine::objects_3d {
|
||||||
file_stream.close();
|
file_stream.close();
|
||||||
|
|
||||||
for (int i = 0; i < obj_vertices.size(); i++) {
|
for (int i = 0; i < obj_vertices.size(); i++) {
|
||||||
vertices.emplace_back(simpleengine::Vectorf(obj_vertices.at(i)), glm::vec3(1.f), textures.at(i));
|
lit_vertices.emplace_back(simpleengine::Vectorf(obj_vertices.at(i)), glm::vec3(1.f), textures.at(i), normals.at(i));
|
||||||
}
|
}
|
||||||
|
|
||||||
vao.bind();
|
vao.bind();
|
||||||
vbo.buffer(vertices.data(), 0, sizeof(Vertex) * vertices.size());
|
vbo.buffer(lit_vertices.data(), 0, sizeof(LitVertex) * lit_vertices.size());
|
||||||
ebo.buffer(indicies.data(), 0, indicies.size() * sizeof(GLuint));
|
ebo.buffer(indicies.data(), 0, indicies.size() * sizeof(GLuint));
|
||||||
|
|
||||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, position));
|
vao.enable_attrib(vbo, 0, 3, GL_FLOAT, sizeof(LitVertex), offsetof(LitVertex, position));
|
||||||
glEnableVertexAttribArray(0);
|
//vao.enable_attrib(vbo, 1, 3, GL_FLOAT, sizeof(LitVertex), offsetof(LitVertex, color));
|
||||||
|
vao.enable_attrib(vbo, 1, 2, GL_FLOAT, sizeof(LitVertex), offsetof(LitVertex, tex_coord));
|
||||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, color));
|
vao.enable_attrib(vbo, 2, 3, GL_FLOAT, sizeof(LitVertex), offsetof(LitVertex, normal));
|
||||||
glEnableVertexAttribArray(1);
|
|
||||||
|
|
||||||
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*)offsetof(Vertex, tex_coord));
|
|
||||||
glEnableVertexAttribArray(2);
|
|
||||||
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
|
Loading…
Reference in New Issue