Войти
ПрограммированиеФорумГрафика

Рендер как в Minecraft-е - кто нибудь знает основные "секреты"? (11 стр)

Страницы: 110 11 12 13101 Следующая »
#150
(Правка: 15:30) 13:04, 26 июня 2012

alexzzzz

Vertex colors ― это просто числа. Как их использовать решает шейдер. Я передаю в шейдер параметр «яркость солнца», и он сам решает, как должны быть освещены вершины в зависимости от их vertex colors и «яркости солнца».

У тебя тени рассчитываются в зависимости от направления солнца?

susageP
Я раньше пробовал немного "закруглять" ландшафт, для этого расчитывал дистанцию чанка от камеры и позиционировал отрисовку по Y. Получалось вполне съедобно, если нет необходимости подниматься над планетой.


#151
13:07, 26 июня 2012

susageP
> если юзаешь MS то можно просто на sampl маску сделать чтобы только нужные
> выборки использовал.

Я в такие глубины не лез, смутно (не)понимаю, как работает мультисемплинг, да у меня и доступа туда нет.

Но есть вопрос: можно ли менять sample pattern в зависимости от угла наклона поверхности к камере и в зависимости от удаления поверхности от камеры? Первое позволяет сделать эффект Френеля, а второе -- видеть оба полупрозрачных объекта, если даже один полностью заслоняет другой.

#152
14:38, 26 июня 2012

alexzzzz
> Но есть вопрос: можно ли менять sample pattern в зависимости от угла наклона
> поверхности к камере и в зависимости от удаления поверхности от камеры? Первое
> позволяет сделать эффект Френеля, а второе -- видеть оба полупрозрачных
> объекта, если даже один полностью заслоняет другой.

я только изучаю, ну судя поэтому out int gl_SampleMask[];  получается в шейдере можно решить куда писать цвет.

#153
(Правка: 18:37) 17:18, 26 июня 2012

alexzzzz
> 1. Каждый непустой блок вокруг вершины слегка тянет эту вершину к себе. Для
> каждой вершины просматриваю все восемь смежных блоков и считаю итоговое
> смещение.
>
> 2. Чтобы убрать длинные прямые линии добавляю к позиции каждой вершины немного
> шума Перлина. Есть функция трёхмерного шума: float Noise(x, y, z), на вход
> подаю мировые координаты вершины, на выходе получаю смещение вдоль оси
> координат. Т.к. осей координат три, то для каждой оси использую свой шум со
> своим seed'ом.

Очень понравился эффект.

Думаю добавить для себя что-то похожее. Если блоки прилегают друг к другу, они сохраняют своё положение. Если вокруг есть пустые, смещаемся на 0.2 в зависимости от расположения вершины к пустому блоку, как показано на рисунке. Смещение получается постоянным и легко высчитывается для каждой из вершин, без необходимости кешировать расчёты.
Блоки получатся покатые на склонах.

TerrainDistort | Рендер как в Minecraft-е - кто нибудь знает основные "секреты"?

Рисунок 1. Вид сверху

Как думаешь, алгоритм имеет право на жизнь?

#154
(Правка: 19:49) 19:48, 26 июня 2012

По описанию это практически то же, что у меня, только наоборот (у меня смещение не к пустому блоку, а к непустому) и без дополнительного шума.

Я себе завёл вспомогательный массивчик ― список коэффициентов смещения в зависимости от количества окружающих вершину непустых блоков (от 0 до 8):
float[] displacementCoeffs = new[] { 0f, .15f, .1f, .1f, 0, -.1f, -.1f, -.15f, 0 };

Теперь если хочется изменить силу или направление смещения вершин, просто меняю эти коэффициенты.

