Webgl 与DrawarrayInstance不一致的结果在Android和桌面Chrome之间悬空。桌面上的属性缓冲区间歇性损坏(?)

Webgl 与DrawarrayInstance不一致的结果在Android和桌面Chrome之间悬空。桌面上的属性缓冲区间歇性损坏(?),webgl,Webgl,我第一次尝试实例化。我有两个属性缓冲区,它们使用VertexAttributeDivisOrangle。我在一个属性缓冲区中放置位置和旋转数据,在另一个属性缓冲区中放置纹理数据。我在一个纹理中使用了一个精灵表,所以我必须发送我想要绘制的每个“帧”的起始位置和尺寸。位置/旋转缓冲区看起来很好,但在桌面chrome上,纹理缓冲区似乎间歇性损坏。您将看到正确显示的纹理闪烁,但大多数情况下会看到映射到四边形的整个精灵表或只是随机噪波。它似乎在移动chrome上呈现得非常完美。缓冲区有不同的除数,如果这有

我第一次尝试实例化。我有两个属性缓冲区,它们使用
VertexAttributeDivisOrangle
。我在一个属性缓冲区中放置位置和旋转数据,在另一个属性缓冲区中放置纹理数据。我在一个纹理中使用了一个精灵表,所以我必须发送我想要绘制的每个“帧”的起始位置和尺寸。位置/旋转缓冲区看起来很好,但在桌面chrome上,纹理缓冲区似乎间歇性损坏。您将看到正确显示的纹理闪烁,但大多数情况下会看到映射到四边形的整个精灵表或只是随机噪波。它似乎在移动chrome上呈现得非常完美。缓冲区有不同的除数,如果这有区别的话

在搜索有关损坏顶点缓冲区的信息时,我似乎找不到任何结果,说明mobile和desktop的渲染方式可能存在差异


这里有一个现场演示:

问题似乎是如果
drawCircles vertex shader
matrix
poseM
中的顶点着色器没有完全初始化。以下是着色器的一部分:

mat4 poseM;
poseM[0][0] = 1.0 / a_pose.z;
poseM[1][1] = 1.0 / a_pose.w;
poseM[2][2] = 1.0;
poseM[3][3] = 1.0;
poseM[3][0] = 1.0 / a_pose.z * a_pose.x;
poseM[3][1] = 1.0 / a_pose.w * a_pose.y;
将矩阵的其余部分初始化为零会产生合理的结果:

mat4 poseM;
poseM[0][0] = 1.0 / a_pose.z;
poseM[0][1] = 0.0;
poseM[0][2] = 0.0;
poseM[0][3] = 0.0;
poseM[1][0] = 0.0;
poseM[1][1] = 1.0 / a_pose.w;
poseM[1][2] = 0.0;
poseM[1][3] = 0.0;
poseM[2][0] = 0.0;
poseM[2][1] = 0.0;
poseM[2][2] = 1.0;
poseM[2][3] = 0.0;
poseM[3][0] = 1.0 / a_pose.z * a_pose.x;
poseM[3][1] = 1.0 / a_pose.w * a_pose.y;
poseM[3][2] = 0.0;
poseM[3][3] = 1.0;

用于初始化矩阵的较短版本:

mat4 poseM = mat4(1.); // Initializes matrix to identity
poseM[0][0] = 1.0 / a_pose.z;
poseM[1][1] = 1.0 / a_pose.w;
poseM[3][0] = 1.0 / a_pose.z * a_pose.x;
poseM[3][1] = 1.0 / a_pose.w * a_pose.y;