2

我正在尝试使用前一个渲染作为下一个渲染的纹理进行渐进式渲染。

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 不是库的一部分,它只在示例中找到,可能不受支持,但我真的会接受任何关于这种情况的建议,任何答案都将不胜感激。

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

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

我感谢你的好意。

4

1 回答 1

0

这个问题的解决方案似乎是使用twoRenderTargets,并在每一步都在它们之间切换。我有限的知识使我无法准确理解原因,但这正是 EffectComposer 的工作方式。对于那些可能遇到此问题并需要解决方案的人,您应该尝试将着色器通道设置needsSwaptrue。如果你不使用 EffectComposer,那么记得使用两个渲染目标。

于 2013-08-13T13:06:00.637 回答