【发布时间】:2015-02-09 10:56:23
【问题描述】:
这是一个jsfiddle 我放在一起显示粒子在使用纹理着色和相机移动时“闪烁”的问题。
更新:粒子上不应发生动画或运动。如果当您在视口上单击并拖动并且粒子闪烁或改变颜色时,您就会看到问题。这是我在使用 mac OS 10.9 和 windows 7 的 firefox 和 chrome 上测试并看到的问题。
粒子不会以任何方式重叠或剪裁。如果粒子使用常规着色器进行动画处理,则不会发生闪烁。只有当粒子使用纹理着色(在本例中使用 THREE.WebGLRenderTarget)时,闪烁才会明显。这样做是为了捕获以前的帧并将它们存储在缓冲区中(然后可以以 jsfiddle 示例中未显示的更高级方式使用)。
实际上似乎片段着色器可能错误地抓取了一个相邻像素,而不是它的目标,但我不确定 - 这没有多大意义,因为目标坐标仅在 init() 上生成,并且在那之后它们不会改变。
每个粒子的目标像素坐标作为顶点属性传递给片段着色器 1-1 不变(作为可变但没有可变值)。
uniform sampler2D colorMap; // The texture being used to color each particle
varying float v_geoX; // x,y coordinates passed as varyings
varying float v_geoY;
void main() {
// Normally pulling the correct color, but this seems to get confused during camera movement.
gl_FragColor = texture2D(colorMap, vec2(v_geoX, v_geoY));
}
有人对如何在不闪烁的情况下做到这一点有任何想法吗?当我将这种技术应用于更大更快的动画时,问题似乎只会变得更糟。到目前为止,我检查过的所有浏览器都发生了这种情况。
【问题讨论】:
-
我没有看到任何闪烁。这个演示中是否需要彩色动画?演示问题是否需要渲染目标?
-
这里也没有闪烁,Chrome 和 Firefox - Linux。您使用的是什么 GPU、浏览器和操作系统?应用了任何驱动程序解决方法(关于:gpu)?
-
@WestLangley 渲染目标是必要的,因为我需要捕获最后几帧以用于动画。我将 jsfiddle 简化为问题似乎发生时的基线示例。
-
是的,我正在点击并拖动。没有闪烁。动画是否需要显示闪烁?如果没有,请将其关闭并简化演示。
-
动画对我有帮助,但我已经对其进行了简化,因此动画不会更新并且应该是零运动。移动相机时您是否仍然看不到闪烁? jsfiddle.net/vko8hzzs/4
标签: javascript three.js webgl