12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- #extension GL_EXT_frag_depth : enable
- //
- // adapted from the EDL shader code from Christian Boucheny in cloud compare:
- // https://github.com/cloudcompare/trunk/tree/master/plugins/qEDL/shaders/EDL
- //
- precision mediump float;
- precision mediump int;
- uniform float screenWidth;
- uniform float screenHeight;
- uniform vec2 neighbours[NEIGHBOUR_COUNT];
- uniform float edlStrength;
- uniform float radius;
- uniform float opacity;
- uniform float uNear;
- uniform float uFar;
- uniform mat4 uProj;
- uniform sampler2D uEDLColor;
- uniform sampler2D uEDLDepth;
- varying vec2 vUv;
- float response(float depth){
- vec2 uvRadius = radius / vec2(screenWidth, screenHeight);
-
- float sum = 0.0;
-
- for(int i = 0; i < NEIGHBOUR_COUNT; i++){
- vec2 uvNeighbor = vUv + uvRadius * neighbours[i];
-
- float neighbourDepth = texture2D(uEDLColor, uvNeighbor).a;
- neighbourDepth = (neighbourDepth == 1.0) ? 0.0 : neighbourDepth;
- if(neighbourDepth != 0.0){
- if(depth == 0.0){
- sum += 100.0;
- }else{
- sum += max(0.0, depth - neighbourDepth);
- }
- }
- }
-
- return sum / float(NEIGHBOUR_COUNT);
- }
- void main(){
- vec4 cEDL = texture2D(uEDLColor, vUv);
-
- float depth = cEDL.a;
- depth = (depth == 1.0) ? 0.0 : depth;
- float res = response(depth);
- float shade = exp(-res * 300.0 * edlStrength);
- gl_FragColor = vec4(cEDL.rgb * shade, opacity);
- { // write regular hyperbolic depth values to depth buffer
- float dl = pow(2.0, depth);
- vec4 dp = uProj * vec4(0.0, 0.0, -dl, 1.0);
- float pz = dp.z / dp.w;
- float fragDepth = (pz + 1.0) / 2.0;
- gl_FragDepthEXT = fragDepth;
- }
- if(depth == 0.0){
- discard;
- }
- }
|