Извините за мой предыдущий ответ. Я не выглядел достаточно близко.
Это похоже на ошибку в различных драйверах.
Я пробовал это
const vs = `#version 300 es
layout(location = 0) in vec4 position;
void main () {
gl_Position = position;
gl_PointSize = 128.0;
}
`;
function getFS(mode) {
return `#version 300 es
precision mediump float;
layout (location = 0) out vec4 my_FragColor;
layout(std140${mode}) uniform type_m2 {
mat4 mat;
} m2;
void main()
{
vec2 pos = vec2(gl_PointCoord.x, 1.0 - gl_PointCoord.y);
int major = int(pos.x * 4.0);
int minor = int(pos.y * 4.0);
my_FragColor = vec4(m2.mat[major][minor], m2.mat[0][0], 0, 1.0);
}
`;
}
const gl = document.querySelector('canvas').getContext('webgl2');
test(-0.5, '');
test( 0.5, ', row_major');
function test(x, mode) {
const prgInfo = twgl.createProgramInfo(gl, [vs, getFS(mode)]);
gl.vertexAttrib1f(0, x);
const uboInfo = twgl.createUniformBlockInfo(gl, prgInfo, "type_m2");
gl.useProgram(prgInfo.program);
twgl.setBlockUniforms(uboInfo, {
mat: [
0, 0, 0, 0,
1, 1, 0, 0,
0, 0, 0, 0,
1, 1, 1, 1,
],
});
twgl.setUniformBlock(gl, prgInfo, uboInfo);
gl.drawArrays(gl.POINTS, 0, 1);
}
canvas { background: #EEE; }
<script src="https://twgljs.org/dist/4.x/twgl.min.js"></script>
<canvas></canvas>
на Macbook Pro (NVidia) Я получаю эти неправильные результаты
на Windows 10 P C (NVidia) Я получаю эти правильные результаты
на моем Android Pixel 2 XL Я получаю эти неправильные результаты
На Macbook Air (Intel) я получаю эти неправильные результаты
Может быть, это не должно работать. Согласно spe c
12.30 Dynami c Indexing
Для GLSL ES 1.00, поддержка Dynami c индексация массивов, векторов и матрицы не были обязательными, потому что это не поддерживалось напрямую некоторыми реализациями. Программные решения (посредством программных преобразований) существуют для подмножества случаев, но приводят к низкой производительности.
Должна ли быть обязательной поддержка динамического индексирования c для GLSL ES 3.00?
РЕШЕНИЕ: Поддержка мандатов для динамического индексирования массивов c, за исключением массивов сэмплера, выходных массивов фрагментов и унифицированных блочных массивов.
Должна ли поддерживаться динамическая c индексация векторов и матриц в GLSL ES 3.00?
РЕШЕНИЕ: Да.
Мне кажется, что это должно работать но IANALL