Created a testing skybox and got the reflection and refraction working.
|
|
@ -1,8 +1,8 @@
|
||||||
{
|
{
|
||||||
"scene": {
|
"scene": {
|
||||||
"shader": {
|
"shader": {
|
||||||
"vertex_path": "shaders/21-framebuffers.vert.glsl",
|
"vertex_path": "shaders/24-vert.glsl",
|
||||||
"frag_path": "shaders/21-framebuffers.frag.glsl"
|
"frag_path": "shaders/24-frag.glsl"
|
||||||
},
|
},
|
||||||
"screen_shader": {
|
"screen_shader": {
|
||||||
"vertex_path": "shaders/21-screen.vert.glsl",
|
"vertex_path": "shaders/21-screen.vert.glsl",
|
||||||
|
|
@ -13,12 +13,12 @@
|
||||||
"frag_path": "shaders/24-skybox.frag.glsl"
|
"frag_path": "shaders/24-skybox.frag.glsl"
|
||||||
},
|
},
|
||||||
"skybox_faces": [
|
"skybox_faces": [
|
||||||
"../assets/skybox/right.jpg",
|
"../assets/skybox/sky/right.jpg",
|
||||||
"../assets/skybox/left.jpg",
|
"../assets/skybox/sky/left.jpg",
|
||||||
"../assets/skybox/top.jpg",
|
"../assets/skybox/sky/top.jpg",
|
||||||
"../assets/skybox/bottom.jpg",
|
"../assets/skybox/sky/bottom.jpg",
|
||||||
"../assets/skybox/front.jpg",
|
"../assets/skybox/sky/front.jpg",
|
||||||
"../assets/skybox/back.jpg"
|
"../assets/skybox/sky/back.jpg"
|
||||||
],
|
],
|
||||||
"materials": {
|
"materials": {
|
||||||
"default": {
|
"default": {
|
||||||
|
|
@ -53,22 +53,10 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"things": [
|
"things": [
|
||||||
{"model": "marble_cube", "position": [-1.0, 0.0, -1.0],
|
|
||||||
"rotation": {"angle": 0.0, "axes": [1.0, 1.0, 1.0]},
|
|
||||||
"scale": 1.0,
|
|
||||||
"material": "default"},
|
|
||||||
{"model": "marble_cube", "position": [1.5, 0.0, -1.0],
|
{"model": "marble_cube", "position": [1.5, 0.0, -1.0],
|
||||||
"rotation": {"angle": 0.0, "axes": [1.0, 1.0, 1.0]},
|
"rotation": {"angle": 0.0, "axes": [1.0, 1.0, 1.0]},
|
||||||
"scale": 2.0,
|
"scale": 2.0,
|
||||||
"material": "default"},
|
"material": "default"},
|
||||||
{"model": "metal_floor", "position": [0.0, 0.0, 0.0],
|
|
||||||
"rotation": {"angle": 0.0, "axes": [1.0, 1.0, 1.0]},
|
|
||||||
"scale": 1.0,
|
|
||||||
"material": "shiny"},
|
|
||||||
{"model": "grass", "position": [0.5, 0.13, 0.0],
|
|
||||||
"rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]},
|
|
||||||
"scale": 1.0,
|
|
||||||
"material": "default"},
|
|
||||||
{"model": "window", "position": [1.5, 0.25, 0.0],
|
{"model": "window", "position": [1.5, 0.25, 0.0],
|
||||||
"rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]},
|
"rotation": {"angle": 90.0, "axes": [1.0,0.0,0.0]},
|
||||||
"scale": 1.0,
|
"scale": 1.0,
|
||||||
|
|
|
||||||
17
24-cubemaps/shaders/24-frag.glsl
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
#version 330 core
|
||||||
|
out vec4 FragColor;
|
||||||
|
|
||||||
|
in vec3 Normal;
|
||||||
|
in vec3 FragPos;
|
||||||
|
in vec2 TexCoords;
|
||||||
|
|
||||||
|
uniform vec3 cameraPos;
|
||||||
|
uniform samplerCube skybox;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float ratio = 1.0/1.52;
|
||||||
|
vec3 I = normalize(FragPos - cameraPos);
|
||||||
|
vec3 R = refract(I, normalize(Normal), ratio);
|
||||||
|
FragColor = vec4(texture(skybox, R).rgb, 1.0);
|
||||||
|
}
|
||||||
21
24-cubemaps/shaders/24-vert.glsl
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
#version 330 core
|
||||||
|
layout (location = 0) in vec3 aPos;
|
||||||
|
layout (location = 1) in vec3 aNormal;
|
||||||
|
layout (location = 2) in vec2 aTexCoords;
|
||||||
|
|
||||||
|
out vec3 FragPos;
|
||||||
|
out vec3 Normal;
|
||||||
|
out vec2 TexCoords;
|
||||||
|
out vec3 Position;
|
||||||
|
|
||||||
|
uniform mat4 model;
|
||||||
|
uniform mat4 view;
|
||||||
|
uniform mat4 projection;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
Normal = mat3(transpose(inverse(model))) * aNormal;
|
||||||
|
FragPos = vec3(model * vec4(aPos, 1.0));
|
||||||
|
gl_Position = projection * view * vec4(FragPos, 1.0);
|
||||||
|
TexCoords = aTexCoords;
|
||||||
|
}
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
#include "mesh.hpp"
|
#include "mesh.hpp"
|
||||||
#include "dbc.hpp"
|
#include "dbc.hpp"
|
||||||
|
|
||||||
void Mesh::draw(Shader &shader) {
|
void Mesh::draw(Shader &shader, bool with_textures) {
|
||||||
// CAN WE DO THIS LESS OFTEN OUTSIDE DRAWING?
|
if(with_textures) {
|
||||||
apply_textures(shader);
|
apply_textures(shader);
|
||||||
|
}
|
||||||
|
|
||||||
glBindVertexArray(VAO);
|
glBindVertexArray(VAO);
|
||||||
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
|
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ struct Mesh {
|
||||||
setup_mesh();
|
setup_mesh();
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw(Shader &shader);
|
void draw(Shader &shader, bool with_textures);
|
||||||
void setup_mesh();
|
void setup_mesh();
|
||||||
void apply_textures(const Shader& shader);
|
void apply_textures(const Shader& shader);
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -83,9 +83,9 @@ unsigned int texture_from_file(const std::string& directory, const std::string&
|
||||||
return textureID;
|
return textureID;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Model::draw(Shader &shader) {
|
void Model::draw(Shader &shader, bool with_textures) {
|
||||||
for(auto& mesh : meshes) {
|
for(auto& mesh : meshes) {
|
||||||
mesh.draw(shader);
|
mesh.draw(shader, with_textures);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ struct Model {
|
||||||
load_model();
|
load_model();
|
||||||
}
|
}
|
||||||
|
|
||||||
void draw(Shader &shader);
|
void draw(Shader &shader, bool with_textures=true);
|
||||||
|
|
||||||
void load_model();
|
void load_model();
|
||||||
void process_node(const aiScene *scene, aiNode *node);
|
void process_node(const aiScene *scene, aiNode *node);
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ void Scene::draw_thing(Shader& with_shader, Thing& thing)
|
||||||
|
|
||||||
with_shader.setMat4("model", model);
|
with_shader.setMat4("model", model);
|
||||||
|
|
||||||
thing.model.draw(with_shader);
|
thing.model.draw(with_shader, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scene::render(GLFWwindow* window) {
|
void Scene::render(GLFWwindow* window) {
|
||||||
|
|
@ -47,6 +47,7 @@ void Scene::render(GLFWwindow* window) {
|
||||||
shader.use();
|
shader.use();
|
||||||
shader.setMat4("view", view);
|
shader.setMat4("view", view);
|
||||||
shader.setMat4("projection", projection);
|
shader.setMat4("projection", projection);
|
||||||
|
shader.setVec3("cameraPos", camera.position);
|
||||||
|
|
||||||
for(auto& thing : things) {
|
for(auto& thing : things) {
|
||||||
draw_thing(shader, thing);
|
draw_thing(shader, thing);
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 723 KiB After Width: | Height: | Size: 723 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 274 KiB |
|
Before Width: | Height: | Size: 462 KiB After Width: | Height: | Size: 462 KiB |
|
Before Width: | Height: | Size: 588 KiB After Width: | Height: | Size: 588 KiB |
|
Before Width: | Height: | Size: 525 KiB After Width: | Height: | Size: 525 KiB |
|
Before Width: | Height: | Size: 338 KiB After Width: | Height: | Size: 338 KiB |
BIN
assets/skybox/test/back.jpg
Normal file
|
After Width: | Height: | Size: 108 KiB |
BIN
assets/skybox/test/bottom.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
assets/skybox/test/front.jpg
Normal file
|
After Width: | Height: | Size: 97 KiB |
BIN
assets/skybox/test/left.jpg
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
assets/skybox/test/right.jpg
Normal file
|
After Width: | Height: | Size: 116 KiB |
BIN
assets/skybox/test/top.jpg
Normal file
|
After Width: | Height: | Size: 95 KiB |