opengl-esindexingwebgl

Wireframe shader - Issue with Barycentric coordinates when using shared vertices


I'm working on drawing a terrain in WebGL. The problem is that I'm only using 4 vertices to draw a single quad by using indices to share vertices. So I can't upload unique baricentric coordinates for each vertex, because it's shared.

Here's a picture that shows the problem more clearly.

enter image description here

There's no barycentric coordinate that I can use for the question mark. (0,1,0) is used top left, (0,0,1) is used above and (1,0,0) is used to the left. So there's absolutely no way I can do this when I'm using indices to save vertex count.

Do I really save that much performance drawing a quad using 4 vertices instead of 6? If not then that's the easiest way to fix my problem. But I'm still curious if there's a way I can do it with shared vertices.

I'm aware that I can draw my terrain in wireframe using GL_LINES but I don't like that method, I want to have more control over my wireframe (e.g. not make it transparent).

Some people might ask why I'm using barycentric coordinates to draw my terrain in wireframe mode, it's because it works nicely in this demo:

http://codeflow.org/entries/2012/aug/02/easy-wireframe-display-with-barycentric-coordinates/

So it's basically two things I'm looking for:

Thanks!


Solution

  • If you don't require to draw the diagonal of each quad in your wireframe, and are fine with only drawing the edges of each quad, this gets much simpler. There's no need to worry about barycentric coordinates if you operate on quads instead of triangles. Instead of the 3 barycentric coordinates, use 2 coordinates for the relative position within the mesh:

    0,2----1,2----2,2----3,2----4,2
     |      |      |      |      |
     |      |      |      |      |
     |      |      |      |      |
    0,1----1,1----2,1----3,1----4,1
     |      |      |      |      |
     |      |      |      |      |
     |      |      |      |      |
    0,0----1,0----2,0----3,0----4,0
    

    This also allows you to share vertices across quads, cutting the total number of vertices in your model by approximately a factor of 4.

    You then feed these coordinate pairs from the vertex shader through to the fragment shader just like it's described for the barycentric coordinates in the article you linked.

    In the fragment shader, the code gets just slightly more complicated, since it needs to test for values being either close to 0 or close to 1, after taking the fractional part. I haven't tested this, but it could look something like this, with vQC being the equivalent of vBC in the article:

    varying vec2 vQC;
    ...
    void main() {
        vec2 vRel = fract(vQC);
        if (any(lessThan(vec4(vRel, 1.0 - vRel), vec4(0.02)))) {
            gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
        } else {
            gl_FragColor = vec4(0.5, 0.5, 0.5, 1.0);
        }
    }