Z
> Да, упрощения геометрии у нас нет.
непорядок :)
впрочем, у нас ещё хуже - лодов не завзли совсем, но можно вручную менять разбиение для отдельных подчастей
только это не симплификация - а просто разная грануляция исходной карты высот
Я думал как мне сделать ландшафт и в голову пришла мысль.
что если каждой вершине в атрибутах присвоить номер 'индекс'. а координаты ее оставить любые они буду вычислять в шейдере.
тогда в шейдер нужно передать карту высот и номера 'квадрат' и тип стыковки с соседями.
по индексу можно определить номер квадрата поделив на кол-во вершин в квадрате- отсюда получаем тип, лвл, правило стыковки, его координаты
если взять остаток от деления получаем индекс вершины в 'квадрат' отсюда получаем x,z и из карты высот с нужны лвл получаем y.
Как щас в современных карта работают конвейеры?
Например у меня в шейдере будет по условию цикл(тяжелый).
на обработку поступили 100 вершин(пусть будет вершинный шейдер) и тока в одной из них произошел тяжелый случай сработал цикл.
Вопрос все остальные конвейеры будут ждать пока обработается данная вершина или начнут обрабатывать другие?
susageP
> что если каждой вершине в атрибутах присвоить номер 'индекс'.
так и есть на sm4.0
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 изменяется не каждый кадр.
Можно как нибудь обратиться к текстуре по целочисленной позиции а то приходиться делить на размер текстуры?
susageP
> наверно я в этом не понимаю... тока изучаю
есть gl_VertexID
> Можно как нибудь обратиться к текстуре по целочисленной позиции а то
> приходиться делить на размер текстуры?
есть выборка texture2D*Offset без фильтрации, вместо texture1DLod можно и TBO
Тема в архиве.