TDT4230_final_project/report/delivery_part5.md

7.5 KiB

Appendix

The seqmented pane with the cobble texture and normal map and lighting applied to it.{#fig:img-base}

The plane from @fig:img-base with a perlin noise displacement map applied to it{#fig:img-perlin-displacement}

First rendering of the downloaded grass texture and normal map{#fig:img-wrong-handedness}

Rendering of the downloaded grass texture with flipped normal map handedness{#fig:img-flipped-handedness}

The field with grass texture, normal map and displacement map{#fig:img-fine-plane}

How a mirrored-on-repeat texture behaves{#fig:img-gl-mirror}

if (isDisplacementMapped) {
    float o = texture(displaceTex, UV).r * 2 - 1;
    float u = (texture(displaceTex, UV + vec2(0.0001, 0)).r*2-1 - o) / 0.0004; // magic numbers!
    float v = (texture(displaceTex, UV + vec2(0, 0.0001)).r*2-1 - o) / 0.0004; // magic numbers!
    TBN = mat3(
        normalize(tangent   + normal*u),
        normalize(bitangent + normal*v),
        normalize(cross(tangent + normal*u, bitangent + normal*v))
    );
}

The displaced field with the TBN matrix rotated along the slope of the displacement.{#fig:img-displacement-normals}

Car mesh loaded from car model, without transformations{#fig:img-car-meshes}

Car mesh loaded from car model with transformations applied.{#fig:img-car-transformations}

Car mesh loaded from car model with transformations applied, rotated to make z point skyward.{#fig:img-car-coordinate-system}

Diffuse colors loaded from car model{#fig:img-car-materials}

Diffuse, emissive and specular colors loaded from car model{#fig:img-material-colors}

Car model with all colors, with reflection mapping applied.{#fig:img-reflection}

The reflection map texture applied to the car{#fig:img-reflection-map}

Tree model loaded from model file, no texture support yet.{#fig:img-tree}

Tree model loaded from model file, textures applied.{#fig:img-tree-alpha}

Tree model with textures, transparent meshes rendered last in sorted order.{#fig:img-tree-sorted}

Tree model with textures, transparent meshes rendered last in sorted order, with depthbuffer in read-only mode.{#fig:img-tree-depth-readonly}

Grass model loaded, cloned and placed randomly throughout the scene{#fig:img-low-fps}

glUniformMatrix4fv(s->location("MVP")     , 1, GL_FALSE, glm::value_ptr(node->MVP));
glUniformMatrix4fv(s->location("MV")      , 1, GL_FALSE, glm::value_ptr(node->MV));
glUniformMatrix4fv(s->location("MVnormal"), 1, GL_FALSE, glm::value_ptr(node->MVnormal));
glUniform2fv(s->location("uvOffset")      , 1,           glm::value_ptr(node->uvOffset));
glUniform3fv(s->location("diffuse_color") , 1,           glm::value_ptr(node->diffuse_color));
glUniform3fv(s->location("emissive_color"), 1,           glm::value_ptr(node->emissive_color));
glUniform3fv(s->location("specular_color"), 1,           glm::value_ptr(node->specular_color));
glUniform1f( s->location("opacity"),                 node->opacity);
glUniform1f( s->location("shininess"),               node->shininess);
glUniform1f( s->location("reflexiveness"),           node->reflexiveness);
glUniform1f( s->location("displacementCoefficient"), node->displacementCoefficient);
glUniform1ui(s->location("isTextured"),              node->isTextured);
glUniform1ui(s->location("isVertexColored"),         node->isVertexColored);
glUniform1ui(s->location("isNormalMapped"),          node->isNormalMapped);
glUniform1ui(s->location("isDisplacementMapped"),    node->isDisplacementMapped);
glUniform1ui(s->location("isReflectionMapped"),      node->isReflectionMapped);
glUniform1ui(s->location("isIlluminated"),           node->isIlluminated);
glUniform1ui(s->location("isInverted"),              node->isInverted);
GLint inline Shader::location(std::string const& name) {
    //return  glGetUniformLocation(mProgram, name.c_str());
    auto it = this->cache.find(name);
    if (it == this->cache.end()) 
        return this->cache[name] = glGetUniformLocation(mProgram, name.c_str());
    return it->second;
}
bool shader_changed = s != prev_s;
#define cache(x) static decltype(node->x) cached_ ## x; \
    if (shader_changed || cached_ ## x != node->x) { cached_ ## x = node->x;
#define um4fv(x) cache(x) glUniformMatrix4fv(s->location(#x), 1, GL_FALSE, glm::value_ptr(node->x)); }
#define u2fv(x)  cache(x) glUniform2fv( s->location(#x), 1, glm::value_ptr(node->x)); }
#define u3fv(x)  cache(x) glUniform3fv( s->location(#x), 1, glm::value_ptr(node->x)); }
#define u1f(x)   cache(x) glUniform1f(  s->location(#x), node->x); }
#define u1ui(x)  cache(x) glUniform1ui( s->location(#x), node->x); }

Car, trees and grass combined into a night driving scene. Two yellow spot lights attached to the head lights, two yelllow point lights attached to the head lights, two red point lights attached to the read lights.{#fig:img-night-scene-lights}

A pink rim backlight applied to the car with strength of 0.3.{#fig:img-rim-lights}

Visualisation of the transformed depth buffer, transformed into a 'point of focus' buffer. z=0 at the depth of the car, tends toward 1 otherwise.{#fig:img-depth-map}

Depth of field applied to the scene{#fig:img-depth-of-field}

The vignette effect, applied to a white frame buffer{#fig:img-vingette}

The chromatic aberration effect. F is the point of focus. The transformed depthbuffer is centered around the vertical line crossing F.{#fig:img-what-is}

Chromatic aberration applied to the scene, where the aberration coefficients have been multiplied by 3.{#fig:img-chromatic-aberration}

Noise/grain applied to the frame buffer.{#fig:img-noise}

Noise/grain, multiplied by the depthbuffer/point of focus, applied to the frame buffer.{#fig:img-all-effects}

The same scene, during the day. Spotlights have been turned off.{#fig:img-day}

The early-morning scene with some strong fog applied. The code was later changed to have the fog affect the background color as well.{#fig:img-fog}