Project

General

Profile

« Previous | Next » 

Revision e029600f

Added by Leszek Koltunski about 6 years ago

still debugging the OIT

View differences:

src/main/res/raw/blit_depth_fragment_shader.glsl
20 20
precision highp float;
21 21
precision highp int;
22 22

  
23
#if __VERSION__ != 100
24
out vec4 fragColor;           // The output color
25
in vec2 v_TexCoordinate;      // Interpolated texture coordinate per fragment.
26
in vec2 v_Pixel;              // location of the current fragment, in pixels
27
#define TEXTURE texture
28
#define FRAG_COLOR fragColor
29
#else
30
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment.
31
varying vec2 v_Pixel;         // location of the current fragment, in pixels
32
#define TEXTURE texture2D
33
#define FRAG_COLOR gl_FragColor
34
#endif
23
out vec4 fragColor;
24
in vec2 v_TexCoordinate;
35 25

  
36
uniform sampler2D u_Texture;
37
uniform sampler2D u_DepthTexture;
26
uniform vec2 u_Size;
38 27

  
39
//////////////////////////////////////////////////////////////////////////////////////////////
40
// per-pixel linked list. Order Independent Transparency.
41

  
42
uniform ivec2 u_Size;
43
uniform uint u_numRecords;
44

  
45
layout (binding=0, offset=0) uniform atomic_uint u_Counter;  // initialize to 0
46

  
47
layout (std430,binding=1) buffer linkedlist  // first (u_Size.x*u_Size.y) uints - head pointers,
48
  {                                          // one for each pixel in the Output rectangle.
49
  uint u_Records[];                          //
50
  };                                         // Next 3*u_numRecords uints - actual linked list, i.e.
51
                                             // triplets of (pointer,depth,rgba).
52

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

  
59
void insert2( vec2 ij, uint depth, uint rgba )
60
  {
61
/*
62
  uint index = uint(ij.x + ij.y * float(u_Size.x));
63
  u_Records[index] = (255u<<24u)+ uint( (int(255*int(ij.y)/u_Size.y))<<16u ) + (255u);
64
  discard;
65
*/
66

  
67
  uint ptr = atomicCounterIncrement(u_Counter);
68

  
69
  if( ptr<u_numRecords )
70
    {
71
    ptr = ptr /*uint(ij.x + ij.y * float(u_Size.x))*/ + uint(u_Size.x*u_Size.y);
72

  
73
    u_Records[ptr   ] = (255u<<( (2*int(ij.x) > u_Size.x) ? 24u:16u)) + (255u);
74
    //u_Records[ptr+1u] = depth;
75
    //u_Records[ptr+2u] = rgba;
76

  
77
    uint index = uint(ij.x + ij.y * float(u_Size.x));
78
    u_Records[index] = ptr;
79
    discard;
80
    }
81
  }
82

  
83
void insert( vec2 ij, uint depth, uint rgba )
84
  {
85
  uint ptr = atomicCounterIncrement(u_Counter);
28
layout (binding=0, offset=0) uniform atomic_uint u_Counter;
86 29

  
87
  if( ptr<u_numRecords )
88
    {
89
    ptr = 3u*ptr + uint(u_Size.x*u_Size.y);
90

  
91
    u_Records[ptr   ] = 0u;
92
    u_Records[ptr+1u] = depth;
93
    u_Records[ptr+2u] = rgba;
94

  
95
    uint index = uint(ij.x + ij.y * float(u_Size.x));
96

  
97
    u_Records[index] = ptr;
98
    }
99
/*
100
  uint ptr = atomicCounterIncrement(u_Counter)-1u;
101

  
102
  if( ptr<u_numRecords )
103
    {
104
    ptr = 3u*ptr + uint(u_Size.x*u_Size.y);
105

  
106
    u_Records[ptr+1u] = depth;
107
    u_Records[ptr+2u] = rgba;
108

  
109
    memoryBarrier();
110

  
111
    uint prev = uint(ij.x + ij.y * float(u_Size.x));
112
    uint curr = u_Records[prev];
113
/*
114
    while (true)
115
      {
116
      if ( curr==0u || depth > u_Records[curr+1u] )  // need to insert here
117
        {
118

  
119
        u_Records[ptr] = curr; // next of new record is curr
120
        memoryBarrier();
121
        uint res = atomicCompSwap( u_Records[prev], curr, ptr );
122
/*
123
        if (res==curr) break;      // done!
124
        else           curr = res; // could not insert! retry from same place in list
125
        }
126
      else // advance in list
127
        {
128
        prev = curr;
129
        curr = u_Records[prev];
130
        }
131
      }
132
*/
133
//    }
134

  
135

  
136
  }
137

  
138
//////////////////////////////////////////////////////////////////////////////////////////////
139

  
140
uint convert(vec4 c)
30
layout (std430,binding=1) buffer linkedlist
141 31
  {
142
  return ((uint(255.0*c.r))<<24u) + ((uint(255.0*c.g))<<16u) + ((uint(255.0*c.b))<<8u) + uint(255.0*c.a);
143
  }
32
  uint u_Records[];
33
  };
144 34

  
145 35
//////////////////////////////////////////////////////////////////////////////////////////////
146 36

  
147 37
void main()                    		
148 38
  {
149
  vec4 frag  = TEXTURE(u_Texture     , v_TexCoordinate);
150
  float depth= TEXTURE(u_DepthTexture, v_TexCoordinate).r;
151
/*
152
  if( frag.a > 0.95 )
153
    {
154
    gl_FragDepth = depth;
155
    FRAG_COLOR   = frag;
156
    }
157
  else if( frag.a > 0.0 )
158
    {*/
159
    const float S= 2147483647.0; // max signed int. Could probably be max unsigned int but this is enough.
160
    insert2(v_Pixel, uint(S*(1.0-depth)/2.0), convert(frag) );
161
    //}
39
  uint pixelX = uint(v_TexCoordinate.x * u_Size.x);
40
  uint pixelY = uint(v_TexCoordinate.y * u_Size.y);
41
  uint index = pixelX + pixelY * uint(u_Size.x);
42

  
43
  uint ptr = atomicCounterIncrement(u_Counter) + uint(u_Size.x*u_Size.y);
44
  u_Records[ptr  ] = (v_TexCoordinate.x>0.5?2u:1u);
45
  u_Records[index] = ptr;
46
  discard;
162 47
  }

Also available in: Unified diff