0

我相信你们中的大多数人都知道 WP7 不支持自定义着色器文件,除非我遗漏了一些东西,这意味着我不能像在 Windows 上那样从顶点和索引数据中绘制任何东西,我需要使用从其他数据类型中加载或解析的模型。

我正在寻找的是一种获取模型变量和高度图位图(可能作为 Texture2D 加载)并根据灰度值为每个像素创建一个顶点的方法,从一个函数构造函数变量。

以下是我在游戏中绘制模型的函数供参考:

protected void DrawMesh(Model myMesh, Vector3 meshPos, float meshRot)
{
    // Copy any parent transforms
    Matrix[] transforms = new Matrix[myMesh.Bones.Count];
    myMesh.CopyAbsoluteBoneTransformsTo(transforms);

    // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myMesh.Meshes)
    {
        // This is where the mesh orientation is set, as well 
        // as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.View = camera.View;
            effect.World = transforms[mesh.ParentBone.Index] * Matrix.CreateRotationY(MathHelper.ToRadians(meshRot)) * Matrix.CreateTranslation(meshPos);
            effect.Projection = camera.Projection;
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();

    }
}

有谁知道我怎么能相当简单地做到这一点?在我理解这个过程之前,我不想让多个文件过于复杂。

谢谢!

-瑞安

4

1 回答 1

1

首先,缺少自定义着色器并不意味着您不能使用原始顶点/索引进行绘制。事实上你可以在 WP7 上。这意味着您无法控制原始像素输出(像素着色器),或编写代码来更改每个单独顶点的投影映射到屏幕(顶点着色器)。在整个管道的各个阶段也有其他类型的着色器,但它们都与告诉显卡使用哪些顶点和索引无关。您自己在游戏代码中执行此操作。事实上,它们(或者更确切地说,从它们中获取的数据)被用作着色器的输入(除其他外)。

也就是说,您仍然可以在游戏代码中自己生成顶点。如果您愿意,甚至可以在一定程度上操纵它们。即使在 WP7 上,也不需要任何着色器来生成顶点和索引并绘制它们。不要Model用于此;这是矫枉过正。

您可以使用GetData纹理来获取其颜色值,并根据每个像素的颜色值简单地生成一个顶点数组(VertexPositionColor,或纹理,或您希望的任何其他格式)。有一个教程列出了您需要在这里做的所有事情。除了效果参数外,几乎所有的东西都可以在 WP7 上按原样工作;将它们映射到 aBasicEffect等。其中没有自定义着色器。

后记:您应该阅读 3D 图形的基础知识,了解着色器的作用与顶点的用途,以及整个管道,以获得更好的理解。那里有很多好的文章、博客和书籍。

于 2013-04-09T21:26:30.587 回答