// // Copyright © 2012 Linaro Limited // // This file is part of the glmark2 OpenGL (ES) 2.0 benchmark. // // glmark2 is free software: you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the Free Software // Foundation, either version 3 of the License, or (at your option) any later // version. // // glmark2 is distributed in the hope that it will be useful, but WITHOUT ANY // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS // FOR A PARTICULAR PURPOSE. See the GNU General Public License for more // details. // // You should have received a copy of the GNU General Public License along with // glmark2. If not, see <http://www.gnu.org/licenses/>. // // Authors: // Jesse Barker // #include "scene.h" #include "model.h" #include "options.h" #include "util.h" #include "log.h" #include "shader-source.h" #include "stack.h" string; vector; map; Stack4; mat4; vec4; vec3; vec2; static const vec4 lightPosition(0.0f, 3.0f, 2.0f, 1.0f); // // To create a shadow map, we need a framebuffer object set up for a // depth-only pass. The render target can then be bound as a texture, // and the depth values sampled from that texture can be used in the // distance-from-light computations when rendering the shadow on the // ground below the rendered object. // class DepthRenderTarget { … }; bool DepthRenderTarget::setup(unsigned int canvas_fbo, unsigned int width, unsigned int height) { … } void DepthRenderTarget::teardown() { … } void DepthRenderTarget::enable(const mat4& mvp) { … } void DepthRenderTarget::disable() { … } // // The actual shadow pass is really just a quad projected into the scene // with the horse's shadow cast upon it. In the vertex stage, we compute // a texture coordinate for the depth texture look-up by transforming the // current vertex position using a matrix describing the light's view point. // In the fragment stage, that coordinate is perspective corrected, and // used to sample the depth texture. If the depth value for that fragment // (effectively the distance from the light to the object at that point) // is less than the Z component of that coordinate (effectively the distance // from the light to the ground at that point) then that location is in shadow. // class GroundRenderer { … }; bool GroundRenderer::setup(const mat4& projection, unsigned int texture) { … } void GroundRenderer::teardown() { … } void GroundRenderer::draw() { … } class ShadowPrivate { … }; bool ShadowPrivate::setup(map<string, Scene::Option>& options) { … } void ShadowPrivate::teardown() { … } void ShadowPrivate::update(double elapsedTime) { … } void ShadowPrivate::draw() { … } SceneShadow::SceneShadow(Canvas& canvas) : … { … } bool SceneShadow::supported(bool show_errors) { … } bool SceneShadow::load() { … } void SceneShadow::unload() { … } bool SceneShadow::setup() { … } void SceneShadow::teardown() { … } void SceneShadow::update() { … } void SceneShadow::draw() { … } Scene::ValidationResult SceneShadow::validate() { … }