Add reflection mapping
This commit is contained in:
parent
8fc773e0f8
commit
5518d8e7ee
|
@ -10,6 +10,7 @@ in layout(location = 5) vec3 bitangent;
|
||||||
layout(binding = 0) uniform sampler2D diffuseTexture;
|
layout(binding = 0) uniform sampler2D diffuseTexture;
|
||||||
layout(binding = 1) uniform sampler2D normalTexture;
|
layout(binding = 1) uniform sampler2D normalTexture;
|
||||||
layout(binding = 2) uniform sampler2D displacementTexture;
|
layout(binding = 2) uniform sampler2D displacementTexture;
|
||||||
|
layout(binding = 3) uniform sampler2D reflectionTexture;
|
||||||
uniform float displacementCoefficient;
|
uniform float displacementCoefficient;
|
||||||
|
|
||||||
uniform mat4 MVP;
|
uniform mat4 MVP;
|
||||||
|
@ -19,6 +20,7 @@ uniform mat4 MVnormal;
|
||||||
// material
|
// material
|
||||||
uniform float opacity;
|
uniform float opacity;
|
||||||
uniform float shininess;
|
uniform float shininess;
|
||||||
|
uniform float reflexiveness;
|
||||||
uniform vec3 diffuse_color;
|
uniform vec3 diffuse_color;
|
||||||
uniform vec3 specular_color;
|
uniform vec3 specular_color;
|
||||||
uniform vec3 emissive_color;
|
uniform vec3 emissive_color;
|
||||||
|
@ -28,6 +30,7 @@ uniform bool isTextured;
|
||||||
uniform bool isVertexColored;
|
uniform bool isVertexColored;
|
||||||
uniform bool isNormalMapped;
|
uniform bool isNormalMapped;
|
||||||
uniform bool isDisplacementMapped;
|
uniform bool isDisplacementMapped;
|
||||||
|
uniform bool isReflectionMapped;
|
||||||
uniform bool isInverted;
|
uniform bool isInverted;
|
||||||
|
|
||||||
// lights
|
// lights
|
||||||
|
@ -48,6 +51,17 @@ uniform Light light[N_LIGHTS];
|
||||||
out vec4 color_out;
|
out vec4 color_out;
|
||||||
|
|
||||||
|
|
||||||
|
vec3 reflection(vec3 basecolor, vec3 nnormal) {
|
||||||
|
vec3 up = normalize(vec3(MVnormal * vec4(vec3(0.0, 0.0, 1.0), 1.0)));
|
||||||
|
vec3 north = normalize(vec3(MVnormal * vec4(vec3(1.0, 0.0, 0.0), 1.0)));
|
||||||
|
float u = acos(dot(reflect(normalize(vertex), nnormal), north)) / -3.141592;
|
||||||
|
float v = acos(dot(reflect(normalize(vertex), nnormal), up )) / -3.141592;
|
||||||
|
vec3 reflection = texture(reflectionTexture, vec2(u, v)).rgb;
|
||||||
|
return (reflexiveness < 0)
|
||||||
|
? basecolor * mix(vec3(0.0), reflection, -reflexiveness)
|
||||||
|
: mix(basecolor, reflection, reflexiveness);
|
||||||
|
}
|
||||||
|
|
||||||
vec3 phong(vec3 basecolor) {
|
vec3 phong(vec3 basecolor) {
|
||||||
vec3 nnormal; // normalized normal
|
vec3 nnormal; // normalized normal
|
||||||
if (isNormalMapped) {
|
if (isNormalMapped) {
|
||||||
|
@ -117,6 +131,10 @@ vec3 phong(vec3 basecolor) {
|
||||||
}
|
}
|
||||||
|
|
||||||
basecolor *= (emissive_color + diffuse_component);
|
basecolor *= (emissive_color + diffuse_component);
|
||||||
|
|
||||||
|
if (isReflectionMapped)
|
||||||
|
basecolor = reflection(basecolor, nnormal);
|
||||||
|
|
||||||
return basecolor + specular_component;
|
return basecolor + specular_component;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,7 +144,11 @@ void main() {
|
||||||
if (isTextured) c *= texture(diffuseTexture, UV);
|
if (isTextured) c *= texture(diffuseTexture, UV);
|
||||||
if (isInverted) c.rgb = 1 - c.rgb;
|
if (isInverted) c.rgb = 1 - c.rgb;
|
||||||
if (isIlluminated) c.rgb = phong(c.rgb);
|
if (isIlluminated) c.rgb = phong(c.rgb);
|
||||||
else c.rgb *= diffuse_color;
|
else{
|
||||||
|
c.rgb *= diffuse_color;
|
||||||
|
if (isReflectionMapped)
|
||||||
|
c.rgb = reflection(c.rgb, normalize(normal));
|
||||||
|
}
|
||||||
//c.rgb = diffuse_color;
|
//c.rgb = diffuse_color;
|
||||||
//c.rgb = emissive_color;
|
//c.rgb = emissive_color;
|
||||||
//c.rgb = specular_color;
|
//c.rgb = specular_color;
|
||||||
|
|
|
@ -10,6 +10,7 @@ in layout(location = 5) vec3 bitangent;
|
||||||
layout(binding = 0) uniform sampler2D diffuseTexture;
|
layout(binding = 0) uniform sampler2D diffuseTexture;
|
||||||
layout(binding = 1) uniform sampler2D normalTexture;
|
layout(binding = 1) uniform sampler2D normalTexture;
|
||||||
layout(binding = 2) uniform sampler2D displacementTexture;
|
layout(binding = 2) uniform sampler2D displacementTexture;
|
||||||
|
layout(binding = 3) uniform sampler2D reflectionTexture;
|
||||||
uniform float displacementCoefficient;
|
uniform float displacementCoefficient;
|
||||||
|
|
||||||
uniform mat4 MVP;
|
uniform mat4 MVP;
|
||||||
|
|
|
@ -72,6 +72,8 @@ PNGImage t_cobble_diff = loadPNGFile("../res/textures/cobble_diff.png");
|
||||||
PNGImage t_cobble_normal = loadPNGFile("../res/textures/cobble_normal.png");
|
PNGImage t_cobble_normal = loadPNGFile("../res/textures/cobble_normal.png");
|
||||||
PNGImage t_plain_diff = loadPNGFile("../res/textures/plain_diff.png");
|
PNGImage t_plain_diff = loadPNGFile("../res/textures/plain_diff.png");
|
||||||
PNGImage t_plain_normal = loadPNGFile("../res/textures/plain_normal.png", true);
|
PNGImage t_plain_normal = loadPNGFile("../res/textures/plain_normal.png", true);
|
||||||
|
PNGImage t_reflection = loadPNGFile("../res/textures/reflection_field.png");
|
||||||
|
PNGImage t_reflection2 = loadPNGFile("../res/textures/reflection_blurry.png");
|
||||||
PNGImage t_perlin = makePerlinNoisePNG(256, 256, 0.05/16);
|
PNGImage t_perlin = makePerlinNoisePNG(256, 256, 0.05/16);
|
||||||
|
|
||||||
|
|
||||||
|
@ -363,6 +365,7 @@ void renderNode(SceneNode* node, Gloom::Shader* parent_shader = default_shader)
|
||||||
if (node->isTextured) glBindTextureUnit(0, node->diffuseTextureID);
|
if (node->isTextured) glBindTextureUnit(0, node->diffuseTextureID);
|
||||||
if (node->isNormalMapped) glBindTextureUnit(1, node->normalTextureID);
|
if (node->isNormalMapped) glBindTextureUnit(1, node->normalTextureID);
|
||||||
if (node->isDisplacementMapped) glBindTextureUnit(2, node->displacementTextureID);
|
if (node->isDisplacementMapped) glBindTextureUnit(2, node->displacementTextureID);
|
||||||
|
if (node->isReflectionMapped) glBindTextureUnit(3, node->reflectionTextureID);
|
||||||
glBindVertexArray(node->vertexArrayObjectID);
|
glBindVertexArray(node->vertexArrayObjectID);
|
||||||
glDrawElements(GL_TRIANGLES, node->VAOIndexCount, GL_UNSIGNED_INT, nullptr);
|
glDrawElements(GL_TRIANGLES, node->VAOIndexCount, GL_UNSIGNED_INT, nullptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -57,6 +57,7 @@ struct SceneNode {
|
||||||
isTextured = false;
|
isTextured = false;
|
||||||
isNormalMapped = false;
|
isNormalMapped = false;
|
||||||
isDisplacementMapped = false;
|
isDisplacementMapped = false;
|
||||||
|
isReflectionMapped = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (diffuse) {
|
if (diffuse) {
|
||||||
|
@ -79,8 +80,16 @@ struct SceneNode {
|
||||||
displacementTextureID = cache[displacement];
|
displacementTextureID = cache[displacement];
|
||||||
isDisplacementMapped = true;
|
isDisplacementMapped = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (reflection) {
|
||||||
|
if (cache.find(reflection) == cache.end())
|
||||||
|
cache[reflection] = generateTexture(*reflection);
|
||||||
|
reflectionTextureID = cache[reflection];
|
||||||
|
isReflectionMapped = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void setMaterial(const Material& mat, bool recursive=false) {
|
void setMaterial(const Material& mat, bool recursive=false) {
|
||||||
|
reflexiveness = mat.reflexiveness;
|
||||||
if (!mat.ignore_diffuse) diffuse_color = mat.diffuse_color;
|
if (!mat.ignore_diffuse) diffuse_color = mat.diffuse_color;
|
||||||
if (!mat.ignore_emissive) emissive_color = mat.emissive_color;
|
if (!mat.ignore_emissive) emissive_color = mat.emissive_color;
|
||||||
if (!mat.ignore_specular) specular_color = mat.specular_color;
|
if (!mat.ignore_specular) specular_color = mat.specular_color;
|
||||||
|
@ -121,6 +130,7 @@ struct SceneNode {
|
||||||
// textures and materials
|
// textures and materials
|
||||||
float opacity = 1.0;
|
float opacity = 1.0;
|
||||||
float shininess = 1.0; // specular power
|
float shininess = 1.0; // specular power
|
||||||
|
float reflexiveness = 0.0; // 0 is no reflection, 1 is a mirror. Negative value will have it multiply with base instead
|
||||||
vec3 diffuse_color = vec3(1.0);
|
vec3 diffuse_color = vec3(1.0);
|
||||||
vec3 emissive_color = vec3(0.5);
|
vec3 emissive_color = vec3(0.5);
|
||||||
vec3 specular_color = vec3(0.2);
|
vec3 specular_color = vec3(0.2);
|
||||||
|
@ -129,12 +139,14 @@ struct SceneNode {
|
||||||
uint normalTextureID;
|
uint normalTextureID;
|
||||||
uint displacementTextureID;
|
uint displacementTextureID;
|
||||||
float displacementCoefficient = 0.1; // in units
|
float displacementCoefficient = 0.1; // in units
|
||||||
|
uint reflectionTextureID;
|
||||||
|
|
||||||
// shader flags
|
// shader flags
|
||||||
bool isTextured = false;
|
bool isTextured = false;
|
||||||
bool isVertexColored = false;
|
bool isVertexColored = false;
|
||||||
bool isNormalMapped = false;
|
bool isNormalMapped = false;
|
||||||
bool isDisplacementMapped = false;
|
bool isDisplacementMapped = false;
|
||||||
|
bool isReflectionMapped = false;
|
||||||
bool isIlluminated = true;
|
bool isIlluminated = true;
|
||||||
bool isInverted = false;
|
bool isInverted = false;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue