Android和桌面Chrome之间使用drawArraysInstancedANGLE的结果不一致。桌面上的间歇性损坏(?)属性缓冲区

时间:2017-10-04 16:03:17

标签: webgl

我第一次尝试实例化。我有两个使用vertexAttribDivisorANGLE的属性缓冲区。我将位置和旋转数据放在一个属性缓冲区中,将纹理数据放在另一个中。我在一个纹理中使用精灵表,所以我必须发送我想要绘制的每个“框架”的起始位置和尺寸。位置/旋转缓冲区显示正常,但在桌面镶边上,纹理缓冲区似乎间歇性地损坏。你会看到纹理的闪烁正确显示,但你大多看到整个精灵表映射到四边形或只是随机噪声。它看起来完美呈现移动铬。如果这会产生影响,缓冲区会有不同的除数。

在搜索有关移动设备和桌面可能呈现方式之间差异的已损坏顶点缓冲区的信息时,我似乎无法找到任何结果。

这是一个现场演示:http://industriousthought.com/glLab.html

1 个答案:

答案 0 :(得分:1)

问题似乎是如果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;

Part of rendered image

初始化矩阵的较短版本:

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;