我正在尝试通过单独计算通过的位置来制作FBO粒子系统。
现在http://barradeau.com/blog/?p=621使用这篇文章中的代码。
我渲染粒子的球体,没有任何运动:
到目前为止,我唯一要添加的是模拟片段着色器中的纹理:
void main() {
vec3 pos = texture2D( texture, vUv ).xyz;
//THIS LINE, pos is approx in -200..200 range
float map = texture2D(texture1, abs(pos.xy/200.)).r;
...
// save map value in ping-pong texture as alpha
gl_FragColor = vec4( pos, map );
texture1
是:一半是黑色,一半是白色。
然后在 render 顶点着色器中,我读取了此贴图参数:
map = texture2D( positions, position.xy ).a;
并在 render 片段着色器中使用它来查看颜色:
vec3 finalColor = mix(vec3(1.,0.,0.),vec3(0.,1.,0.),map);
gl_FragColor = vec4( finalColor, .2 );
所以我希望看到的是:(通过在 render 着色器中设置相同的纹理制成)
但是我真正看到的是:(通过在模拟着色器中设置纹理)
颜色混杂不清,尽管大多数情况下您会在应有的位置看到更多红色,但是它们之间有很多绿色粒子。
还尝试用简化的纹理和相同的想法制作自己的演示,我明白了:
也混淆了,但您仍然可以猜出图像。
同样的错误。
我想我缺少明显的东西。但是我现在正为此苦苦挣扎,无法自己发现错误。
非常感谢有人指出我正确的方向。预先谢谢你!
演示出现错误:http://cssing.org.ua/examples/fbo-error/
我指的是完整代码:https://github.com/akella/fbo-test
答案 0 :(得分:1)
您应该使用GL_NEAREST
最小/磁性过滤器来禁用纹理过滤。
答案 1 :(得分:0)
我的猜测是THREE.TextureLoader()
使用mipmap加载纹理,并且在顶点着色器中的texture2D
调用使用分辨率最低的mipmap。在顶点着色器中,应使用texture2DLod(texture, texCoord, 0.0)
-注意第三个参数lod
,它指定了0个mipmap级别。