Я пытаюсь заставить систему местности Ardor3D работать на оборудовании SM3.0.
Текущий фрагментный шейдер GLSL использует единый массив vec2 для передачи массива координат xy в фрагментный шейдер.
Поскольку динамические индексированные однородные массивы работают только на оборудовании SM4.0 +, для его запуска на SM3.0 мне нужно заменить его на 1D-текстуру с плавающей точкой.
Текущий массив выглядит так:
uniform vec2 sliceOffset[8];
и доступен следующим образом:
vec2 offset = sliceOffset[int(unit)];
У меня большой опыт работы с OpenGL и GLSL, поэтому у меня возникли некоторые проблемы при конвертации.
Пока я сделал это:
Создайте 1D текстуру
- ширина = 8
- формат = RGBA32F
Создание 1D буфера для текстуры
- ширина = 8 * 4 = 32 поплавка или 32 * 4 = 32 байта большого размера
- заполнить буфер float следующим образом:
[x0,y0,0,0,x1,y1,0,0,x2,y2,0,0,x3,y3,0,0,x4,y4,0,0,x5,y5,0,0,x6,y6,0,0,x7,y7,0,0]
Создание 1D сэмплера для текстуры
- мин фильтр = ближайший, без карт MIP
- mag фильтр = ближайший
- режим обтекания = зажим к краю
В GLSL я определяю сэмплер как:
uniform sampler1D sliceOffset;
И доступ к нему:
vec2 getSliceOffset(float unit)
{
float texCoord = (unit * 2.0f + 1.0f) / (2.0f * 8.0f);
vec2 offset = texture1D(sliceOffset, texCoord);
return offset;
}
Но он сломан.
Что я делаю не так?