Навигация
· XNA FAQ
· С чего начать
· Конкурсы
· Обратная связь
· XNA Блоги
Сейчас на сайте
· Гостей: 1

· Пользователей: 0

· Всего пользователей: 3,684
· Новый пользователь: headron
Последние фото
Эх, чуть не проспал закрытие.
Эх, чуть не проспал ...
Альбом: XNA Engine

GB
GB
Альбом: XNA Engine

South Park Coon & Friends
South Park Coon & Fr...
Альбом: XNA Games

Блоги
yavshoke
» XboxOne - интерес...
dampirik
» Push уведомления ...
dampirik
» Реклама,статистик...
Chort
» XNA и StartCoroutine
Chort
» Curve Class
dampirik
» Реклама, статисти...
dampirik
» Увеличение скорос...
dampirik
» Реклама, статисти...
general
» Распаковка DxtCom...
general
» Как работать с XN...
Поддержка
microsoft.com
1gb.ru - Дом для вашего сайта
Статистика посещений:

RTS Terrain : Offset vs Blocks
В ситуациях когда есть большой ландшафт и тормоза, то можно использывать несколько способов их устранения. Например блоки, geo-mipmapping или другие LODы. Но реализация этих методов не всегда проста и понятна. Плюс некоторые методы могут не подходить вообще. Например в игре об уменьшении детализации не может быть и речи.

Метод (даже не метод, а хитрость) об котором я хочу рассказать прост, правда имеет свои недостатки. Метод предназначен только для равномерной, последовательной сетки. Суть метода в том, что все ячейки сетки одинаковы, то есть разница индексов треугольников ячейки равна  - 3 * faceNumberPerCell. Теперь вспомним что вторым ( третим и пятым ) параметром метода GraphicesDevice.DrawIndexedPrimitives и есть смещение. Поняли в чем дело? Правильно, мы будем смещать вертексы. Вот видете как все просто. Дальше немного кода.

Создание вертексного буфера

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private VertexBuffer CreateVetrexBuffer(int size, float[,] heightData)
{
	VertexPositionColor[] vertices = new VertexPositionColor[size * size];
 
	for (int x = 0; x < size; x++)
	{
		for (int y = 0; y < size; y++)
		{
			vertices[x * size + y].Position = new Vector3(x, heightData[x, y], y);
			vertices[x * size + y].Color = Color.White;
		}
	}
 
	VertexBuffer vBuffer = new VertexBuffer(this.GraphicsDevice,
		typeof(VertexPositionColor), vertices.Length, BufferUsage.None);
	vBuffer.SetData<VertexPositionColor>(vertices);
 
	return vBuffer;
}

 


Создание индексного буфера

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private IndexBuffer CreateIndexBuffer(int size, int viewSize)
{
	int counter = 0;
	int[] indices = new int[(viewSize - 1) * (viewSize - 1) * 6];
 
	for (int y = 0; y < viewSize - 1; y++)
	{
		for (int x = 0; x < viewSize - 1; x++)
		{
			indices[counter++] = x + (y + 1) * size;
			indices[counter++] = (x + 1) + y * size;
			indices[counter++] = x + y * size;
 
			indices[counter++] = x + (y + 1) * size;
			indices[counter++] = (x + 1) + (y + 1) * size;
			indices[counter++] = (x + 1) + y * size;
		}
	}
 
	IndexBuffer iBuffer = new IndexBuffer(this.GraphicsDevice, typeof(int), indices.Length, 
BufferUsage.None);
  iBuffer.SetData<int>(indices);   return iBuffer; }

 


И главное — отрисовка

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void DrawTerrain(int x, int y, int size, int viewSize)
{
	int index = x + y * size;
	int length = size * viewSize;
 
	m_effect.Begin();
 
	foreach (EffectPass pass in m_effect.CurrentTechnique.Passes)
	{
		pass.Begin();
 
		this.GraphicsDevice.Indices = m_indices;
		this.GraphicsDevice.Vertices[0].SetSource(m_vertices, 0, m_stride);
		this.GraphicsDevice.VertexDeclaration = m_vDeclaration;
 
		this.GraphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 
			index, 0, length, 0, m_facesCount);
 
		pass.End();
	}
 
	m_effect.End();
}

 


В результате мы отрисовываем только маленький квадратик сетки по позиции первой ячейки. Здесь я не делал проверки на правильность индексов, а ее надо делать иначе будет вам “exception”. Еще надо учитывать пересечение видимой области (квадратика) с краями.

P.S.
Данный метод можно попробовать совместить с LODами.

С уважением,
Байдалка Владимир ака Chort.
Комментарии
#1 | mike 26.02.2009 17:03:10
Хороший трюк, можно попробовать использовать его с камерой не всегда направленной строго вниз. Используя BoundingFrustum находим все клетки попадающие в камеру, затем ищем минимальный квадрат вмещающий в себя все эти клетки. Главное тут не перемудрить, ведь примитивы выходящие за область экрана и так отсекаются очень быстро на этапе scissor теста
#2 | general 06.03.2009 15:41:58
а я с лоадами сделал, долго мутил. получилась сказка. тестовая карта ~1310.720 км^2 с максимальной детализацийе 10 м^2, 12 лоадов, камера перемещается как угодно. если mike одобрит фотку в галерею, то она будет называться "Динамический ландшафт 2" там показанна итоговая сетка.
Добавить комментарий
Пожалуйста, залогиньтесь для добавления комментария.
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Авторизация
Логин

Пароль



Вы не зарегистрированы?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Мини-чат
Вы должны авторизироваться, чтобы добавить сообщение.

27.08.2014
Я умею немного на asp.net + html и css

22.08.2014
на ASP mvc 3 есть пару проектов. Могу помочь, если нужно. Обидно, если закроется Frown

21.08.2014
я тоже ноль

21.08.2014
Я в вебе только с php занимался да и то на уровне чтоб работало.

21.08.2014
Я в вебе полный ноль…

21.08.2014
Переводить его надо, хоть на ту же азуру. И двиг менять на что-то современное. Если есть веб-разрабы - можем скооперироваться. Один делать не буду.

21.08.2014
не знаю всех нюансов по оплате и все хорошее когда нибудь заканчивается

21.08.2014
А что случилось?

21.08.2014
похоже сайт будет работать до 28го числа

09.08.2014
Апи пока не видел. Но есть приложение в магазине Live Lock Screen BETA, так что думаю скоро будет

08.08.2014
Я про API для Update1. На нем работает это

08.08.2014
А что именно нужно? Чтото и сейчас открыто http://msdn.micro.
...105).aspx

06.08.2014
Кто-нибудь слышал об открытии доступа к Lock Screen Api?

31.07.2014
VPDExpress на базе MVS 2012, ни в какую не ловит исключения. Даже если их сам создаешь. И всех так?

25.07.2014
С днем системного администратора причастных к этой профессии! По случаю - тортик от жены

RSS каналы сайта
XNA - Новости
XNA - Статьи
XNA - Форум
XNA - Галерея
XNA - Файлы
Время загрузки: 0,05 секунд 8,709,658 уникальных посетителей