Если я вас правильно понимаю, вот что мой первый выстрел будет:
Ваша проблема, более или менее, состоит в том, как распределить вашу личную стоимость по вершинам. На самом деле это похоже на генерацию нормалей в сетке: сначала вы должны сгенерировать нормаль для каждого треугольника, а затем вычислить их для каждой вершины. Google "нормальное поколение", и вы получите, но вот суть. Для каждого соседнего треугольника найдите весовой коэффициент (часто угол угла, который использует вершину, или площадь поверхности треугольника, или комбинацию), а затем суммируйте умноженное значение (будь то нормальное или ваши «сильные стороны») по весовому коэффициенту до общего результата. Нормализовать и все готово.
Итак, у вас есть «сильные стороны» текстур, которые вы можете отправить в ваш вершинный шейдер. Современное решение состоит в том, чтобы использовать символы и сэмплировать массив текстур в пиксельном шейдере, после того как вы немного подстроили значения наложения, чтобы получить более приятные передачи.
Итак, если я правильно понял вашу проблему:
Preprocess:
forearch vertex in mesh
vertexvalue = 0
normalization = 0
foreach adjacent triangle of vertex
angle = calculateAngleBetween3Vertices(vertex,triangle.someothervertex,triangle.theotherothervertex)
vertexvalue += triangle.value * angle
normalization += angle
vertexvalue/=normalization
Время рендеринга:
передать значение (я) каждой вершины во фрагментный шейдер и сделать это в фрагментном шейдере:
basecolour = 0;
foreach value
basecolour = mix(basecolour, texture2D(textureSamplerForThisValue,uv), value)
//this is simple, but we could do better once we have this working
Или, в качестве альтернативы, вы можете внимательно посмотреть на свою геометрию. Если у вас есть комбинация больших треугольников и маленьких, у вас будет неравный разброс данных, и, поскольку ваши данные относятся к вершине, у вас будет больше деталей, где это больше геометрии. В этом случае вы, вероятно, захотите сделать то, что делают все остальные, и отделить текстуру от вашей геометрии с помощью смешанных карт. Они могут иметь низкое разрешение и не должны сильно увеличивать потребление памяти или время выполнения шейдеров.