Add support for rim backlights

This commit is contained in:
Peder Bergebakken Sundt 2019-03-28 09:35:22 +01:00
parent 86118a34f4
commit 74ffe23551
7 changed files with 43 additions and 11 deletions

View File

@ -20,10 +20,12 @@ uniform mat4 MVnormal;
// material // material
uniform float opacity; uniform float opacity;
uniform float shininess; uniform float shininess;
uniform float backlight_strength;
uniform float reflexiveness; 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;
uniform vec3 backlight_color;
uniform bool isIlluminated; uniform bool isIlluminated;
uniform bool isTextured; uniform bool isTextured;
@ -97,9 +99,7 @@ vec3 get_nnormal() {
} }
} }
vec3 phong(vec3 basecolor) { vec3 phong(vec3 basecolor, vec3 nnormal) {
vec3 nnormal = get_nnormal(); // normalized normal
vec3 diffuse_component = vec3(0.0); vec3 diffuse_component = vec3(0.0);
vec3 specular_component = vec3(0.0); vec3 specular_component = vec3(0.0);
@ -139,16 +139,19 @@ vec3 phong(vec3 basecolor) {
} }
void main() { void main() {
vec3 nnormal = get_nnormal(); // normalized normal
vec4 c = vec4(vec3(1.0), opacity); vec4 c = vec4(vec3(1.0), opacity);
if (isVertexColored) c *= color; if (isVertexColored) c *= color;
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, nnormal);
else { else {
c.rgb *= diffuse_color; c.rgb *= diffuse_color;
if (isReflectionMapped) if (isReflectionMapped)
c.rgb = reflection(c.rgb, normalize(normal)); c.rgb = reflection(c.rgb, normalize(normal));
} }
if (backlight_strength > 0.05)
c.rgb += backlight_color * clamp((dot(normalize(vertex), nnormal) + backlight_strength) / backlight_strength, 0, 1);
//c.rgb = diffuse_color; //c.rgb = diffuse_color;
//c.rgb = emissive_color; //c.rgb = emissive_color;
//c.rgb = specular_color; //c.rgb = specular_color;

View File

@ -190,8 +190,10 @@ void renderNode(SceneNode* node, Gloom::Shader* parent_shader, vector<NodeDistSh
u3fv (diffuse_color); u3fv (diffuse_color);
u3fv (emissive_color); u3fv (emissive_color);
u3fv (specular_color); u3fv (specular_color);
u3fv (backlight_color);
u1f (opacity); u1f (opacity);
u1f (shininess); u1f (shininess);
u1f (backlight_strength);
u1f (reflexiveness); u1f (reflexiveness);
u1f (displacementCoefficient); u1f (displacementCoefficient);
u1ui (isTextured); u1ui (isTextured);

View File

@ -114,6 +114,7 @@ void init_scene(CommandLineOptions options) {
//{12, Material().diffuse({1.0, 1.0, 1.0})},// License_Plate_Frame //{12, Material().diffuse({1.0, 1.0, 1.0})},// License_Plate_Frame
//{13, Material().diffuse({1.0, 1.0, 1.0})},// //{13, Material().diffuse({1.0, 1.0, 1.0})},//
}); });
carNode->setMaterial(Material().backlight(vec3(0.3), 0.3).backlight_only().no_texture_reset(), true);
carNode->position = {500, 500, 100}; carNode->position = {500, 500, 100};
carNode->scale *= 100; carNode->scale *= 100;
rootNode->children.push_back(carNode); rootNode->children.push_back(carNode);

View File

