<div dir="auto">I checked the x3dom implementation of TwoSidedMaterial. It is more efficient, eg. faster than having two separate Shapes and Geometries for front and back since it allows rendering of both faces in one call to the GPU shader. If separateBackColor is requested the shader is modified to check on the fly with gl_frontfacing (<a href="https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FrontFacing.xhtml">https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/gl_FrontFacing.xhtml</a>) if the back is rendered and if so use the back colors instead of the front colors. That is pretty much all that is required. <div dir="auto"><br></div><div dir="auto"><div dir="auto">But it may still be worthwhile to trade a bit of performance of a rarely used feature for an opportunity to simplify.</div><div dir="auto"><br></div><div dir="auto">I think the fact that after an authors sees missing back faces TwoSidedMaterial is easier to discover than the tiny looking solid field and its equivalent functionality, helps explain why it is fairly popular. The examples probably cover the solid field pretty well. It would still help to make solid=false the default. It is a more drastic change but may be ok for a new major version of x3d.</div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br></div><div dir="auto"><br><div data-smartmail="gmail_signature" dir="auto">---on the phone---</div></div></div></div><br>
<br>
On Tue, Jan 21, 2020 at 11:11 AM Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank" rel="noreferrer">andreasplesch@gmail.com</a>> wrote:<br>
><br>
> Thinking about PBR, what would be the consequence of not having a<br>
> TwoSidedPhysicalMaterial ?<br>
><br>
> I think it means that two sided behaviour would then be only<br>
> achievable with solid=true and duplicate geometries with opposing<br>
> normals each with its own PhysicalMaterial. This does not need to<br>
> impact decisions on TwoSidedMaterial, it appears. PBR is new and how<br>
> to do two sided lighting would also be new for PhysicalMaterial. While<br>
> it would be nice to have parallelism with PhongMaterial, it is not a<br>
> requirement.<br>
><br>
> But I think I am changing my mind to be more in favor of just<br>
> deprecating TwoSidedMaterial completely although it is harder for<br>
> normal users then to generate the effect. I am not sure, however, that<br>
> x3dom implements the ccw field for primitive geometries like Sphere<br>
> correctly although it may.<br>
><br>
> If there would be more frequent opportunities to update the spec., I<br>
> would probably prefer to keep TwoSidedMaterial but mark it as on the<br>
> way out, deprecated, and then remove it in the next version. But<br>
> perhaps it is time to remove it now.<br>
><br>
><br>
> On Tue, Jan 21, 2020 at 10:32 AM Michalis Kamburelis<br>
> <<a href="mailto:michalis.kambi@gmail.com" target="_blank" rel="noreferrer">michalis.kambi@gmail.com</a>> wrote:<br>
> ><br>
> > Andreas Plesch <<a href="mailto:andreasplesch@gmail.com" target="_blank" rel="noreferrer">andreasplesch@gmail.com</a>> wrote:<br>
> > ><br>
> > > There is movement around TwoSidedMaterial. See<br>
> > ><br>
> > > <a href="https://github.com/castle-engine/view3dscene/issues/23" rel="noreferrer noreferrer" target="_blank">https://github.com/castle-engine/view3dscene/issues/23</a><br>
> > ><br>
> > > and<br>
> > ><br>
> > > <a href="http://web3d.org/pipermail/x3d-public_web3d.org/2019-December/011594.html" rel="noreferrer noreferrer" target="_blank">http://web3d.org/pipermail/x3d-public_web3d.org/2019-December/011594.html</a><br>
> > ><br>
> > > I would vote to keep a version of it since the alternative of manually doubling the geometry with inverted normals is too awkward for normal users.<br>
> > ><br>
> ><br>
> > If we keep TwoSidedMaterial (with sepatateBackColor=true possibility),<br>
> > then we also need a solution for PBR for this. So my proposed<br>
> > TwoSidedAnyMaterial from <a href="https://github.com/Web3DConsortium/X3D/pull/8" rel="noreferrer noreferrer" target="_blank">https://github.com/Web3DConsortium/X3D/pull/8</a><br>
> > would be relevant. It allows to make two-sided Phong Material or<br>
> > two-sided PhysicalMaterial.<br>
> ><br>
> > ( I don't have an opinion here, whether we should keep<br>
> > TwoSidedMaterial, or remove it and instead have a simple boolean field<br>
> > "twoSided", I just note that *if* we decide that TwoSidedMaterial is<br>
> > useful, then necessarily also new TwoSidedAnyMaterial is useful, to<br>
> > have the same capabilities for Phong and physical materials. )<br>
> ><br>
> > Personally, I never saw real use-cases for TwoSidedMaterial with<br>
> > separateBackColor=true, but maybe my needs were specific :) If many<br>
> > people use with separateBackColor=true, then we should reconsider<br>
> > keeping it indeed.<br>
> ><br>
> > > There is a need, however, to clear up some confusion. As far as I can judge there is no need for separateBackColor. It should always be true since this case appears to be the main point of the node.<br>
> > ><br>
> ><br>
> > As per my comments in<br>
> > <a href="https://github.com/castle-engine/view3dscene/issues/23" rel="noreferrer noreferrer" target="_blank">https://github.com/castle-engine/view3dscene/issues/23</a> -- I think that<br>
> > right now the specification says something different (solid=false with<br>
> > one-sided Material means that back faces are black). It's also<br>
> > somewhat consistent with implementation (using OpenGL[ES] etc.):<br>
> ><br>
> > - one thing determines backface culing ("solid"), like glEnable(GL_CULL_FACE)<br>
> ><br>
> > - another, independent thing controls whether the "back" faces have<br>
> > lighting calculated correctly (using TwoSidedMaterial instead of<br>
> > Material). This is typically a code in GLSL shader that inverts a<br>
> > normal if gl_FrontFacing==false.<br>
> ><br>
> > But I could be persuaded to your approach :) I see your point -- right<br>
> > now we have some combinations that aren't really useful:<br>
> ><br>
> > - Using solid=false with one-sided Material is hardly useful, as<br>
> > authors don't really want to see pure black faces.<br>
> ><br>
> > - Using solid-true with TwoSidedMaterial isn't very useful, since you<br>
> > activate two-sided lighting calculation, but then don't render back<br>
> > faces.<br>
> ><br>
> > As I understand, you would prefer to simplify it.<br>
> ><br>
> > - Connect whether "the back faces are visible" with "the back faces<br>
> > have correct lighting calculated" into a single feature, activated in<br>
> > one place (by "solid" field).<br>
> ><br>
> > - And then the only purpose of TwoSidedMaterial would be to achieve<br>
> > *different* colors on front vs back faces.<br>
> ><br>
> > This would actually be somewhat aligned with current CGE<br>
> > implementation too. In CGE I actually *sometimes* realize Material as<br>
> > two-sided (in Phong shading),<br>
> > <a href="https://castle-engine.io/x3d_implementation_shape_extensions.php#section_ext_shading" rel="noreferrer noreferrer" target="_blank">https://castle-engine.io/x3d_implementation_shape_extensions.php#section_ext_shading</a><br>
> > .<br>
> ><br>
> > > Also, there needs to be clarification how solid=true and TwoSidedMaterial interact. I think x3dom lets TwoSidedMaterial win over solid=true in the intent to render back faces. Most other browser probably let solid=true win, eg. will not render back faces at all even with a TwoSidedMaterial.<br>
> ><br>
> > The current X3D specification is clear here, IMHO:<br>
> ><br>
> > The "solid" field determines whether back faces are visible. It is<br>
> > unrelated to Material/TwoSidedMaterial. So the X3DOM behaviour is not<br>
> > correct, IMHO.<br>
> ><br>
> > I'm not saying that we cannot change it :)<br>
> ><br>
> > Regards,<br>
> > Michalis<br>
><br>
><br>
><br>
> --<br>
> Andreas Plesch<br>
> Waltham, MA 02453<br>
<br>
<br>
<br>
-- <br>
Andreas Plesch<br>
Waltham, MA 02453<br>