这是一个jsfiddle http://jsfiddle.net/vko8hzzs/4/我将粒子在使用纹理着色时以及相机移动时“闪烁”的问题放在一起展示。
更新:粒子上不应该发生动画或运动。如果当您在视口上单击并拖动并且粒子闪烁或完全改变颜色时,那么您就会看到问题。这是我在 Firefox 和 chrome、Mac OS 10.9 和 Windows 7 上测试并看到的问题。
粒子不会以任何方式重叠或剪切。如果使用常规着色器对粒子进行动画处理,则不会发生闪烁。只有当粒子使用纹理着色时(在本例中使用 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));
}
有人知道如何在不闪烁的情况下做到这一点吗?当我将这种技术应用于更大更快的动画时,问题似乎只会变得更糟。到目前为止我检查过的所有浏览器上都会发生这种情况。
问题是您指向纹素之间的边缘。
这些行
geoX.push(tx / imageSize);
geoY.push(1.0 - ty / imageSize); // flip y
计算纹理像素之间的精确边缘。我的意思是说imageSize
是 4 个纹素,可以说tx
and ty
从...来0
to 3
你的纹理坐标是这样的
0 0.25 0.5 0.75 <- texture coords you're computing
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
但你想要的纹理坐标是这样的
0.125 0.375 0.625 0.875
| | | |
V V V V
+-----+-----+-----+-----+
| | | | |
| | | | | <- texels
+-----+-----+-----+-----+
最简单的修复方法是添加 1/2 个纹理元素
geoX.push(tx / imageSize + 0.5 / imageSize);
geoY.push(1.0 - ty / imageSize + 0.5 / imageSize); // flip y
问题在于您的数学直接指向纹素之间的舍入错误使其选择一个纹素或另一个。选择纹素的中心可以解决这个问题。如果图像的相邻纹理像素之间没有如此大的对比度,您可能不会注意到。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)