我在 WebGL 中渲染几何图形,并在 Chrome for Android(不需要的工件,左)和 Chrome for Windows(右)上得到不同的结果:
我试过了:
- 使用 WebGL2 和 WebGL 上下文
- 在传递索引缓冲区时使用
gl.UNSIGNED_INT
和gl.UNSIGNED_SHORT
- 在逗号后将所有属性值四舍五入到小数点后 4 位
这是一些代码:
我已经“简化”了我的顶点着色器以缩小问题范围:
#version 100
precision mediump float;
attribute vec3 aPosition;
attribute vec3 aColor;
attribute vec3 aNormal;
varying vec3 vColor;
varying vec3 vNormal;
varying vec3 vPosition;
varying mat4 vView;
uniform mat4 uWorld;
uniform mat4 uView;
uniform mat4 uProjection;
uniform mat3 uNormal;
uniform float uTime;
void main() {
vColor = aColor;
vNormal = uNormal * aNormal;
vPosition = (uWorld * vec4(aPosition, 1.0)).xyz;
gl_Position = uProjection * uView * uWorld * vec4(aPosition, 1.0);
}
我通过交错缓冲区传递属性(所有值在逗号后四舍五入到小数点后四位):
gl.bindBuffer(gl.ARRAY_BUFFER, this.interleaved.buffer)
const bytesPerElement = 4
gl.vertexAttribPointer(this.interleaved.attribLocation.position, 3, gl.FLOAT, gl.FALSE, bytesPerElement * 9, bytesPerElement * 0)
gl.vertexAttribPointer(this.interleaved.attribLocation.normal, 3, gl.FLOAT, gl.FALSE, bytesPerElement * 9, bytesPerElement * 3)
gl.vertexAttribPointer(this.interleaved.attribLocation.color, 3, gl.FLOAT, gl.FALSE, bytesPerElement * 9, bytesPerElement * 6)
我正在使用索引缓冲区来绘制几何图形:
gl.drawElements(gl.TRIANGLES, this.indices.length, gl.UNSIGNED_INT, 0)
指数范围从0..3599
,因此gl.UNSIGNED_INT
应该足够大。
我没有收到任何错误消息。在 Windows 上一切都很好,只有 Android 上的 Chrome 有工件。