【问题标题】:vertexShader in a 2D game?2D游戏中的顶点着色器?
【发布时间】:2013-02-05 13:11:23
【问题描述】:

我搜索了一些学习 HLSL 的教程,我找到的每个教程都谈到了 VertexShader 和 PixelShader。 (教程以 3D 游戏为例)。

所以我不知道 vertexShader 是否对 2D 游戏有用。 据我所知,2D 游戏没有任何顶点对吧?

我必须使用着色器作为后期处理。
我的问题是:Could you tell me if I have to learn VertexShader for my 2D game ?

【问题讨论】:

    标签: c# xna directx 2d hlsl


    【解决方案1】:

    XNA(以及 Direct3D、OpenGL 等)中的 2D 图形是通过使用 正交 投影渲染本质上是 3D 场景来实现的,该投影基本上忽略了它投影的顶点的深度(事情不'不要随着他们越来越远而变小)。您可以使用Matrix.CreateOrthographic 创建自己的正交投影矩阵。

    虽然您可以通过这种方式渲染任意 3D 几何图形,但 sprite 渲染(例如 SpriteBatch)只是绘制面向相机的“四边形”(由 4 个顶点形成的 2 个三角形组成的正方形或矩形)。这些四边形具有 3D 坐标 - 正交投影只是忽略了 Z 轴。

    顶点着色器基本上在 GPU 上运行,并在它们形成的三角形被光栅化之前操纵您传入的顶点。您当然可以在这些用于 2D 渲染的顶点上使用顶点着色器。

    对于所有现代硬件,顶点变换——包括上面提到的正交投影变换——通常在顶点着色器中完成。这基本上是样板,在 2D 游戏中使用复杂的顶点着色器是不寻常的。但这并非闻所未闻——例如我自己的游戏Dark 使用顶点着色器来进行 2D 阴影投影。

    但是,如果您使用的是SpriteBatch,并且您想要的只是一个像素着色器,那么您可以从您的.fx 文件中省略VertexShader - 您的像素着色器仍然可以工作。 (要使用它,请将其加载为 Effect 并将其传递给 this overloadSpriteBatch.Begin)。

    如果你不替换它,SpriteBatch 将使用它的默认顶点着色器。你可以查看它的源代码here。它执行单个矩阵变换(传递的矩阵是正交投影矩阵,乘以传递给Begin 的可选矩阵)。

    【讨论】:

    • 谢谢安德鲁,像往常一样。例如,对于波纹(或冲击波效果),我可以在没有 vertexShader 的情况下创建这些效果吗?
    • 如果你使用SpriteBatch,是的。如果您自己绘制四边形,则需要提供(简单的)一个。
    【解决方案2】:

    不这么认为。如果您将注意力集中在2D 游戏上,您可能会避免学习着色器以完成您的项目。

    另一个选项可能是,在2D 中渲染在3D 中实际生成的场景,换句话说,您渲染@ 的投影 987654324@ 场景到某个表面。在这种情况下,您可能需要使用它们,特别是如果您想在没有 CPU 的情况下进行一些很酷的转换(通常也是唯一的选择)。

    希望这会有所帮助。

    【讨论】:

    • 我编辑了我的帖子以提高知名度。实际上,我想使用着色器,而我的游戏是 2D。正确的问题是“2D 游戏中有 Vertex 吗?”和“VertexShader 对 2D 游戏有用吗”? ^^
    • @Sharpnel:正如我所说,如果你渲染的是一个到(比如说)XY平面的投影,你绝对可以使用它们,所以可以对你的3D模型应用复杂的转换, 投影到 2D 表面并渲染到屏幕上。
    • 对你来说,什么是 2D 游戏中的 3D 模型?
    • 顶点着色器是一个沿着渲染/转换管道操作顶点(它的不同属性)的程序。所以基本上你可以生成一个网格模型,但是在 2D 表面上渲染它。您实际上忽略了 3D 世界的酷(透视)含义,但这是您可以做的事情。我从来没有这样做过,因为如果你想学习着色器,编写完整的 3D 程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多