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 Delete the defunct view matrix Rename the model matrix as the view matrix, because that's really what it is. Consider better names for the angle variables