Android 和桌面 Chrome 之间的 drawArraysInstancedANGLE 结果不一致。桌面上的间歇性损坏(?)属性缓冲区
Inconsistent results with drawArraysInstancedANGLE between Android and Desktop Chrome. Intermittently corrupted(?) attribute buffers on desktop
我第一次尝试实例化。我有两个使用 vertexAttribDivisorANGLE
的属性缓冲区。我将位置和旋转数据放在一个属性缓冲区中,将纹理数据放在另一个缓冲区中。我在一个纹理中使用精灵 sheet,所以我必须发送我想绘制的每个 "frame" 的开始位置和尺寸。位置/旋转缓冲区看起来很好,但在桌面上 chrome 纹理缓冲区似乎间歇性损坏。您会看到正确显示的纹理闪烁,但您大多看到整个精灵 sheet 映射到四边形或只是随机噪声。它似乎在移动 chrome 上完美呈现。如果有区别,缓冲区有不同的除数。
我在搜索有关移动和桌面渲染方式之间差异的损坏顶点缓冲区的信息时,似乎找不到任何结果。
问题似乎是,如果 drawCircles-vertex-shader
矩阵 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;
我第一次尝试实例化。我有两个使用 vertexAttribDivisorANGLE
的属性缓冲区。我将位置和旋转数据放在一个属性缓冲区中,将纹理数据放在另一个缓冲区中。我在一个纹理中使用精灵 sheet,所以我必须发送我想绘制的每个 "frame" 的开始位置和尺寸。位置/旋转缓冲区看起来很好,但在桌面上 chrome 纹理缓冲区似乎间歇性损坏。您会看到正确显示的纹理闪烁,但您大多看到整个精灵 sheet 映射到四边形或只是随机噪声。它似乎在移动 chrome 上完美呈现。如果有区别,缓冲区有不同的除数。
我在搜索有关移动和桌面渲染方式之间差异的损坏顶点缓冲区的信息时,似乎找不到任何结果。
问题似乎是,如果 drawCircles-vertex-shader
矩阵 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;