Try replacing UV mapping with shader sampling based on view direction Make the panning match the cursor Enforce a minimum zoom that will keep the edges of the sphere from showing This probably just needs simple math with the aspect and/or the viewport's diagonal length. Enforce a maximum zoom that matches the pixel density of the original image at its natural dimensions, normal to the camera Choose a pleasant initial zoom Allow pinch-zooming Add data- attribute for minimum zoom Add data- attribute for starting angle Add data- attributes for canvas dimensions Automatically create canvas for each marked once it loads, and display:none the Set default canvas dimensions to match the size of the image Add a class to the for styling Copy matrix funcs into code Add licenses Add instructions Fix up code locality Give the uniforms simpler names