Войти
UnityФорумПрограммирование

Unity3D : стоит ли заменять terrain на меш? (2 стр)

Страницы: 1 2 3 Следующая »
#15
18:22, 2 фев. 2020

pahaa

не пались, а?


#16
20:33, 2 фев. 2020

pahaa
> и в шейдерах обрабатывать нужно будет не 100500 вершин, а 1 текстуру
facepalm

#17
21:24, 2 фев. 2020

pahaa
> не совсем чёткое понятие, рендерится, в любом случае, изображение
> 100500 вершин из меша в буфер биндить не понадобится, понадобится биндить 1 текстуру, и в шейдерах обрабатывать нужно > будет не 100500 вершин, а 1 текстуру - совершенно другой подход к отрисовке, и разница вполне очевидна, не понимаю, как можно её отрицать

Я чего-то не понимаю, обьясните как конвеер это будет рисовать?

#18
21:27, 2 фев. 2020

Alerr

он просто так

#19
11:34, 3 фев. 2020

Alerr
> Я чего-то не понимаю, обьясните как конвеер это будет рисовать?
Достаточно открыть официальную документацию

#20
12:07, 3 фев. 2020

pahaa
последний раз прошу - уйди из темы

#21
13:00, 3 фев. 2020

pahaa
> Достаточно открыть официальную документацию
Достаточно открыть шейдер и убедиться, что там используется обычный меш, а карта высот при инстансинге только морфит этот меш в обычном вертексном шейдере. Внезапно, правда?

appdata_base ApplyMeshModification(appdata_base input)
{
  #ifdef UNITY_INSTANCING_ENABLED
  float2 patchVertex = input.vertex.xy;
  float4 instanceData = UNITY_ACCESS_INSTANCED_PROP(Terrain, _TerrainPatchInstanceData);
           
  float2 sampleCoords = (patchVertex.xy + instanceData.xy) * instanceData.z; // (xy + float2(xBase,yBase)) * skipScale
  input.texcoord = float4(sampleCoords.xy * _TerrainHeightmapRecipSize.z, 0, 0);
  float height = UnpackHeightmap(tex2Dlod(_TerrainHeightmapTexture, input.texcoord));
       
  input.vertex.xz = sampleCoords * _TerrainHeightmapScale.xz;
  input.vertex.y = height * _TerrainHeightmapScale.y;
       
  input.normal= tex2Dlod(_TerrainNormalmapTexture, input.texcoord).rgb * 2 - 1;
  #endif
       
  return input;
}
#22
14:34, 3 фев. 2020

pahaa
>Достаточно открыть официальную документацию

И куда там нужно обратить внимание ?
Где описание конвеера?

PS: мне просто интересно о чем вы говорите, я представления не имею как это должно работать XD ?

#23
12:35, 5 фев. 2020

Alerr
> Где описание конвеера?
Про то, как это работает, вот хорошая статья: https://habr.com/ru/post/352962/
Если вкратце, то в террейн рендерится по кусочкам, геометрия строится из одинаковых примитивов на основе карты высот уже внутри самого шейдера

foxes
> А что unity перестал поддерживать WebGL и прочие платформы не позволяющие
> считать меш на GPU?
кстати, случайно наткнулся (не знаю, насколько правда) https://docs.unity3d.com/Manual/GPUInstancing.html:

GPU Instancing is available on the following platforms and APIs:

    DirectX 11 and DirectX 12 on Windows

    OpenGL Core 4.1+/ES3.0+ on Windows, macOS, Linux, iOS
    and Android

    Metal on macOS and iOS

    Vulkan on Windows, Linux and Android

    PlayStation 4
    and Xbox One

    WebGL
    (requires WebGL 2.0 API)

Dampire
> Внезапно, правда?
Ну, как бы очевидно, что делается это в вершинном шейдере. Но 100500 вершин меша террейна от этого биндить необходимости не появляется. Есть разница между квадратом из 4 вершин и полноценным мешем, не?

#24
12:40, 5 фев. 2020

pahaa
> Ну, как бы очевидно, что делается это в вершинном шейдере. Но 100500 вершин
> меша террейна от этого биндить необходимости не появляется. Есть разница между
> квадратом из 4 вершин и полноценным мешем, не?
Ох лол. Прочитай шейдер, экспертиссимо. Где ты там увидел генерацию 100500 вершин из 4? Если не можешь прочитать даже 10 строчек шейдера - умолкни и не ври людям.

#25
13:12, 5 фев. 2020

pahaa
> Есть разница между квадратом из 4 вершин и полноценным мешем, не?

расскажи про тесселяцию

#26
(Правка: 13:50) 13:50, 5 фев. 2020

pahaa
> Есть разница между квадратом из 4 вершин и полноценным мешем, не?
А есть квадраты не из 4 вершин?
Тогда получается что квадраты и треугольники не меши? К чему их тогда относить?
В директе и огл нету метода рендер меш, есть рендер квада и рендер треугольника.

#27
(Правка: 4:19) 4:15, 6 фев. 2020

Dampire
> Ох лол. Прочитай шейдер, экспертиссимо.
Ты содержимое вершинного буффера из шейдера определил?
Террейн:

+ Показать

Уберём в этой функции содержимое блока #ifdef UNITY_INSTANCING_ENABLED
И получим меш, из которого он рендерится:
+ Показать

Как я и написал: 4 вершины.

Anders333
> есть рендер квада и рендер треугольника.
А ещё есть бинд вершинного буффера с указанием количества передаваемых в видеокарту данных в байтах
Anders333
> К чему их тогда относить?
Можно к полигонам или примитивам относить.

#28
(Правка: 11:48) 11:46, 6 фев. 2020

pahaa
> Как я и написал: 4 вершины.
О неет. 4 вершины! Мы посрамлены!

+ Показать

Для тех, кому интересно как на самом деле рисуется террейн при инстансинге. Инфа +- правдивая, точной реализации я не знаю, но шейдеры для террейна писал.
Террейн рисуется патчами. Детализация патча выбирается от дистанции отрисовки, разнообразности  (нет нужны на плоский патч заливать тысячи вершин) карты высот на этом участке и настроек качества, само собой. Для инстансинга генерируются несколько патчей с разной детализацией. Во время инстанцированной отрисовки пачками засылаются патчи с одинаковой детализацией и на основе height-мапы и пары параметров они морфятся в вершинном шейдере. Никакой генерации вершин на GPU нет, они просто смещаются. Это не тесселяция. Без инстансинга эти патчи, уникальные для каждого сектора террейна и генерятся на CPU.  Вот и вся разница между инстансингом и не инстансингом.

#29
(Правка: 16:57) 16:55, 6 фев. 2020

Dampire
> О неет. 4 вершины! Мы посрамлены!
То есть берется меш 16x16 квадов и копипастится инстансингом, с выдавливанием высоты из разных участков карты высот. Тобиш таких мешей становиться не один, а NxN (чанков) и каждый 16x16 квадов.

Страницы: 1 2 3 Следующая »
UnityФорумПрограммирование