Преобразование карты высот в сетку для рендеринга в XNA для WP7
Я уверен, что большинство из вас знает, что 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 ответ
Прежде всего, отсутствие пользовательских шейдеров не означает, что вы не можете рисовать с необработанными вершинами / индексами. На самом деле вы можете на WP7. Это означает, что вы не можете контролировать исходный пиксельный вывод (пиксельный шейдер) или писать код, который изменяет проекционное отображение каждой отдельной вершины на экран (вершинный шейдер). Существуют и другие виды шейдеров на разных этапах всего конвейера, но ни один из них не имеет ничего общего с сообщением графической карте, какие вершины и индексы использовать. Вы делаете это сами в коде игры. Фактически они (или, скорее, данные, взятые из них по цепочке) используются в качестве входных данных для шейдеров (среди прочего).
Тем не менее, вы все еще можете создавать вершины самостоятельно, в коде игры. И даже манипулировать ими тоже, если хотите, в определенной степени. Не требует никаких шейдеров для генерации вершин и индексов и их отрисовки даже в WP7. Не использовать Model
за это; это излишне
Ты можешь использовать GetData
на вашей текстуре, чтобы получить ее значения цвета, и просто сгенерировать массив вершин (VertexPositionColor
или текстуру, или любой другой формат, который вы хотите) на основе значения цвета каждого пикселя. Здесь есть учебник, в котором изложено все, что вам нужно сделать. Почти все там будет работать как есть на WP7, кроме параметров эффекта; сопоставить их вместо BasicEffect
или т.п. Там нет пользовательских шейдеров.
Постскриптум: Вы должны ознакомиться с основами трехмерной графики, с точки зрения того, что делают шейдеры, для чего предназначены вершины, и на самом деле для всего конвейера, чтобы лучше понять. Есть много хороших статей, блогов и книг.