I'm working on a minecraft-style voxel game, and trying to implement a lighting model where each face of a cube has four light values (one at each vertex), and is shaded using an interpolation among those four values. Unfortunately, because each quad face is actually composed of two triangles, if you simply set each vertex color to match its lighting value, you get ugly diagonal artifacts, as in the following image: I think that the solution to this problem is to write a custom shader, where each vertex also knows the location and light value of the three other vertices that make up the square, then using bilinear interpolation in the fragment shader to find the properly blended value. HOWEVER, I'm pretty new to writing shaders, and I'm having a lot of trouble finding the answer to this question: In my C# code, how do I encode the vertices in the mesh with extra data that can then be accessed in the cg shader? I can't find out how to pass any vertex data other than the standard attributes (normal, texcoord, tangent, etc) to the shader. Is this even possible? If so, if someone could share a link explaining how, it would be a huge help. If that's not possible (or even if it is), I would also appreciate any other ideas about alternative ways I could accomplish what I'm trying to do. Thanks for your help!