在XNA 4.0中绘制具有多个边的纹理立方体

我几个小时以来一直在反对这个问题。 我想要做的是画一个立方体,每边都有不同的纹理; 或者更具体地说,我希望能够指定我想要的每一面纹理。 我用这里的例子开始,然后尝试进一步开发它,所以我可以有多个纹理。 但是,无论我做什么,它仍然只使用应用于效果的最后一个纹理,并且不理会任何先前的任务。 这是我的形状类:

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 < 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); } 

}

在我的游戏的Draw方法中:

 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); } 

如您所见,我正在加载不同的纹理,但结果如下:

我的立方体http://sofzh.miximages.com/c%23/769MinecraftClassic_2011_.bmp

我确信纹理是不同的,但是所有边都绘制了相同的纹理。 我是否需要为每一方单独生效? 这看起来有点矫枉过正。

在调用EffectPass.Apply()之前,不会应用在效果上设置的任何参数。 这是因为对效果应用更改非常昂贵,并且您可能希望一次执行多个更改。

您的RenderShape函数应如下所示:

 public void RenderShape(GraphicsDevice device, Effect effect) { BuildShape(); foreach (EffectPass pass in effect.CurrentTechnique.Passes) { effect.Parameters["xTexture"].SetValue(topTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[2], 0, 2); effect.Parameters["xTexture"].SetValue(bottomTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[3], 0, 2); effect.Parameters["xTexture"].SetValue(frontTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[0], 0, 2); effect.Parameters["xTexture"].SetValue(backTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[1], 0, 2); effect.Parameters["xTexture"].SetValue(leftTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[4], 0, 2); effect.Parameters["xTexture"].SetValue(rightTexture); pass.Apply(); device.DrawUserPrimitives(PrimitiveType.TriangleList, shapeVertices[5], 0, 2); } }