Доброго времени суток.
Пишу стратегию. Задача состоит в том, чтобы прорисовывать туман войны. Делаю через шейдеры ( начал изучать всего пару дней назад ).
В конце метода дро рисую сплошную заливку на весь экран таким способом :
sampler TextureSampler : register(s0); float2 center; float4 main(float2 texCoord : TEXCOORD0) : COLOR0 { float4 Color = tex2D(TextureSampler, texCoord); float dis = distance(texCoord, center); if(dis < 0.25f) Color = 0; return Color; } technique Refraction { pass Pass1 { PixelShader = compile ps_2_0 main(); } }
center - позиция объекта
Для фиксированного кол-ва объектов, видимых на экране, всё работает отлично, но суть в том, что мы не знаем сколько их там будет. Число может достигать 1000. Массива такого размера в шейдере не сделать. Как решить проблему ? Может есть иные способы прорисовки тумана ? ( главное то, чтобы видимая область была кругом. Т.е. деление экрана на сектора не подходит )
P.S. большого опыта не имею.
Ответ нашёл :
kroll
To о чем тъ говориш - ето fog of war и exploration. Масив на всю карту надо только для exploration-а (т.е. где мъ уже побъвали), a fog of war - только в рамках екрана.
Для цели его апдейтить надо тоже только в етих же рамках, собирая всех юнитов и вообще видящих объектов в рамках екрана + максимальнъй радиус такого объекта. Потом можно отрендить в текстуру (черную), белъе круги там где есть объектъ. Ету текстуру проблендить с прежней такой-же (чтобъ плавно делать переход между ними), т.е. не строить ее на каждом кадре. Потом ету текстуру можно спроецировать на сцену сверху.
Определение видимъх объектов надо делать конечно логикой, т.е. виден ли вражеский юнит/домик или нет.
Но понять не могу как это сделать =( В теории понимаю но не могу сделать. Может подскажете несколькими строчками кода, или ссылочку на рендринг дадите ? Не могу найти ( может руки не оттуда ( ) В любом случае спасибо.
В OpenGL можно было сделать так. Пример на Delphi
Сначала рисуем игровое содержимое.
Поверх нее рисуем маску прозрачности:
glColorMask(False, False, False, False);
//Дырка
glBegin(GL_POLYGON);
glVertex3f(3.899, 0.3, -0.6);
glVertex3f(3.899, 0.3, 0.6);
glVertex3f(3.899, 1.2, 0.6);
glVertex3f(3.899, 1.2, -0.6);
glEnd;
glColorMask(True, True, True, True);
А потом рисуем черную текстуру на весь экран.
Может быть в XNA есть нечто подобное.
Вообщем я так и делал.. Почти так.. Я рисовал белые круги там, где находятся объекты. Затем делал "скрин". Прорисовывал содержимое и наверх чёрную текстуру через шейдер с прозрачными областями там, где были белые круги. Всё вышло отлично, но появились дикие тормоза. Сейчас я отложил игру ненадолго т.к. занялся другим важным делом. Но как вернусь к нему буду думать что делать. Главное - тормоза в совершенно абсурдном месте, где рисуются круги 0_о. Юнитов могу ставить 1000 штук и ничего...нормально... А тут 20 кругов и тормоза.
PINEgrosbeak
Не рисуй круги. Рисуй квады с текстурой, на которой нарисован круг.
Да да, я рисую текстуру просто....Квадрат , точнее прямоугольник прозрачный на котором овал белый нарисован.... Но всё равно fps опускается до 15 когда на экране больше 10 объектов.
Тема в архиве.