FBO模拟着色器中的纹理查找

时间:2019-01-10 12:14:12

标签: three.js glsl shader fbo

我正在尝试通过单独计算通过的位置来制作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

2 个答案:

答案 0 :(得分:1)

您应该使用GL_NEAREST最小/磁性过滤器来禁用纹理过滤。

答案 1 :(得分:0)

我的猜测是THREE.TextureLoader()使用mipmap加载纹理,并且在顶点着色器中的texture2D调用使用分辨率最低的mipmap。在顶点着色器中,应使用texture2DLod(texture, texCoord, 0.0)-注意第三个参数lod,它指定了0个mipmap级别。