Project

General

Profile

Download (5.46 KB) Statistics
| Branch: | Revision:

library / src / main / res / raw / main_fragment_shader.glsl @ 5e331bc8

1
//////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                          //
3
//                                                                                          //
4
// This file is part of Distorted.                                                          //
5
//                                                                                          //
6
// Distorted is free software: you can redistribute it and/or modify                        //
7
// it under the terms of the GNU General Public License as published by                     //
8
// the Free Software Foundation, either version 2 of the License, or                        //
9
// (at your option) any later version.                                                      //
10
//                                                                                          //
11
// Distorted is distributed in the hope that it will be useful,                             //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                           //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                            //
14
// GNU General Public License for more details.                                             //
15
//                                                                                          //
16
// You should have received a copy of the GNU General Public License                        //
17
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                       //
18
//////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
precision highp float;
21

    
22
in vec3 v_Position;                     // Interpolated position for this fragment.
23
in vec3 v_Normal;                       // Interpolated normal for this fragment.
24
in vec2 v_TexCoordinate;                // Interpolated texture coordinate per fragment.
25

    
26
out vec4 fragColor;                     // The output color
27

    
28
uniform sampler2D u_Texture;            // The input texture.
29

    
30
#ifdef OIT
31
//////////////////////////////////////////////////////////////////////////////////////////////
32
// per-pixel linked list. Order Independent Transparency.
33

    
34
in vec2 v_Pixel;                        // location of the current fragment, in pixels
35
uniform uvec2 u_Size;
36
uniform uint u_numRecords;
37

    
38
layout (binding=0, offset=0) uniform atomic_uint u_Counter;
39

    
40
layout (std430,binding=1) buffer linkedlist  // first (u_Size.x*u_Size.y) uints - head pointers,
41
  {                                          // one for each pixel in the Output rectangle.
42
  uint u_Records[];                          //
43
  };                                         // Next 3*u_numRecords uints - actual linked list, i.e.
44
                                             // triplets of (pointer,depth,rgba).
45
#endif
46

    
47
#if NUM_FRAGMENT>0
48
uniform int fNumEffects;                // total number of fragment effects
49
uniform int fName[NUM_FRAGMENT];        // their namess.
50
uniform vec4 fUniforms[2*NUM_FRAGMENT]; // i-th effect is 2 consecutive vec4's: [2*i], [2*i+1]. First vec4 is the Interpolated values,
51
                                        // next describes the Region, i.e. area over which the effect is active.
52
#endif    // NUM_FRAGMENT>0
53

    
54
#ifdef OIT
55
//////////////////////////////////////////////////////////////////////////////////////////////
56
// Concurrent insert to a linked list. Tim Harris, 'pragmatic implementation of non-blocking
57
// linked-lists', 2001.
58
// This arranges fragments by decreasing 'depth', so one would think - from back to front, but
59
// in main() below the depth is mapped with S*(1-depth)/2, so it is really front to back.
60

    
61
void insert( vec2 ij, uint depth, uint rgba )
62
  {
63
  uint ptr = atomicCounterIncrement(u_Counter);
64

    
65
  if( ptr<u_numRecords )
66
    {
67
    ptr = 3u*ptr + u_Size.x*u_Size.y;
68

    
69
    u_Records[ptr+1u] = depth;
70
    u_Records[ptr+2u] = rgba;
71

    
72
    memoryBarrier();
73

    
74
    uint prev = uint(ij.x) + uint(ij.y) * u_Size.x;
75
    uint curr = u_Records[prev];
76

    
77
    while (true)
78
      {
79
      if ( curr==0u || depth > u_Records[curr+1u] )  // need to insert here
80
        {
81
        u_Records[ptr] = curr;     // next of new record is curr
82
        memoryBarrier();
83
        uint res = atomicCompSwap( u_Records[prev], curr, ptr );
84

    
85
        if (res==curr) break;      // done!
86
        else           curr = res; // could not insert! retry from same place in list
87
        }
88
      else                         // advance in list
89
        {
90
        prev = curr;
91
        curr = u_Records[prev];
92
        }
93
      }
94
    }
95
  }
96
#endif   // OIT
97

    
98
//////////////////////////////////////////////////////////////////////////////////////////////
99

    
100
void main()                    		
101
  {  
102
  vec4 color = texture(u_Texture,v_TexCoordinate);
103

    
104
#if NUM_FRAGMENT>0
105
  vec2 diff;
106
  float degree;
107
  int effect=0;
108

    
109
  for(int i=0; i<fNumEffects; i++)
110
    {
111
    diff   = (v_Position.xy - fUniforms[effect+1].xy)/fUniforms[effect+1].zw;
112
    degree = max(0.0,1.0-dot(diff,diff));
113

    
114
    // ENABLED EFFECTS WILL BE INSERTED HERE
115

    
116
    effect+=2;
117
    }
118
#endif
119

    
120
#ifdef OIT
121
  if( frag.a > 0.95 )
122
    {
123
    fragColor= vec4(color.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, color.a);
124
    }
125
  else
126
    {
127
    if( frag.a > 0.0 )
128
      {
129
      const float S= 2147483647.0; // max signed int. Could probably be max unsigned int but this is enough.
130
      insert(v_Pixel, uint(S*(1.0-depth)/2.0), convert(frag) );
131
      }
132
    discard;
133
    }
134
#else
135
  fragColor = vec4(color.rgb * (1.0 + 7.0*v_Normal.z) * 0.125, color.a);
136
#endif
137
  }
(5-5/13)