@ -66,6 +66,8 @@ void SceneNode::setMaterial(const Material& mat, bool recursive) {
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;
if (!mat.ignore_specular) shininess = mat.shininess; if (!mat.ignore_specular) shininess = mat.shininess;
if (!mat.ignore_backlight)backlight_color= mat.backlight_color;
if (!mat.ignore_backlight)backlight_strength= mat.backlight_strength;
setTexture( setTexture(
mat.diffuse_texture, mat.diffuse_texture,
mat.normal_texture, mat.normal_texture,

View File

@ -71,10 +71,12 @@ 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 backlight_strength = 0.0;
float reflexiveness = 0.0; // 0 is no reflection, 1 is a mirror. Negative value will have it multiply with base instead 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);
vec3 backlight_color = vec3(0.2);
vec2 uvOffset = vec2(0.0, 0.0); // specular power vec2 uvOffset = vec2(0.0, 0.0); // specular power
uint diffuseTextureID; uint diffuseTextureID;
uint normalTextureID; uint normalTextureID;

View File

@ -12,6 +12,7 @@ Material Material::apply(const Material& other) const {
if (!other.ignore_diffuse) out.ignore_diffuse = false; if (!other.ignore_diffuse) out.ignore_diffuse = false;
if (!other.ignore_emissive) out.ignore_emissive = false; if (!other.ignore_emissive) out.ignore_emissive = false;
if (!other.ignore_specular) out.ignore_specular = false; if (!other.ignore_specular) out.ignore_specular = false;
if (!other.ignore_backlight)out.ignore_backlight= false;
if (!other.texture_reset) out.texture_reset = true; if (!other.texture_reset) out.texture_reset = true;
if (other.texture_reset || other.diffuse_texture) out.diffuse_texture = other.diffuse_texture; if (other.texture_reset || other.diffuse_texture) out.diffuse_texture = other.diffuse_texture;
@ -40,6 +41,12 @@ Material Material::emissive(glm::vec3 color) const {
out.emissive_color = color; out.emissive_color = color;
return out; return out;
} }
Material Material::backlight(glm::vec3 color, float strength) const {
Material out(*this);
out.backlight_color = color;
out.backlight_strength = strength;
return out;
}
Material Material::textured(PNGImage* diffuse) const { Material Material::textured(PNGImage* diffuse) const {
Material out(*this); Material out(*this);
out.diffuse_texture = diffuse; out.diffuse_texture = diffuse;
@ -76,6 +83,7 @@ Material Material::no_colors() const {
out.ignore_diffuse = true; out.ignore_diffuse = true;
out.ignore_emissive = true; out.ignore_emissive = true;
out.ignore_specular = true; out.ignore_specular = true;
out.ignore_backlight = true;
return out; return out;
} }
Material Material::no_diffuse() const { Material Material::no_diffuse() const {
@ -93,12 +101,20 @@ Material Material::no_specular() const {
out.ignore_specular = true; out.ignore_specular = true;
return out; return out;
} }
Material Material::no_backlight() const {
Material out(*this);
out.ignore_backlight = true;
return out;
}
Material Material::diffuse_only() const { Material Material::diffuse_only() const {
return this->no_emissive().no_specular(); return this->no_emissive().no_specular().no_backlight();
} }
Material Material::emissive_only() const { Material Material::emissive_only() const {
return this->no_diffuse().no_specular(); return this->no_diffuse().no_specular().no_backlight();
} }
Material Material::specular_only() const { Material Material::specular_only() const {
return this->no_diffuse().no_emissive(); return this->no_diffuse().no_emissive().no_backlight();
}
Material Material::backlight_only() const {
return this->no_diffuse().no_emissive().no_specular();
} }

View File

@ -7,9 +7,11 @@ struct Material {
float opacity = 1.0; float opacity = 1.0;
float shininess = 1; // specular float shininess = 1; // specular
float reflexiveness = 0; float reflexiveness = 0;
float backlight_strength = 0;
glm::vec3 diffuse_color = glm::vec3(1.0); glm::vec3 diffuse_color = glm::vec3(1.0);
glm::vec3 emissive_color = glm::vec3(0.5); glm::vec3 emissive_color = glm::vec3(0.5);
glm::vec3 specular_color = glm::vec3(0.2); glm::vec3 specular_color = glm::vec3(0.2);
glm::vec3 backlight_color= glm::vec3(0.0);
PNGImage* diffuse_texture = nullptr; PNGImage* diffuse_texture = nullptr;
PNGImage* normal_texture = nullptr; PNGImage* normal_texture = nullptr;
PNGImage* displacement_texture = nullptr; PNGImage* displacement_texture = nullptr;
@ -18,6 +20,7 @@ struct Material {
bool ignore_diffuse = false; bool ignore_diffuse = false;
bool ignore_emissive = false; bool ignore_emissive = false;
bool ignore_specular = false; bool ignore_specular = false;
bool ignore_backlight= false;
bool texture_reset = true; bool texture_reset = true;
Material apply(const Material& other) const; Material apply(const Material& other) const;
@ -25,6 +28,7 @@ struct Material {
Material diffuse(glm::vec3 color) const; Material diffuse(glm::vec3 color) const;
Material specular(glm::vec3 color, float shininess) const; Material specular(glm::vec3 color, float shininess) const;
Material emissive(glm::vec3 color) const; Material emissive(glm::vec3 color) const;
Material backlight(glm::vec3 color, float strength) const;
Material textured(PNGImage* diffuse) const; Material textured(PNGImage* diffuse) const;
Material normal_mapped(PNGImage* normal) const; Material normal_mapped(PNGImage* normal) const;
Material diffuse_mapped(PNGImage* diffuse) const; Material diffuse_mapped(PNGImage* diffuse) const;
@ -37,7 +41,9 @@ struct Material {
Material no_diffuse() const; Material no_diffuse() const;
Material no_emissive() const; Material no_emissive() const;
Material no_specular() const; Material no_specular() const;
Material diffuse_only() const; // and not the other two Material no_backlight() const;
Material emissive_only() const; // and not the other two Material diffuse_only() const; // and not the other three
Material specular_only() const; // and not the other two Material emissive_only() const; // and not the other three
Material specular_only() const; // and not the other three
Material backlight_only() const; // and not the other three
}; };