framework2
103 строки · 4.1 Кб
1/*
2* RimHighlightingPass.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 "RimHighlightingPass.h"
33
34namespace itg
35{
36RimHighlightingPass::RimHighlightingPass(const ofVec2f& aspect, bool arb) :
37RenderPass(aspect, arb, "rimhighlighting")
38{
39string vertShaderSrc = STRINGIFY(
40varying vec3 normal;
41varying vec3 sides;
42varying vec2 v_texCoord;
43varying vec4 v_color;
44
45void main()
46{
47normal = gl_NormalMatrix * gl_Normal;
48gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
49sides = gl_Position.xyz;
50sides.x = sides.x - 128.0;
51
52v_texCoord = vec2(gl_MultiTexCoord0);
53v_color = gl_Color;
54}
55);
56
57string fragShaderSrc = STRINGIFY(
58varying vec3 normal;
59varying vec3 sides;
60varying vec2 v_texCoord;
61uniform sampler2D myTexture;
62varying vec4 v_color;
63
64void main()
65{
66float intensity;
67vec3 n = normalize(normal);
68vec4 color;
69intensity = dot(sides,n);
70
71gl_FragColor = texture2D(myTexture, v_texCoord);
72if (intensity >= 64.0)
73{
74gl_FragColor.b = gl_FragColor.b / 1.5;
75gl_FragColor.r = gl_FragColor.r * 1.5;
76gl_FragColor.g = gl_FragColor.g * 1.25;
77}
78else
79{
80gl_FragColor = gl_FragColor * v_color;
81}
82}
83);
84
85shader.setupShaderFromSource(GL_VERTEX_SHADER, vertShaderSrc);
86shader.setupShaderFromSource(GL_FRAGMENT_SHADER, fragShaderSrc);
87shader.linkProgram();
88
89}
90
91void RimHighlightingPass::render(ofFbo& readFbo, ofFbo& writeFbo)
92{
93writeFbo.begin();
94
95shader.begin();
96shader.setUniformTexture("myTexture", readFbo.getTexture(), 0);
97
98texturedQuad(0, 0, writeFbo.getWidth(), writeFbo.getHeight());
99
100shader.end();
101writeFbo.end();
102}
103}
104