XNA纹理问题

6
好的,最近我尝试了很多新事物,但遇到了一些瓶颈。我决定离开3D,因为我认为自己无法理解和编写相关代码。不过,我数学还不错,所以我想再试一次。
我正在尝试学习使用C#编写3D XNA,之前我已经掌握了2D,并希望进一步学习。我的问题是,即使是最基本的3D形状之一——立方体,我也遇到了问题。在将立方体从Blender成功导出(第七次尝试后)并导入XNA后,我无法正确显示纹理贴图,因此我下载了一个来自示例源代码文件的立方体模型,并尝试使用其默认纹理,但仍然遇到了问题。
基本上,绘制立方体的代码如下:
foreach (ModelMesh mesh in model.Meshes)
{
    GraphicsDevice.RasterizerState = RasterizerState.CullClockwise;
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.TextureEnabled = true;
        //effect.Texture = texture;
        effect.World = world;
        effect.View = view;
        effect.Projection = projection;
        effect.LightingEnabled = false;
    }
    mesh.Draw();
}

RenderStateLightingEnabled 是新的,我试图自己修复它,当我使用自己的纹理时,纹理看起来像被拉伸了一样,并且没有在立方体上显示整个图像,但所有面看起来都是相同的,所以它不是包裹它。

此外,为了看到所有的面,我会像这样旋转立方体:

position -= new Vector3(0, 0.00f, 0.0100f);
angley += 0.01f;
anglez += 0.01f;

world = Matrix.CreateScale(1.5f) * Matrix.CreateRotationZ(anglez) * Matrix.CreateRotationY(angley) * Matrix.CreateTranslation(position);

我更改了z值以测试另一个理论。

默认的纹理是一种沙色的纹理,我不确定它是否被拉伸,因为它几乎是单色的。但是盒子本身似乎被奇怪地表示(看起来我可以看到近面的内部,而且我正在看对面的背面)。

我希望有人能给我帮忙,画一个简单的纹理立方体似乎应该比看起来要简单得多,大多数在线教程都是旧版本的XNA,所以代码不匹配,当我尝试用当前的代码替换时就会迷失方向。(在创建代码而不是模型的教程中创建一个立方体。)

无论如何,感谢任何答案。

编辑1: 使用CreateOrthographic绘制这个立方体使它看起来正确(第一个使用透视),但仍然没有纹理。

编辑2: 当我使用我的立方体时,它被拉伸了,而当我使用源代码中的立方体时,它是单色的。

编辑3: 如果我提到我正在使用字体/spritebatch显示FPS,我可能会更快地得到答案。当我试图解决它为什么不起作用,并将其与一个可以工作的示例进行比较时,我发现了它,现在,有人知道如何使它工作吗?


继续使用透视相机。正交和透视视图非常不同。透视视图类似于人眼看世界的方式(许多光线汇聚到一个小的视网膜),而正交视图是您可能看到世界的方式,如果您有一个非常大的眼睛(例如,如果您有一个3英尺宽的视网膜,用于查看3英尺宽的物体)。 - Olhovsky
我知道,但目前我只是试图让任何东西正确地工作,当应用程序完成后,我希望它使用透视。 - RyanTimmons91
我建议你买一本或两本书。3D渲染是一个非常复杂的主题。无法通过简单的hack方式理解它。在编写代码之前,您必须花时间学习原则。虽然XNA简化了这个过程,但不能简化首先理解技术的需求。 - Tergiver
嗯,我懂得数学,可以在三维空间中放置对象并随意操作它们,但当我处理实际的网格和纹理时就有些吃力了。我甚至理解矩阵及其使用方法 >_>,但我无法在屏幕上显示带有纹理的网格 :P。我会再试一下,看看能否弄明白如何做,然后就放弃吧。 - RyanTimmons91
另外,我不能从书本中学习 :( 我可以阅读它们,并且可以按照它们告诉我的去做,但出于某种原因,我无法记住我从书本中阅读的内容。尽管我喜欢阅读 >.< - RyanTimmons91
显示剩余4条评论
1个回答

6

针对遇到此问题的人,包括我自己 >.<

你是否使用以下内容:

SpriteBatch.begin()

你的代码中是否有任何操作?如果有,这可能会干扰程序在3D模式下的渲染。请查看以下链接(适用于XNA 4.0之前版本):http://blogs.msdn.com/b/shawnhar/archive/2006/11/13/spritebatch-and-renderstates.aspx。如果你使用的是XNA 4.0,请查看以下链接:http://blogs.msdn.com/b/shawnhar/archive/2010/06/18/spritebatch-and-renderstates-in-xna-game-studio-4-0.aspx。特别需要注意的是,在解决此问题时需要关注以下这一行代码。
GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;

在foreach循环之前添加这行代码可以解决我的问题,但你可能需要尝试文章中的其他方法。

对于其他人,祝你们实现XNA梦想好运:D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接