Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA拉伸和填充2D和3D内容_C#_Xna - Fatal编程技术网

C# XNA拉伸和填充2D和3D内容

C# XNA拉伸和填充2D和3D内容,c#,xna,C#,Xna,我在这里详细描述了我的问题: 我的问题的基本要点是,让XNA表现得像我的OpenGL应用程序一样的最佳方法是什么,因为我希望内容拉伸以根据我设计的比例而不是实际的窗口大小填充窗口 更多信息,此问题与不同的窗口或视口大小有关。在我以前的OpenGL应用程序中,我允许用户在窗口模式和全屏模式之间切换,还允许调整窗口大小。我在使用XNA时遇到的问题是处理不同的全屏和窗口大小。在OpenGL中,我会在调整窗口大小时检测一个窗口,并调整视口,使视野始终固定为分辨率纵横比。我还将使用glOrtho函数创建

我在这里详细描述了我的问题:

我的问题的基本要点是,让XNA表现得像我的OpenGL应用程序一样的最佳方法是什么,因为我希望内容拉伸以根据我设计的比例而不是实际的窗口大小填充窗口

更多信息,此问题与不同的窗口或视口大小有关。在我以前的OpenGL应用程序中,我允许用户在窗口模式和全屏模式之间切换,还允许调整窗口大小。我在使用XNA时遇到的问题是处理不同的全屏和窗口大小。在OpenGL中,我会在调整窗口大小时检测一个窗口,并调整视口,使视野始终固定为分辨率纵横比。我还将使用glOrtho函数创建一个固定分辨率的二维投影图


我使用SpriteBatch和SpriteFont处理的XNA示例,文本和精灵似乎以屏幕像素呈现。也就是说,所有2D输出都使用方形像素渲染,而不进行拉伸。在我的XNA应用程序中,我希望它们能按我设计的比例伸展以填充窗口。我的问题是,如何才能像我在OpenGL中所做的那样,在XNA中最好地完成2D和3D拉伸和填充

对于使用
BasicEffect
3D内容(以及实现
ieffectmatrix
的其他效果,如前所述),您可以使用适当的成员设置您的世界、视图和投影矩阵

因此,在OpenGL代码中,您有以下内容:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(FieldOfView, Width / Height, 1, 1000);
XNA中的等效方法是在效果上设置投影矩阵,如下所示:

effect.Projection = Matrix.CreatePerspectiveFieldOfView(
        FieldOfView, Width / Height, 1, 1000);

现在,对于2D。以下是您在OpenGL中可能拥有的功能:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 0, 1);
如果您使用的是效果(即使使用了
SpriteBatch
,如前所述),其基本思想与3D相同:

effect.Projection = Matrix.CreateOrthographicOffCenter(
        0, width, height, 0, 0, 1);

现在,如果您使用的
SpriteBatch
没有自定义效果(如果您实际上不需要自定义效果,我建议这样做),您必须记住,默认情况下,
SpriteBatch
使用的投影相当于:

effect.Projection = Matrix.CreateTranslation(-0.5f, -0.5f, 0)
        * Matrix.CreateOrthographicOffCenter(0,
        GraphicsDevice.Viewport.Width,
        GraphicsDevice.Viewport.Height, 0, 0, 1);
它给出了一个“客户空间”(左上角是(0,0))坐标系,与像素中心对齐

如果要调整该空间,可以将变换矩阵传递到
SpriteBatch.Begin
()

因此,为了获得您想要的效果(在屏幕上显示固定数量的世界单位,无论屏幕大小),您可以使用此转换来对抗客户端空间的内置投影:

Matrix.CreateScale(GraphicsDevice.Viewport.Width / 640f,
        GraphicsDevice.Viewport.Height / 480f, 1f);
(假设您希望可见世界空间为640 x 480。)



我建议您浏览一下文档,看看您可以创建什么类型的矩阵。

对于2D绘图,我将其添加到LoadContent()方法中,其中效果是我游戏类中的私有字段

effect = new BasicEffect(GraphicsDevice)
{
  TextureEnabled = true,
  VertexColorEnabled = true
};
然后在我的Draw()方法中添加了这个

effect.Projection = Matrix.CreateTranslation(-0.5f, -0.5f, 0) * 
  Matrix.CreateOrthographicOffCenter(0, 640, 480, 0, 0, 1);
batch.Begin(0, null, null, null, RasterizerState.CullNone, effect); 

它似乎工作得很好。现在,调整窗口大小时,二维图像和字体的比例正确。您建议不要使用自定义效果。创建BasicEffect实例是您的意思,还是其他意思?也就是说,我不知道如何在不使用效果实例的情况下创建自定义项目矩阵。

为此,请编辑您的问题,以包含您博客文章中的更多详细信息。SpriteBatch.Begin的最后一个参数是一个转换(而不是投影)矩阵,其形式为指定了所有参数()。我会使用它,而不是创建一个基本的效果。只需传递
null
即可获得效果。好的,谢谢。不过我得把你的除法倒过来。它应该是:Matrix.CreateScale((float)GraphicsDevice.Viewport.Width/640f,(float)GraphicsDevice.Viewport.Height/480f,1f);