--
В среднем на смещение у меня тратится 0,7 миллисекунды на 1000 вершин (C#, 4ГГц). Наверняка можно ещё ускорить, но и так нормально, тем более что всё происходит в фоновых потоках.

#155
21:44, 26 июня 2012

alexzzzz
> Я себе завёл вспомогательный массивчик ― список коэффициентов смещения в
> зависимости от количества окружающих вершину непустых блоков (от 0 до 8):
Почему девять? Ведь каждую вершину окружают семь кубов. А ты "сцепляешь" вершины у соседних кубов или они по твоему алгоритму одинаково рассчитывают своё положение?

#156
(Правка: 22:12) 22:10, 26 июня 2012

fornetjob
> У тебя тени рассчитываются в зависимости от направления солнца?
Не могу назвать это тенями, потому что настоящих теней у меня вообще нет. Освещение воксельное. Свет от источника floodfill'ом заполняет все прозрачные блоки вокруг, с каждым шагом уменьшая интенсивность. Если свет обходит препятствие, то сзади него интенсивность оказывается меньше и естественным образом получается некое подобие затенения:

+ Показать

> Почему девять? Ведь каждую вершину окружают семь кубов.
Ноль кубов вокруг вершины бывает, если это вершина не ландшафта, а например, верхняя вершина плашки травы. Траву тоже приходится двигать, иначе она смотрится на искажённом ландшафте неестественно.

От одного до семи кубов вокруг вершины бывает понятно почему.

Восемь кубов вокруг вершины бывает, если, например, семь из них блоки камня, а один ― прозрачный блок стекла.


> А ты "сцепляешь" вершины у соседних кубов или они по твоему алгоритму одинаково
> рассчитывают своё положение?
Никак не сцепляю. По-моему, их быстрее обработать независимо, чем искать совпадения.

#157
22:14, 26 июня 2012

alexzzzz
подумай насчет взять случайного разброса, можно же взять функции rnd(x,y,z,id0,id1,..,idN) - которая при одних и тек же данных будет возвращать одноитоже 'случайное' число.
можно id0 считать идентификатором оси сдвига. 0-x,1-y,2-z.
id1 - считать идентификатором мира.

#158
(Правка: 22:35) 22:35, 26 июня 2012

susageP
Предполагаю, что рандом для каждой вершины может стать очень дорогим. Может лучше набить статический массив случайных чисел и обращаться к нему?

#159
(Правка: 22:45) 22:39, 26 июня 2012

Шум Перлина ещё дороже рандома, но неплохо работает.

У меня есть случайная составляющая:

1. Без искажения:

+ Показать

2. Искажение шумом Перлина высокой частоты (выглядит точь-в-точь как случайное для каждой вершины):

+ Показать

Выглядит угловато, но тоже есть свой шарм.

3. Искажение шумом Перлина низкой частоты:

+ Показать

4. Искажение сдвигом вершин в сторону непустых блоков или наоборот для сглаживания неровностей:

+ Показать

5. Пункты 3 и 4 в сумме (у шума чуть уменьшена амплитуда):

+ Показать

#160
11:31, 27 июня 2012

alexzzzz, а как ты делаешь пещеры? У меня есть одна идея. После того как сгенерировали карту высот и генерируем 3д массив, для каждого блока вызывать рандом перлина и если допустим рандом получился меньше нуля, то не создавать блок. Не знаю на что это будет похоже, но других идей нету)

#161
12:24, 27 июня 2012

WISHMASTER35
Ты так же как Нотч в своем блоге пишешь. Только у него еще зависимость от высоты была. Я так делал, получалось не очень, если честно.

#162
(Правка: 13:20) 12:37, 27 июня 2012

alexzzzz
> можно ли менять sample pattern
susageP
> я только изучаю, ну судя поэтому out int gl_SampleMask[]; получается в шейдере
> можно решить куда писать цвет.

Если не ошибаюсь - sample pattern суть расположение samples относительно пикселя, а  gl_SampleMask позволяет указывать маску для записи samples

по идее, нужно двигаться в сторону interpolateAt*

alexzzzz
> Первое позволяет сделать эффект Френеля

изложите точнее, а то непонятно :)

#163
12:59, 27 июня 2012

ArchiDevil, я тоже попробовал, но получился полнейший бред. Не знаю как нотч настроил, но генерация уровня мне похоже не по зубам( Хотя это выглядит и довольно просто.

#164
(Правка: 13:51) 13:50, 27 июня 2012

WISHMASTER35
> alexzzzz, а как ты делаешь пещеры?
У меня два варианта пещер. Один получается сам собой, второй делал специально для длинных узких пещер под землёй и накладывал их на уже готовый ландшафт.

Мой текущий ландшафт делается так:
1. Двумерным шумом делаем карту высот с небольшой амплитудой, чтобы получались луга, поля и холмы. Это будет высота h1.
2. Другим двумерным шумом делаем карту высот с большей амплитудой и частотой, чтобы получались большие холмы и горы. Это будет высота h2.
3. Всё что по-вертикали от 0 до h1 помечаем как землю.
4. Затем, по вертикали в диапазоне от h1 до h2 считаем значения трёхмерного шума Перлина. Если значение больше определённой константы, то в этом месте тоже будет земля, если меньше, то воздух.

В результате получается более-менее ровный ландшафт с отдельными горами и пещерами внутри этих гор.

Отдельные пещеры я делал так:
http://forum.unity3d.com/threads/63149-After-playing-minecraft...… =1#post660411

Выглядит так:
http://vimeo.com/27976287

Вот тут, в разделе Caves and Tunnels, описан с картинками другой вариант пещер:
http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

innuendo
> > Первое позволяет сделать эффект Френеля
> изложите точнее, а то непонятно :)

Если смотреть на воду или стекло перпендикулярно поверхности, то она должна быть почти полностью прозрачная. Если смотреть на ту же поверхность почти по касательной, то она должна стать почти полностью непрозрачной и даже отражающей. Поэтому для прозрачных материалов хорошо бы иметь возможность регулировать их видимую прозрачность в зависимости от угла поворота к камере.

Страницы: 110 11 12 13101 Следующая »
ПрограммированиеФорумГрафика