将高度图转换为网格以在XNA for WP7中进行渲染

时间:2013-04-09 13:15:44

标签: c# windows-phone-7 image-processing xna heightmap

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

    }
}

有谁知道我怎么能这么简单地做到这一点?在我理解这个过程之前,我宁愿不要使用多个文件使事情复杂化。

谢谢!

-Ryan

1 个答案:

答案 0 :(得分:1)

首先,缺少自定义着色器并不意味着您无法使用原始顶点/索引进行绘制。事实上你可以在WP7上。它意味着您无法控制原始像素输出(像素着色器),或编写将每个顶点的投影映射更改为屏幕(顶点着色器)的代码。在整个流水线的不同阶段也有其他类型的着色器,但它们都没有与告诉显卡哪个顶点和放大器有任何关系。要使用的指数。你可以在游戏代码中自己做。事实上,他们(或者更确切地说,从链中获取的数据)被用作着色器的输入(以及其他内容)。

也就是说,你仍然可以在游戏代码中自己生成顶点。如果你愿意,甚至可以在某种程度上操纵它们。不需要任何着色器来生成顶点和即使在WP7上,也可以将它们绘制成原始的。不要使用Model;这太过分了。

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

后脚本:你应该阅读3D图形的基础知识,关于着色器做什么与顶点的意图,以及真正的整个流程,以便更好地理解。那里有很多好文章,博客和书籍。