Part of the Khronos Group
OpenGL.org

The Industry's Foundation for High Performance Graphics

from games to virtual reality, mobile phones to supercomputers

Results 1 to 2 of 2

Thread: "Single-pass Wireframe Rendering" Problem

  1. #1
    Member Regular Contributor strattonbrazil's Avatar
    Join Date
    Jun 2007
    Location
    Los Angeles, CA
    Posts
    306

    "Single-pass Wireframe Rendering" Problem

    I'm trying to implement the paper "Single-Pass Wireframe Rendering", which seems pretty simple, but it's giving me what I'd expect as far as thick, dark values.

    The paper didn't give the exact code to figure out the altitudes, so I did it as I thought fit. The code should project the three vertices into viewport space, get their "altitudes" and send them to the fragment shader.

    The fragment shader determines the distance of the closest edge and generates an edgeIntensity. I'm not sure what I'm supposed to do with this value, but since it's supposed to scale between [0,1], I multiply the inverse against my outgoing color, but it's just very weak.

    I had a few questions that I'm not sure are addressed in the papers. First, should the altitudes be calculated in 2D instead of 3D? Second, they site DirectX features, where DirectX has a different viewport-space z-range, correct? Does that matter? I'm premultiplying the outgoing altitude distances by the w-value of the viewport-space coordinates as they recommend to correct for perspective projection.

    image trying to correct for perspective projection
    no correction (not premultiplying by w-value)

    The non-corrected image seems to have clear problems not correcting for the perspective on the more away-facing sides, but the perspective corrected one has very weak values.

    Can anyone see what's wrong with my code or how to go about debugging it from here?

    my vertex code in GLSL...

    Code :
      float altitude(in vec3 a, in vec3 b, in vec3 c) { // for an ABC triangle
      vec3 ba = a - b;
      vec3 bc = c - b;
      vec3 ba_onto_bc = dot(ba,bc) * bc;
      return(length(ba - ba_onto_bc));
    }
     
    in vec3 vertex; // incoming vertex
    in vec3 v2; // first neighbor (CCW)
    in vec3 v3; // second neighbor (CCW)
    in vec4 color;
    in vec3 normal;
    varying vec3 worldPos;
    varying vec3 worldNormal;
    varying vec3 altitudes;
    uniform mat4 objToWorld;
    uniform mat4 cameraPV;
    uniform mat4 normalToWorld;
    void main() {
      worldPos = (objToWorld * vec4(vertex,1.0)).xyz;
      worldNormal = (normalToWorld * vec4(normal,1.0)).xyz;
      //worldNormal = normal;
      gl_Position = cameraPV * objToWorld * vec4(vertex,1.0);
      // also put the neighboring polygons in viewport space
      vec4 vv1 = gl_Position;
      vec4 vv2 = cameraPV * objToWorld * vec4(v2,1.0);
      vec4 vv3 = cameraPV * objToWorld * vec4(v3,1.0);
      altitudes = vec3(vv1.w * altitude(vv1.xyz,vv2.xyz,vv3.xyz),
                       vv2.w * altitude(vv2.xyz,vv3.xyz,vv1.xyz),
                       vv3.w * altitude(vv3.xyz,vv1.xyz,vv2.xyz));
      gl_FrontColor = color;
    }

    my fragment code in GLSL...
    Code :
    varying vec3 worldPos;
    varying vec3 worldNormal;
    varying vec3 altitudes;
    uniform vec3 cameraPos;
    uniform vec3 lightDir;
    uniform vec4 singleColor;
    uniform float isSingleColor;
    void main() {
        // determine frag distance to closest edge
        float d = min(min(altitudes.x, altitudes.y), altitudes.z);
        float edgeIntensity = exp2(-2.0*d*d);
        vec3 L = lightDir;
        vec3 V = normalize(cameraPos - worldPos);
        vec3 N = normalize(worldNormal);
        vec3 H = normalize(L+V);
        //vec4 color = singleColor;
        vec4 color = isSingleColor*singleColor + (1.0-isSingleColor)*gl_Color;
        //vec4 color = gl_Color;
        float amb = 0.6;
        vec4 ambient = color * amb;
        vec4 diffuse = color * (1.0 - amb) * max(dot(L, N), 0.0);
        vec4 specular = vec4(0.0);
        gl_FragColor = (edgeIntensity * vec4(0.0)) + ((1.0-edgeIntensity) * vec4(ambient + diffuse + specular));
    }

  2. #2
    Member Regular Contributor strattonbrazil's Avatar
    Join Date
    Jun 2007
    Location
    Los Angeles, CA
    Posts
    306

    Re: "Single-pass Wireframe Rendering" Problem

    I ended up finding some code on the paper's website to figure it out.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •