Search code examples
webglfragment-shadervertex-shader

How can I make my WebGL Coordinate System "Top Left" Oriented?


Because of computation efficiency, I use a fragment shader to implement a simple 2D metaballs algorithm. The data of the circles to render is top-left oriented.

I have everything working, except that the origin of WebGL's coordinate system (bottom-left) is giving me a hard time: Obviously, the rendered output is mirrored along the horizontal axis.

Following https://webglfundamentals.org/webgl/lessons/webgl-2d-rotation.html (and others), I tried to rotate things using a vertex shader. Without any success unfortunately.

What is the most simple way of achieving the reorientation of WebGL's coordinate system?

I'd appreciate any hints and pointers, thanks! :)

Please find a working (not working ;) ) example here: https://codesandbox.io/s/gracious-fermat-znbsw?file=/src/index.js


Solution

  • Since you are using gl_FragCoord in your pixels shader, you can't do it from the vertex shader becasuse gl_FragCoord is the canvas coordinates but upside down. You could easily invert it in javascript in your pass trough to WebGL

      gl.uniform3fv(gl.getUniformLocation(program, `u_circles[${i}]`), [
        circles[i].x,
        canvas.height - circles[i].y - 1,
        circles[i].r
      ]);
    

    If you want to do it in the shader and keep using gl_FragCoord then you should pass the height of the canvas to the shader using a uniform and do the conversion of y there by doing something like

    vec2 screenSpace = vec2(gl_FragCoord.x, canvasHeight - gl_FragCoord.y - 1);
    

    The -1 is because the coordinates start at 0.