As GPU-powered special effects become more sophisticated, it becomes harder to create and manage effect interaction using the fairly primitive shading languages. This difficulty also introduces a workflow problem: artists design effects but only programmers can implement them, making it impossible for them to work asynchronously.To address these problems we present abstract shade trees and heuristic algorithms that operate over them. The trees allow designers to easily create effects by connecting primitives such as cube mapping and modulation. These primitives publish semantically rich types that encapsulate notions like vector basis and normalization. The algorithms employ these published types to automatically infer atomic and compound connectors between the primitives, and generate code for the tree. We also describe a visual editing environment for specifying the trees.Our data structure and algorithms spare designers from having to specify low-level programming details, enabling them to experiment without depending on programmers. The algorithms ensure that the generated code will be free of type-mismatches, a problem in previous shade trees. The abstract shade tree can also naturally express high-level features like shadows and reflections whose implementations overlap; that cross-cutting has made them difficult to modularize in more traditional ways. In experiments, the generated shaders are as efficient as handwritten code.