在WP7的XNA中转换高度图到网格

本文关键字:高度 网格 转换 WP7 XNA | 更新日期: 2023-09-27 18:08:19

我相信你们大多数人都知道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();
    }
}

有谁知道我怎么能做到这一点相当简单吗?在我了解整个过程之前,我希望不要把多个文件弄得太复杂。

谢谢!

在WP7的XNA中转换高度图到网格

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

也就是说,你仍然可以在游戏代码中自己生成顶点。如果你愿意,甚至可以在一定程度上操纵它们。不需要任何着色器来生成顶点&索引和绘制它们的原始,甚至在WP7上。不要使用Model;这是多余。

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

Post-script:你应该阅读3D图形的基础知识,比如着色器的作用和顶点的作用,以及整个流程,以便更好地理解。这里有很多好的文章、博客和书籍。