Я пытаюсь заставить систему ландшафта 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
Создайте одномерный буфер для текстуры
- width = 8 * 4 = 32 floats, or 32 * 4 = 32 bytes large
- fill the float buffer like this:
[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]
Создайте одномерный сэмплер для текстуры
- min filter = nearest, no mip maps
- mag filter = nearest
- wrap mode = clamp to edge
В 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;
}
Но он сломан.
Что я делаю неправильно?