[x3d-public] TwoSidedTexture node

Michalis Kamburelis michalis.kambi at gmail.com
Fri Nov 3 15:07:28 PDT 2017


2017-11-03 18:36 GMT+01:00 Andreas Plesch <andreasplesch at gmail.com>:
> There was a question a while ago on x3dom issues if there is a
> TwoSidedTexture node similar to the TwoSidedMaterial node:
>
> http://www.web3d.org/documents/specifications/19775-1/V3.3/Part01/components/shape.html#TwoSidedMaterial
>
> There is MultiTexture so it is not unreasonable to expect a TwoSidedTexture.
>
> Is there a way currently to have a different texture on the backside
> apart from duplicating the shape ?
>
> What could be good way to generalize such that different material,
> texture, or common surface shader nodes can be used simultaneously on
> backs and fronts ?
>
> Perhaps a BackAppearance node ?
>

1. BackAppearance seems a bit "too flexible to implement" for me ---
it would also allow for different "shaders" for front and back faces,
since I guess "Appearance.shaders" can be different than
"BackAppearance.shaders". And I have no idea how to implement such
thing (with a single draw call :) ). Typically only the fragment
shader really knows which side you're looking at.

2. In fact, even TwoSidedTexture seems a bit uneasy to implement for
me, if the children of TwoSidedTexture could be any texture node,
including MultiTexture. You could then specify that

- front side has MultiTexture e.g. with 3 textures inside (e.g. some
cubemap multiplied by some 2d texture multiplied by some 3d texture)
- back side has MultiTexture e.g. with 2 textures inside (e.g. some 2d
texture added to some other 2d texture)

IOW, you could have different texture logic/equations for front and
for back side. I can implement this :), but I'm not sure is this
acceptable to all implementors.

In contrast, the existing TwoSidedMaterial has much simpler
implementation: both front and back sides have lighting calculated
using the exact same equations, only the parameters to these equations
are different depending on which side you're looking at.

Following this, I think a safer version of TwoSidedTexture would be
something that cannot have MultiTexture as a children, and maybe even
that requires that both front and back textures are the same kind
(both 2d, or both 3d, or both cubemaps...). And MultiTexture can have
(as a children) a TwoSidedTexture. So then you could do (in classic
encoding):

Appearance {
  texture TwoSidedTexture {
    front ImageTexture { url "front.png" }
    back ImageTexture { url "back.png" }
  }
}

or

Appearance {
  texture MultiTexture {
    texture [
      ImageTexture { url "first_layer.png" }
      TwoSidedTexture {
        front ImageTexture { url "second_layer_front.png" }
        back ImageTexture { url "second_layer_back.png" }
      }
    ]
  }
}

I think this would be OK to implement :)

3. I'm not sure how much is such TwoSidedTexture needed, in practice.
You can already achieve a similar effect by reusing the same geometry
but with different "ccw" value. E.g.

----
Shape {
  geometry IndexedFaceSet {
    DEF MyCoord Coordinate { ... }
    ccw TRUE
    solid TRUE # this is the default, I just emphasise it here
    coordIndex ...
  }
  appearance Appearance {
    # configure Material, Texture, etc. for ccw=true side
  }
}
Shape {
  geometry IndexedFaceSet {
    USE MyCoord
    ccw FALSE
    solid TRUE # this is the default, I just emphasise it here
   coordIndex ... # unfortunately, you have to repeat coordIndex here
  }
  appearance Appearance {
    # configure Material, Texture, etc. for ccw=false side
  }
}
----

The above is not perfect (a renderer will make 2 draw calls, and you
need to duplicate coordIndex contents). But it already works, in all
browsers, and you can change any Appearance parameter this way :)

Regards,
Michalis



More information about the x3d-public mailing list