Three.js: Multiple Renderer render the same scene in texture change problem.

Created on 5 Sep 2017  路  6Comments  路  Source: mrdoob/three.js

Today, I follow the https://threejs.org/examples/?q=mul#webgl_multiple_renderers example.

And I found that when you use multiple renderer to render the same scene and change the texture ( I change the .map property) of the model, only the first renderer will response to the change.

I fix it by set the ".needsUpdate" to true after the first renderer's render(), then the second renderer can response the material's change.

It seems like that each renderer has its own cache, and when the first renderer complete render, it set the needsUpdate property to false so that the second renderer can't know the material's change.

I consider that a renderer manager will be the essential solution to this problem. In addition, use multiple viewport and multiple canvas instead, like in other examples, is not powerful enough. Multiple renderer is more useful and convenient in some case so hope can solve it : )

Thanks for reading ~ I will set the ".needsUpdate" property to true by myself in current case.

Enhancement

Most helpful comment

Would you like to give this a go?

You bet! 馃槉

All 6 comments

I'm assuming this is similar to the problem I've been having, exemplified here: https://codepen.io/anon/pen/jZBVaG?editors=0010

While the workaround is quite simple to implement in the codepen above, keeping track of this in a code-base where the different renderers have no knowledge of each other is much harder. On the surface, it seems like this could be fixed by making needsUpdate a property that increments a material version, similar to what is used elsewhere in the code base.

C.f. https://github.com/mrdoob/three.js/pull/6723.

For reference, this is the executive summary of that codepen:

renderer1.render(scene, camera);
renderer2.render(scene, camera);

mesh1.castShadow = true;
mesh2.receiveShadow = true;
mesh2.material.needsUpdate = true;

renderer1.render(scene, camera);
// This line is needed for second renderer to pick up shadows on mat2:
// mesh2.material.needsUpdate = true;   
renderer2.render(scene, camera);

@vidartf did you find a proper workaround for that issue? I suppose this was for pythreeJS?

@Mugen87 Would you like to give this a go? Seems like we just need to implement versioning to Material?

Would you like to give this a go?

You bet! 馃槉

Thanks a lot for your work, that's awesome!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

Mugen87 picture Mugen87  路  68Comments

ghost picture ghost  路  81Comments

DefinitelyMaybe picture DefinitelyMaybe  路  88Comments

kumavis picture kumavis  路  153Comments

danrossi picture danrossi  路  210Comments