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

Решение проблемы разрывов при визуализации ландшафтов с LOD - уровнями (комментарии) (10 стр)

Страницы: 15 6 7 8 9 10
#135
17:01, 12 фев 2010

Z
> Да, упрощения геометрии у нас нет.

непорядок :)

впрочем, у нас ещё хуже - лодов не завзли совсем, но можно вручную менять разбиение для отдельных подчастей

только это не симплификация - а просто разная грануляция исходной карты высот

#136
19:34, 12 фев 2010

Я думал как мне сделать ландшафт и в голову пришла мысль.
что если каждой вершине в атрибутах присвоить номер 'индекс'. а координаты ее оставить любые они буду вычислять в шейдере.
тогда в шейдер нужно передать карту высот и номера 'квадрат' и тип  стыковки с соседями.
по индексу можно определить номер квадрата поделив на кол-во вершин в квадрате- отсюда получаем тип, лвл, правило стыковки, его координаты
если взять остаток от деления получаем индекс вершины  в 'квадрат' отсюда  получаем x,z и из карты высот с нужны лвл получаем y.

Как щас в современных карта работают конвейеры?
Например у меня в шейдере будет по условию цикл(тяжелый).
на обработку поступили 100 вершин(пусть будет вершинный шейдер) и тока в одной из них произошел тяжелый случай сработал цикл.
Вопрос все остальные конвейеры будут ждать пока обработается данная вершина или начнут обрабатывать другие?

#137
23:51, 12 фев 2010

susageP
> что если каждой вершине в атрибутах присвоить номер 'индекс'.
так и есть на sm4.0

#138
0:38, 14 фев 2010

innuendo
>>так и есть на sm4.0
наверно я в этом не понимаю... тока изучаю

набросал я вершинный шейдер

#extension GL_EXT_gpu_shader4 : enable    // turn off warning
//#version 120 
attribute ivec2 index;
uniform sampler1D territoryLodMap;
uniform sampler1D territoryLods;
const int sizeLod = 32;

varying vec4 color;

void main()
{ 
  mat2 d;
  vec4 vertex;
  vertex = gl_Vertex;
  vec2 locPos;
  vec4 lodInfo;
  float scale;
  locPos = texture1DLod(territoryLodMap, float(index.x)/1024.0,0.0).xy;
  lodInfo = texture1DLod(territoryLods, float(index.y)/1024.0,0.0);
  scale = sizeLod*lodInfo.z;
  vertex.x = locPos.x*scale + lodInfo.x;
  vertex.y = locPos.y*scale + lodInfo.y;
  vertex.z = gl_Vertex.z;
  
   vec3 vnNormal = normalize(gl_NormalMatrix * gl_Normal);  
  vec3 vnLight0 = normalize(vec3(gl_LightSource[0].position-gl_ModelViewMatrix*gl_Vertex));
   float fNormal_Light0 = clamp(dot(vnNormal,vnLight0),0.0,1.0);
  color = vec4(1.0,1.0,1.0,1.0)*min(0.1+fNormal_Light0,1.0);
  gl_FrontColor = color;
   gl_Position = gl_ModelViewProjectionMatrix*vertex;
   gl_TexCoord[0].x = float(index.x%10);
}

в нем особа ничего нет сам алгоритм реализован не полностью но уже основное есть

  locPos = texture1DLod(territoryLodMap, float(index.x)/1024.0,0.0).xy;
  lodInfo = texture1DLod(territoryLods, float(index.y)/1024.0,0.0);
  scale = sizeLod*lodInfo.z;
  vertex.x = locPos.x*scale + lodInfo.x;
  vertex.y = locPos.y*scale + lodInfo.y;

в каждой вершине есть атрибут index в которой храниться ее номер в лоде и номер самого лода.

  lodInfo = texture1DLod(territoryLods, float(index.y)/1024.0,0.0);

берется информация об лоде (x,y,z,w) - (позиция лода X, позиция лода Y, масштаб лода lvl, тип лода (пока не используеться))

  locPos = texture1DLod(territoryLodMap, float(index.x)/1024.0,0.0).xy;

берется позиция вершины в лоде.
territoryLodMap - карта лода, задает сетку в лоде может быть любая треугольная, квадратная...  текстура  статичная на каждом кадре не изменяеться.
territoryLods - текстура в которой описаны какие лоды надо выводить...
в итоге получается нужно всегда посылать на рейдер одни и теже вершины неизменяемые а количество определяется из видимых лодов, a territoryLods изменяется не каждый кадр.


Можно как нибудь обратиться к текстуре по целочисленной позиции а то приходиться делить на размер текстуры?

#139
0:52, 14 фев 2010

susageP
> наверно я в этом не понимаю... тока изучаю
есть gl_VertexID

> Можно как нибудь обратиться к текстуре по целочисленной позиции а то
> приходиться делить на размер текстуры?

есть выборка texture2D*Offset без фильтрации, вместо texture1DLod можно и TBO

Страницы: 15 6 7 8 9 10
ПрограммированиеФорумГрафика

Тема в архиве.