Project

General

Profile

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

library / src / main / res / raw / main_fragment_shader.glsl @ 2b7d2abb

1 d333eb6b Leszek Koltunski
//////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2016 Leszek Koltunski                                                          //
3
//                                                                                          //
4 535a45bc Leszek Koltunski
// This file is part of Distorted.                                                          //
5 d333eb6b Leszek Koltunski
//                                                                                          //
6 535a45bc Leszek Koltunski
// Distorted is free software: you can redistribute it and/or modify                        //
7 d333eb6b Leszek Koltunski
// 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 535a45bc Leszek Koltunski
// Distorted is distributed in the hope that it will be useful,                             //
12 d333eb6b Leszek Koltunski
// 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 535a45bc Leszek Koltunski
// along with Distorted.  If not, see <http://www.gnu.org/licenses/>.                       //
18 d333eb6b Leszek Koltunski
//////////////////////////////////////////////////////////////////////////////////////////////
19 6a06a912 Leszek Koltunski
20 341151fc Leszek Koltunski
precision highp float;
21 c1a38ba3 Leszek Koltunski
precision highp int;
22 94f6d472 Leszek Koltunski
23 f2367b75 Leszek Koltunski
in vec3 v_Position;                     // Interpolated position for this fragment.
24
in vec3 v_Normal;                       // Interpolated normal for this fragment.
25
in vec2 v_TexCoordinate;                // Interpolated texture coordinate per fragment.
26 5e331bc8 Leszek Koltunski
27 f2367b75 Leszek Koltunski
out vec4 fragColor;                     // The output color
28 94f6d472 Leszek Koltunski
29
uniform sampler2D u_Texture;            // The input texture.
30 6a06a912 Leszek Koltunski
31 5e331bc8 Leszek Koltunski
#ifdef OIT
32
//////////////////////////////////////////////////////////////////////////////////////////////
33
// per-pixel linked list. Order Independent Transparency.
34
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 6a06a912 Leszek Koltunski
#if NUM_FRAGMENT>0
48 de77a6c5 Leszek Koltunski
uniform int fNumEffects;                     // total number of fragment effects
49 78ff6ea9 Leszek Koltunski
50 2b7d2abb Leszek Koltunski
uniform ivec4 fProperties[NUM_FRAGMENT];     // their properties, 4 ints:
51 de77a6c5 Leszek Koltunski
                                             // name of the effect, unused, unused, unused
52
53 2b7d2abb Leszek Koltunski
uniform vec4 fUniforms[3*NUM_FRAGMENT];      // i-th effect is 3 consecutive vec4's: [3*i], [3*i+1], [3*i+2].
54 de77a6c5 Leszek Koltunski
                                             // The first vec4 is the Interpolated values,
55
                                             // second vec4: first float - cache, next 3: Center, the third - the Region.
56 78ff6ea9 Leszek Koltunski
57 03cb451d Leszek Koltunski
#endif    // NUM_FRAGMENT>0
58 6a06a912 Leszek Koltunski
59 5e331bc8 Leszek Koltunski
#ifdef OIT
60
//////////////////////////////////////////////////////////////////////////////////////////////
61
// Concurrent insert to a linked list. Tim Harris, 'pragmatic implementation of non-blocking
62
// linked-lists', 2001.
63
// This arranges fragments by decreasing 'depth', so one would think - from back to front, but
64
// in main() below the depth is mapped with S*(1-depth)/2, so it is really front to back.
65
66
void insert( vec2 ij, uint depth, uint rgba )
67
  {
68
  uint ptr = atomicCounterIncrement(u_Counter);
69
70
  if( ptr<u_numRecords )
71
    {
72
    ptr = 3u*ptr + u_Size.x*u_Size.y;
73
74
    u_Records[ptr+1u] = depth;
75
    u_Records[ptr+2u] = rgba;
76
77
    memoryBarrier();
78
79
    uint prev = uint(ij.x) + uint(ij.y) * u_Size.x;
80
    uint curr = u_Records[prev];
81
82
    while (true)
83
      {
84
      if ( curr==0u || depth > u_Records[curr+1u] )  // need to insert here
85
        {
86
        u_Records[ptr] = curr;     // next of new record is curr
87
        memoryBarrier();
88
        uint res = atomicCompSwap( u_Records[prev], curr, ptr );
89
90
        if (res==curr) break;      // done!
91
        else           curr = res; // could not insert! retry from same place in list
92
        }
93
      else                         // advance in list
94
        {
95
        prev = curr;
96
        curr = u_Records[prev];
97
        }
98
      }
99
    }
100
  }
101 c1a38ba3 Leszek Koltunski
102
//////////////////////////////////////////////////////////////////////////////////////////////
103
104
uint convert(vec4 c)
105
  {
106
  return ((uint(255.0*c.r))<<24u) + ((uint(255.0*c.g))<<16u) + ((uint(255.0*c.b))<<8u) + uint(255.0*c.a);
107
  }
108
109 5e331bc8 Leszek Koltunski
#endif   // OIT
110
111 6a06a912 Leszek Koltunski
//////////////////////////////////////////////////////////////////////////////////////////////
112
113
void main()                    		
114
  {  
115 5e331bc8 Leszek Koltunski
  vec4 color = texture(u_Texture,v_TexCoordinate);
116 4018b3b7 Leszek Koltunski
117
#if NUM_FRAGMENT>0
118 b24e4719 Leszek Koltunski
  vec3 diff;
119 7cd24173 leszek
  float degree;
120
  int effect=0;
121 03cb451d Leszek Koltunski
122 6a06a912 Leszek Koltunski
  for(int i=0; i<fNumEffects; i++)
123
    {
124 b24e4719 Leszek Koltunski
    diff   = (v_Position - fUniforms[effect+1].yzw)/fUniforms[effect+2].xyz;
125 7cd24173 leszek
    degree = max(0.0,1.0-dot(diff,diff));
126 341c803d Leszek Koltunski
127 7cd24173 leszek
    // ENABLED EFFECTS WILL BE INSERTED HERE
128 03cb451d Leszek Koltunski
129 b24e4719 Leszek Koltunski
    effect+=3;
130 6a06a912 Leszek Koltunski
    }
131
#endif
132 ff8ad0a7 Leszek Koltunski
133 6544040f Leszek Koltunski
  float z = v_Normal.z;
134
  if( z<0.0 ) z = -z;
135
136
  vec4 converted = vec4(color.rgb * (1.0 + 7.0*z) * 0.125, color.a);
137 001fb991 Leszek Koltunski
138 5e331bc8 Leszek Koltunski
#ifdef OIT
139 6544040f Leszek Koltunski
  if( converted.a > 0.97 )
140 5e331bc8 Leszek Koltunski
    {
141 001fb991 Leszek Koltunski
    fragColor= converted;
142 5e331bc8 Leszek Koltunski
    }
143
  else
144
    {
145 001fb991 Leszek Koltunski
    if( converted.a > 0.0 )
146 5e331bc8 Leszek Koltunski
      {
147
      const float S= 2147483647.0; // max signed int. Could probably be max unsigned int but this is enough.
148 001fb991 Leszek Koltunski
      vec2 pixel = vec2(gl_FragCoord.xy);
149
      insert(pixel, uint(S*(1.0-gl_FragCoord.z)/2.0), convert(converted) );
150 5e331bc8 Leszek Koltunski
      }
151
    discard;
152
    }
153
#else
154 001fb991 Leszek Koltunski
  fragColor = converted;
155 5e331bc8 Leszek Koltunski
#endif
156 341c803d Leszek Koltunski
  }