framework2
86 строк · 3.6 Кб
1/*
2* VerticalTiltShifPass.cpp
3*
4* Copyright (c) 2013, satcy, http://satcy.net
5* All rights reserved.
6*
7* Redistribution and use in source and binary forms, with or without
8* modification, are permitted provided that the following conditions are met:
9*
10* * Redistributions of source code must retain the above copyright notice,
11* this list of conditions and the following disclaimer.
12* * Redistributions in binary form must reproduce the above copyright
13* notice, this list of conditions and the following disclaimer in the
14* documentation and/or other materials provided with the distribution.
15* * Neither the name of Neil Mendoza nor the names of its contributors may be used
16* to endorse or promote products derived from this software without
17* specific prior written permission.
18*
19* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29* POSSIBILITY OF SUCH DAMAGE.
30*
31*/
32#include "VerticalTiltShifPass.h"
33
34namespace itg
35{
36VerticalTiltShifPass::VerticalTiltShifPass(const ofVec2f& aspect, bool arb) :
37RenderPass(aspect, arb, "verticaltiltshift"), v(2.0/512.0), r(0.5)
38{
39string fragShaderSrc = STRINGIFY(
40uniform sampler2D tDiffuse;
41uniform float v;
42uniform float r;
43
44void main() {
45vec2 vUv = gl_TexCoord[0].st;
46vec4 sum = vec4( 0.0 );
47
48float vv = v * abs( r - vUv.y );
49
50sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;
51sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;
52sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;
53sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;
54sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;
55sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;
56sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;
57sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;
58sum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;
59
60gl_FragColor = sum;
61}
62);
63
64shader.setupShaderFromSource(GL_FRAGMENT_SHADER, fragShaderSrc);
65shader.linkProgram();
66#ifdef _ITG_TWEAKABLE
67addParameter("f", this->v, "min=0 max=1");
68addParameter("r", this->r, "min=0 max=1");
69#endif
70}
71
72void VerticalTiltShifPass::render(ofFbo& readFbo, ofFbo& writeFbo)
73{
74writeFbo.begin();
75
76shader.begin();
77shader.setUniformTexture("tDiffuse", readFbo.getTexture(), 0);
78shader.setUniform1f("v", v);
79shader.setUniform1f("r", r);
80
81texturedQuad(0, 0, writeFbo.getWidth(), writeFbo.getHeight());
82
83shader.end();
84writeFbo.end();
85}
86}
87