title: Drawing a textured cube with multiple sides in XNA 4.0
body: <p>I have been banging my head against this problem for hours now. What I want to do is draw a cube, with different textures on each side; or more specifically, I want to be able to specify whatever texture I want per side. I used the example <a href="http://www.switchonthecode.com/tutorials/creating-a-textured-box-in-xna" rel="noreferrer">here</a> to start with, and then attempted to develop it further, so I could have more than one texture. However, no matter what I do, it still only uses the last texture that is applied to the effect, and pays no heed to any previous assignments. Here is my shape class:</p>
  
  <pre><code>public class BasicShape {
  
   public Vector3 shapeSize;
   public Vector3 shapePosition;
   private VertexPositionNormalTexture[][] shapeVertices;
   private int shapeTriangles;
   private VertexBuffer shapeBuffer;
   public Texture2D topTexture;
   public Texture2D frontTexture;
   public Texture2D backTexture;
   public Texture2D leftTexture;
   public Texture2D rightTexture;
   public Texture2D bottomTexture;
  
   public BasicShape(Vector3 size, Vector3 position) {
      shapeSize = size;
      shapePosition = position;
   }
  
   private void BuildShape() {
      shapeTriangles = 12;
  
      shapeVertices = new VertexPositionNormalTexture[6][];
      for(int i = 0; i &lt; 6; i++) {
          shapeVertices[i] = new VertexPositionNormalTexture[6];
      }
  
      Vector3 topLeftFront = shapePosition +
       new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomLeftFront = shapePosition +
       new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topRightFront = shapePosition +
       new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomRightFront = shapePosition +
       new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topLeftBack = shapePosition +
       new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 topRightBack = shapePosition +
       new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 bottomLeftBack = shapePosition +
       new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
      Vector3 bottomRightBack = shapePosition +
       new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;
  
      Vector3 topLeftFront2 = shapePosition +
       new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomLeftFront2 = shapePosition +
       new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topRightFront2 = shapePosition +
       new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomRightFront2 = shapePosition +
       new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topLeftBack2 = shapePosition +
       new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 topRightBack2 = shapePosition +
       new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 bottomLeftBack2 = shapePosition +
       new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
      Vector3 bottomRightBack2 = shapePosition +
       new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;
  
      Vector3 topLeftFront3 = shapePosition +
       new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomLeftFront3 = shapePosition +
       new Vector3(0.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topRightFront3 = shapePosition +
       new Vector3(1.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomRightFront3 = shapePosition +
       new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 topLeftBack3 = shapePosition +
       new Vector3(0.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 topRightBack3 = shapePosition +
       new Vector3(1.0f, 1.0f, 1.0f) * shapeSize;
      Vector3 bottomLeftBack3 = shapePosition +
       new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
      Vector3 bottomRightBack3 = shapePosition +
       new Vector3(1.0f, 0.0f, 1.0f) * shapeSize;
  
      Vector3 frontNormal = new Vector3(0.0f, 0.0f, 1.0f) * shapeSize;
      Vector3 backNormal = new Vector3(0.0f, 0.0f, -1.0f) * shapeSize;
      Vector3 topNormal = new Vector3(0.0f, 1.0f, 0.0f) * shapeSize;
      Vector3 bottomNormal = new Vector3(0.0f, -1.0f, 0.0f) * shapeSize;
      Vector3 leftNormal = new Vector3(-1.0f, 0.0f, 0.0f) * shapeSize;
      Vector3 rightNormal = new Vector3(1.0f, 0.0f, 0.0f) * shapeSize;
  
      Vector2 textureTopLeft = new Vector2(1f * shapeSize.X, 0.0f * shapeSize.Y);
      Vector2 textureTopRight = new Vector2(0.0f * shapeSize.X, 0.0f * shapeSize.Y);
      Vector2 textureBottomLeft = new Vector2(1f * shapeSize.X, 1f * shapeSize.Y);
      Vector2 textureBottomRight = new Vector2(0.0f * shapeSize.X, 1f * shapeSize.Y);
  
      // Front face.
      shapeVertices[0][0] = new VertexPositionNormalTexture(
       topLeftFront, frontNormal, textureTopLeft);
      shapeVertices[0][1] = new VertexPositionNormalTexture(
       bottomLeftFront, frontNormal, textureBottomLeft);
      shapeVertices[0][2] = new VertexPositionNormalTexture(
       topRightFront, frontNormal, textureTopRight);
      shapeVertices[0][3] = new VertexPositionNormalTexture(
       bottomLeftFront, frontNormal, textureBottomLeft);
      shapeVertices[0][4] = new VertexPositionNormalTexture(
       bottomRightFront, frontNormal, textureBottomRight);
      shapeVertices[0][5] = new VertexPositionNormalTexture(
       topRightFront, frontNormal, textureTopRight);
  
      // Back face.
      shapeVertices[1][0] = new VertexPositionNormalTexture(
       topLeftBack, backNormal, textureTopRight);
      shapeVertices[1][1] = new VertexPositionNormalTexture(
       topRightBack, backNormal, textureTopLeft);
      shapeVertices[1][2] = new VertexPositionNormalTexture(
       bottomLeftBack, backNormal, textureBottomRight);
      shapeVertices[1][3] = new VertexPositionNormalTexture(
       bottomLeftBack, backNormal, textureBottomRight);
      shapeVertices[1][4] = new VertexPositionNormalTexture(
       topRightBack, backNormal, textureTopLeft);
      shapeVertices[1][5] = new VertexPositionNormalTexture(
       bottomRightBack, backNormal, textureBottomLeft);
  
      // Top face.
      shapeVertices[2][0] = new VertexPositionNormalTexture(
       topLeftFront2, topNormal, textureBottomLeft);
      shapeVertices[2][1] = new VertexPositionNormalTexture(
       topRightBack2, topNormal, textureTopRight);
      shapeVertices[2][2] = new VertexPositionNormalTexture(
       topLeftBack2, topNormal, textureTopLeft);
      shapeVertices[2][3] = new VertexPositionNormalTexture(
       topLeftFront2, topNormal, textureBottomLeft);
      shapeVertices[2][4] = new VertexPositionNormalTexture(
       topRightFront2, topNormal, textureBottomRight);
      shapeVertices[2][5] = new VertexPositionNormalTexture(
       topRightBack2, topNormal, textureTopRight);
  
      // Bottom face.
      shapeVertices[3][0] = new VertexPositionNormalTexture(
       bottomLeftFront2, bottomNormal, textureTopLeft);
      shapeVertices[3][1] = new VertexPositionNormalTexture(
       bottomLeftBack2, bottomNormal, textureBottomLeft);
      shapeVertices[3][2] = new VertexPositionNormalTexture(
       bottomRightBack2, bottomNormal, textureBottomRight);
      shapeVertices[3][3] = new VertexPositionNormalTexture(
       bottomLeftFront2, bottomNormal, textureTopLeft);
      shapeVertices[3][4] = new VertexPositionNormalTexture(
       bottomRightBack2, bottomNormal, textureBottomRight);
      shapeVertices[3][5] = new VertexPositionNormalTexture(
       bottomRightFront2, bottomNormal, textureTopRight);
  
      // Left face.
      shapeVertices[4][0] = new VertexPositionNormalTexture(
       topLeftFront3, leftNormal, textureTopRight);
      shapeVertices[4][1] = new VertexPositionNormalTexture(
       bottomLeftBack3, leftNormal, textureBottomLeft);
      shapeVertices[4][2] = new VertexPositionNormalTexture(
       bottomLeftFront3, leftNormal, textureBottomRight);
      shapeVertices[4][3] = new VertexPositionNormalTexture(
       topLeftBack3, leftNormal, textureTopLeft);
      shapeVertices[4][4] = new VertexPositionNormalTexture(
       bottomLeftBack3, leftNormal, textureBottomLeft);
      shapeVertices[4][5] = new VertexPositionNormalTexture(
       topLeftFront3, leftNormal, textureTopRight);
  
      // Right face.
      shapeVertices[5][0] = new VertexPositionNormalTexture(
       topRightFront3, rightNormal, textureTopLeft);
      shapeVertices[5][1] = new VertexPositionNormalTexture(
       bottomRightFront3, rightNormal, textureBottomLeft);
      shapeVertices[5][2] = new VertexPositionNormalTexture(
       bottomRightBack3, rightNormal, textureBottomRight);
      shapeVertices[5][3] = new VertexPositionNormalTexture(
       topRightBack3, rightNormal, textureTopRight);
      shapeVertices[5][4] = new VertexPositionNormalTexture(
       topRightFront3, rightNormal, textureTopLeft);
      shapeVertices[5][5] = new VertexPositionNormalTexture(
       bottomRightBack3, rightNormal, textureBottomRight);
   }
  
   public void SetTopTexture(Texture2D tex) {
      topTexture = tex;
   }
   public void SetSideTexture(Texture2D tex) {
      frontTexture = tex;
      backTexture = tex;
      leftTexture = tex;
      rightTexture = tex;
   }
   public void SetBottomTexture(Texture2D tex) {
      bottomTexture = tex;
   }
  
   public void RenderShape(GraphicsDevice device, Effect effect) {
      BuildShape();
  
  
      effect.Parameters["xTexture"].SetValue(topTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[2], 0, 2);
      effect.Parameters["xTexture"].SetValue(bottomTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[3], 0, 2);
      effect.Parameters["xTexture"].SetValue(frontTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[0], 0, 2);
      effect.Parameters["xTexture"].SetValue(backTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[1], 0, 2);
      effect.Parameters["xTexture"].SetValue(leftTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[4], 0, 2);
      effect.Parameters["xTexture"].SetValue(rightTexture);
      device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[5], 0, 2);
  
   }
  </code></pre>
  
  <p>}</p>
  
  <p>And in the Draw method for my game:</p>
  
  <pre><code>cubeEffect.CurrentTechnique = cubeEffect.Techniques["Textured"];
     foreach(EffectPass pass in cubeEffect.CurrentTechnique.Passes) {
        pass.Apply();
        BasicShape s = new BasicShape(new Vector3(1, 1, 1), new Vector3(0, 0, 3));
        s.SetTopTexture(TextureLoader.GetTexture(4));
        s.SetSideTexture(TextureLoader.GetTexture(35));
        s.SetBottomTexture(TextureLoader.GetTexture(4));
        s.RenderShape(GraphicsDevice, cubeEffect);   
  
    }
  </code></pre>
  
  <p>As you can see, I am loading different textures, yet the result is this:</p>
  
  <p><a href="http://www.tinyimg.org/images/769MinecraftClassic_2011_.bmp" rel="noreferrer">my cube http://www.tinyimg.org/images/769MinecraftClassic_2011_.bmp</a></p>
  
  <p>I am sure that the textures are different, yet the same texture gets drawn on all sides. Do I need a separate effect for each side? That definitely seems like overkill.</p>