【发布时间】:2018-04-23 06:11:48
【问题描述】:
我在带有 nVidia 芯片的 Windows 10 x64 上看到一些渲染几何图形 Chrome 奇怪地闪烁。我还在 Chrome for Linux、Firefox 和 Android 以及 Intel GPU 中进行了测试。除了提到的一个平台之外,它在任何地方都可以正常工作。
最小示例如下所示:
顶点着色器:
precision mediump float;
smooth out vec2 pointCoord;
const vec2 vertexCoord[] = vec2[](
vec2(0.0, 0.0),
vec2(1.0, 0.0),
vec2(1.0, 1.0),
vec2(0.0, 0.0),
vec2(1.0, 1.0),
vec2(0.0, 1.0)
);
void main()
{
gl_Position = vec4(vertexCoord[gl_VertexID], 0.0, 1.0);
pointCoord = vertexCoord[gl_VertexID];
}
片段着色器:
precision mediump float;
out vec4 outFragColor;
smooth in vec2 pointCoord;
void main()
{
outFragColor = vec4(pointCoord, 0.0, 1.0);
}
GL 状态:
gl.clearColor(0, 0, 0, 1);
gl.disable(gl.BLEND);
gl.disable(gl.DEPTH_TEST);
gl.depthMask(gl.FALSE);
gl.stencilMask(gl.FALSE);
渲染代码:
var mainLoop = function()
{
gl.clear(gl.COLOR_BUFFER_BIT);
gl.drawArrays(gl.TRIANGLES, 0, 6);
window.requestAnimationFrame(mainLoop);
}
window.requestAnimationFrame(mainLoop);
完整代码的工作网页可用here。
我在受影响的平台上看到的:
我尝试了带有顶点属性的 webgl1 上下文,因为 glsl 100es 中没有 gl_VertexID 变量,它产生了相同的结果。我还尝试在主循环末尾添加glFinish 或glFlush。它降低了闪烁频率,但并不能解决问题。
有什么问题?此代码中是否有任何未定义的行为,因此它在不同平台上的工作方式不同?还是 Chrome 或 Angle 中的错误?
UPD:
按照 Nabr 的回答,我添加了一个绑定到已启用顶点属性的 VBO,并构造了在我的机器上闪烁的 another example。
UPD2:
向 Chromium 项目报告了一个错误: https://bugs.chromium.org/p/chromium/issues/detail?id=836788
【问题讨论】:
-
使用chrome x64 windows 10,这里没有闪烁...
-
@J.vanLangen 我添加了一些关于 GPU 的说明。你用英伟达吗?
-
这是一款配备 Intel(R) HD Graphics 630 / NVIDIA GeForce 940MX This notebook 的笔记本电脑
-
你试过火狐吗?
-
@J.vanLangen 是的,我试过 FF,效果很好。我的笔记本也有英特尔和英伟达 GPU,如果我用英特尔 GPU 运行 Chrome,它可以工作,如果我用 Nvidia 运行它,它会闪烁。它是 Intel HD Graphics 620 和 Nvidia 950M。
标签: javascript google-chrome webgl nvidia