Следите за этим недавним вопросом .
Я занимаюсь программированием GPGPU в WebGL2, и я передаю большой 4-мерный квадратный массив моим шейдерам, упаковывая его в текстуру, чтобы обойти пределы единого счета. Освободившись от необходимости использовать сравнительно небольшой массив фиксированного размера, я хотел бы иметь возможность указать размер данных, которые фактически передаются программно.
Ранее я жестко запрограммировал размер данных для чтения, используя const int
следующим образом:
const int SIZE = 5;
const int SIZE2 = SIZE*SIZE;
const int SIZE3 = SIZE2*SIZE;
uniform sampler2D u_map;
int get_cell(vec4 m){
ivec4 i = ivec4(mod(m,float(SIZE)));
float r = texelFetch(u_map, ivec2(i.x*SIZE3+i.y*SIZE2+i.z*SIZE+i.w, 0), 0).r;
return int(r * 255.0);
}
Если я обновлю SIZE2
и SIZE3
, чтобы они были непостоянными и инициализировались в main, это все равно будет работать:
const int SIZE = 5;
int SIZE2;
int SIZE3;
uniform sampler2D u_map;
int get_cell(vec4 m){
ivec4 i = ivec4(mod(m,float(SIZE)));
float r = texelFetch(u_map, ivec2(i.x*SIZE3+i.y*SIZE2+i.z*SIZE+i.w, 0), 0).r;
return int(r * 255.0);
}
...
void main(){
SIZE2 = SIZE*SIZE;
SIZE3 = SIZE*SIZE2;
...
}
Однако, если я тогда заменю const int SIZE = 5;
на uniform int SIZE;
, а затем добавлю
const size_loc = gl.getUniformLocation(program, "SIZE");
gl.uniform1i(size_loc, 5);
в сторону JavaScript, чтобы установить его в то же целочисленное значение, которое раньше было жестко закодировано, я начинаю видеть неправильные значения, считываемые из текстуры. Что я делаю не так?
ОБНОВЛЕНИЕ 1: Я провел небольшой эксперимент, в котором я сохраняю постоянную SIZE
спецификацию, но затем также передаю единообразное int вместе с ней. Если они не равны, шейдер выручает и возвращает все нули. Таким образом, я мог бы проверить, что правильные целочисленные значения на самом деле устанавливаются для равномерной переменной, но если я тогда сделаю SIZE
непостоянной, и установите для нее значение универсальной переменной , с которой оно только что сравнили и нашли равным тогда все сломалось. Какого черта?
ОБНОВЛЕНИЕ 2:
Это работает:
int SIZE = 5;
uniform int u_size;
....
void main() {
if (u_size != SIZE) return;
SIZE = u_size;
...
}
Это не так:
int SIZE = 5;
uniform int u_size;
....
void main() {
SIZE = u_size;
...
}