gpt4 book ai didi

c# - 在 XNA 4.0 中绘制多边纹理立方体

转载 作者:太空狗 更新时间:2023-10-29 23:26:34 24 4
gpt4 key购买 nike

几个小时以来,我一直在努力解决这个问题。我想做的是画一个立方体,每边都有不同的纹理;或者更具体地说,我希望能够指定每一面我想要的任何纹理。我用了例子 here开始,然后尝试进一步开发它,这样我就可以拥有不止一种纹理。然而,无论我做什么,它仍然只使用应用于效果的最后一个纹理,而不会理会任何先前的分配。这是我的形状类:

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

}

如你所见,我正在加载不同的纹理,但结果是这样的:

my cube http://www.tinyimg.org/images/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);
}
}

关于c# - 在 XNA 4.0 中绘制多边纹理立方体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com