无法将当前结果传递给下一个渲染

时间:2013-02-07 16:39:54

标签: three.js webgl textures

我正在尝试使用之前的渲染作为下一个渲染的渐变渲染。

EDIT 1:正如评论中所建议的,我确实将我的THREE.js版本更新为最新版本,并保留了我的旧代码,结果是相同的(即使对象的垂直位置翻转)。我的问题仍然存在。请考虑我的更新,并寻求帮助。

Original message:

我的片段着色器应该只增加绿色通道上的颜色0.1,如下所示:

#ifdef GL_ES
precision highp float;
#endif
uniform sampler2D sampa;
varying vec2 tc;

void main(void)
{
     vec4 c = texture2D(sampa, tc);
     vec4 t = vec4(c.x, c.y + .1, c.z, 1.);
     gl_FragColor = t;
}

我的作曲家是这样的:

composer.addPass(renderModel);
composer.addPass(screenPass);
composer.addPass(feedPass);

其中renderModel是RenderPass,渲染我的场景,其中我有一个平面和一个立方体。 和screenPass和feedPass是唯一的区别,一个是在屏幕上渲染另一个渲染在writeBuffer(composer.renderTarget1)。

var renderModel = new THREE.RenderPass(scene, camera);
renderModel.clear = false;

screenPass = new THREE.ShaderPass(shader2, 'sampa');
screenPass.renderToScreen = true;
screenPass.clear = false;
screenPass.needsSwap = false;

feedPass = new THREE.ShaderPass(shader2, 'sampa');
feedPass.renderToScreen = false;
feedPass.clear = false;
feedPass.needsSwap = false;

在动画循环中,我有类似的东西:

composer.render();
if(step % 250 == 0)
{
    newmat = new THREE.MeshBasicMaterial(
    {
        map : composer.renderTarget1
    });

    plane.material = newmat;
}
step++;
requestAnimationFrame(animate);

step % 250的部分是为了延迟材料的更改。

无论如何,问题是当发生这种情况时飞机正在消失。即使它在前250个步骤中正确渲染。我猜它仍然存在,但没有纹理数据,所以它实际上没有渲染。

我知道EffectComposer不是库的一部分,它只在示例中找到,可能不受支持,但我真的会对这种情况提出任何建议,任何答案都将不胜感激。

至于有关该问题的任何其他信息,或其他一些可能对我非常愿意分享的代码。

你能指出我做错了什么吗?

我感谢你的善意。

1 个答案:

答案 0 :(得分:0)

这个问题的解决方案似乎是使用two RenderTargets,并在每一步都切换它们。我有限的知识使我无法理解为什么,但这正是EffectComposer的工作原理。 对于可能遇到此问题且需要解决方案的用户,您应尝试将needsSwap设置为true以进行着色器传递。 如果您不使用EffectComposer,请记住使用两个rendertargets。