Table of contents

When two projectors have to cover two surfaces that meet at an angle, I put the seam directly on the crease where the surfaces meet. There is no edge blending, and the images of the two projectors do not need to overlap. In TouchDesigner (TD below), projectorBlend only lines up the images of the two projectors, and two Crop TOPs cut that into a left half and a right half. Each projector then gets a Stoner to correct fabric sag, followed by a kantanMapper to align the four corners. All three components are in the TD Palette, and the whole chain looks like this:
Canvas and resolution
The only thing I calculate myself is the resolution. The canvas is the size of the two projectors side by side, and kantanMapper uses the size of a single projector. For two 1920×1200 projectors side by side, set the output resolution of the Fit TOP to 3840×1200, and set the resolution of each projector in projectorBlend and the Resolution of kantanMapper to 1920×1200.
The aspect ratio of the source image is usually different from the canvas. When the image has no content that has to line up with a physical object, I set the Fit parameter of the Fit TOP to Fit Outside, so the image is enlarged proportionally until it fills the canvas, and the extra at the top and bottom or at the sides is cropped away. On the left is a 4:3 test image, and on the right is how it looks after filling a 1280×400 canvas:


One kantanMapper per projector to align the four corners
kantanMapper is a component for aligning by drawing shapes on the projected image and dragging their vertices directly. Four-corner correction can only pull the image inward, so the projection area of each projector has to cover the surface it is responsible for. The image below shows the two projectors just after setup, each outputting its own half image directly. The two projectors cross in the middle, each image goes past the crease onto the other surface, and the orange ring that straddles the seam is split into two pieces:



Fix fabric sag with Stoner
Once the fabric is hung, its middle sags backward, and the grid projected on it curves.
The rectangle in kantanMapper can also be cut into a mesh to fix local areas, but I split the work between the two components. kantanMapper puts the image at the right position on the surface, and it is also where I draw masks when I need them. Stoner only corrects the shape of the image.
Place Stoner before kantanMapper, connected directly to the left or right half cut out of projectorBlend. That way the image you see in the Stoner window is the original undistorted image, and by looking at the projection you know which area to drag in which direction. If you place it after kantanMapper, the image in the window has already been pulled into a trapezoid, and dragging points while looking at it, you cannot move the content to where it belongs on the surface.
Switch Stoner to Grid Warp to drag grid points and push or pull the image locally. Click a grid point and the handles of a Bezier curve appear, and dragging a handle adjusts the curvature of the grid lines around that point:


After the correction, if content from the other side of the image shows up next to the seam, it is because Stoner wraps the part beyond the image edge around to the opposite side by default. Go inside Stoner and set Color Map Extend U/V of render/constant1 and the sampler Extend U/V of render/phong1GLSL to Zero, and it disappears.
Summary
The image below shows how the setup looks after both projectors are corrected, seen from the front left, the front, and the front right. The gray blocks on the floor are the two projectors, which sit in front of the surfaces and cross their projections upward:

Stoner also has a second output besides the corrected image, a displacement map. The official documentation suggests that once you have finished adjusting and kept this displacement map, you remove Stoner from the project and use a Remap TOP to read the displacement map and warp the image, which performs much better. Connect the image to warp to the first input of the Remap TOP, and the displacement map to the second input. For a live show, you can swap out the two Stoners this way.