在 XNA 中使用 CreateOrthographicOffCenter
Posted
技术标签:
【中文标题】在 XNA 中使用 CreateOrthographicOffCenter【英文标题】:Using CreateOrthographicOffCenter in XNA 【发布时间】:2011-03-02 10:20:06 【问题描述】:我正在尝试弄清楚如何在 XNA 中绘制图形,而其他人建议这样做。 但在我尝试使用它之前...
如果我创建并使用这个相机,并将 LEFT,TOP 设置为 0 并且 WIDTH=256 和 HEIGHT=240,我渲染到屏幕上的任何东西都会使用这些坐标吗?那么一个宽高为 1 的盒子,如果设置为 0,0 会占用 0,0 到 1,1 的空间吗?
【问题讨论】:
【参考方案1】:你指的函数是:Matrix.CreateOrthographicOffCenter(left, right, bottom, top, zNearPlane, zFarPlane)
。
这将返回一个投影矩阵,可用于将世界空间中的一个点转换为投影空间中的一个点。
投影空间从视口左下角的 (-1,-1) 到右上角的 (1,1)。这是 GPU 在栅格化时实际工作的坐标空间。
世界空间是你想要的任何东西。
假设您使用Matrix.CreateOrthographicOffCenter(0, 256, 240, 0, -10, 10)
创建了一个矩阵,并使用该矩阵作为投影矩阵,使用 BasicEffect 绘制立方体模型。假设立方体的模型以原点为中心,大小为 1(长度、宽度和高度)。
除了basicEffect.Projection
,您还可以设置basicEffect.View = Matrix.Identity
(因为我们不需要额外的相机转换)和basicEffect.World = Matrix.CreateTranslation(0.5f, 0.5f, 0)
来转换您的模型,使其从(0,0) 存在到(1, 1)在世界空间中。然后使用 BasicEffect 绘制模型。
立方体的顶面(正交投影意味着没有透视)将绘制在视口的左上角。它将占据视口宽度的 1/256 和高度的 1/240(另请参见 GraphicsDevice.Viewport
)。
(PS:我不记得背面剔除是如何受这种投影影响的。如果你什么也没看到,请尝试将其关闭或切换缠绕顺序。)
现在,话虽如此 - 我从您的其他问题(以及您想要制作正交矩阵的事实)中了解到您想要进行 2D 精灵工作。 BasicEffect 主要是为进行 3D 工作而设计的(尽管如果您制作自己的顶点着色器,不推荐用于精灵,您将需要一个投影矩阵)。
您可能想要使用 XNA 的 SpriteBatch - 尤其是因为它高度针对绘制精灵进行了优化。 SpriteBatch.Begin
将采用 Matrix transformMatrix
作为参数。这相当于上面的 World 和 View 矩阵,不是 Projection 矩阵。
SpriteBatch 假设您的世界空间与客户空间相同(左上角是 (0,0),宽度和高度是视口的大小)并为您处理投影。 (实际上它比这更高级 - 它会为您应用偏移量,以便精灵像素与屏幕像素对齐。)
如果您想绘制精灵,使世界在视口中显示为 256 单位宽和 240 单位高,您可以将这样的矩阵传递给 SpriteBatch.Begin
:
Matrix.CreateScale(viewport.Width / 256f, viewport.Height / 240f, 1f)
值得注意的是,在新的 XNA 4.0 中,您可以use SpriteBatch to draw with custom vertex shaders,因此您可以使用任意的世界观投影矩阵。
【讨论】:
嘿安德鲁!谢谢你的回答。我在心跳中接受了它。无论如何,我之前尝试过使用 SpriteBatch,但它会阻塞并死掉将精灵绘制到屏幕上。我更喜欢一次绘制一个像素的精灵,或者至少我正在尝试这样做。有人建议我这样做....我尝试过的所有其他工作都是使用 SpriteBatch 进行的,所以我很清楚该类是如何工作的。谢谢! 不客气。我仍然非常怀疑您是否正确使用了 SpriteBatch,如果它只是窒息的话。真的没有比 SpriteBatch 更快的方法来绘制实际的精灵。你是否在一个批次中绘制所有东西,尽可能少的纹理(尝试精灵表?)并按纹理顺序? (顺便说一句:我粗略的计算表明,SpriteBatch 可以在 60FPS 时获得大约 20k 的精灵——如果你还在尝试做疯狂的每像素一个精灵的事情,这还不够。)跨度> 我至少花了一天时间尝试将 3D 图元渲染到 2D 空间,非常感谢您的回答! +1 表示“投影空间从视口左下角的 (-1,-1) 到右上角的 (1,1)。这是GPU 在光栅化时实际上可以工作。”非常有帮助。你知道有一个集中的资源可以解释关于 XNA 的“一切”吗?该文档有效,但它只是列出了它所具有的内容,而不是预期用途或所有内容如何组合在一起。以上是关于在 XNA 中使用 CreateOrthographicOffCenter的主要内容,如果未能解决你的问题,请参考以下文章