We had a discussion on this a couple of weeks ago; maybe this should be
captured in the FAQ.  The basic problem is that transparency is
inherently an order-dependent operation.  For the rendering to be
correct in all cases, all triangles must be rendered from back to
front.  In cases without a lot of overlapping transparent objects, you
can usually get good results by rendering all of the opaque objects,
freezing the Z-buffer, and then rendering all of the transparent
objects.  However, this sometimes has the side-effect of causing
transparent objects that are further away to look like they are in
front of transparent objects that are closer.  Turning on the Z-buffer
(by disabling DepthBufferFreezeTransparent) fixes this, but creates
other problems.

Without sorting your geometry--and breaking it up in the case of
intersecting objects--there is no solution.  In Java 3D 1.2 we have
proposed new blending modes that will allow you to blend transparent
objects in a truly order-independent manner, but with the side effect
that you get an additive effect where two objects intersect.

--
Kevin Rushforth
Java 3D Team
Sun Microsystems

[EMAIL PROTECTED]


>Date:         Wed, 1 Sep 1999 05:39:18 -0700
>From: James Harrison <[EMAIL PROTECTED]>
>Subject:      [JAVA3D] Transparency problems
>To: [EMAIL PROTECTED]
>
>I am having a problem with transparency and object the intersect. 
>http://www.cs.cmu.edu/~jaharris/j3d/transparency.html has some images.
>
>If I make 3 spheres and line them up so each intersect the previous one.  Then change 
>the transparency of the front most sphere(blue)assuming there are on the z axis.  I 
>can just see the other 2 spheres fine.  Now if I change the 2nd sphere's(red) 
>transparency from 0 to .01, then the part of the sphere that was covered by sphere 1 
>has disappeared.  But, if I rotate it, then the 2nd sphere is rendered like I 
>exepect.   I also use an OrderedGroup to assure that the spheres are drawn in the 
>correct order.  If I do not, the transparency problem is ok, but the z buffer is 
>incorrect.  I also tried using 
>u.getViewer().getView().setDepthBufferFreezeTransparent(false), but this did not 
>accomplish what I wanted.
>
>I use NT 4 with FireGL pro 1000 8Mb, jdk1.2.2
>
>I am doing something wrong or is this a bug?
>
>Code:
>
>
>
>public class Test extends Applet {
>     .
> .
>  .
>
>
>
>   public TransformGroup createSceneGraph() {
> // Create the root of the branch graph
> TransformGroup objRoot = new TransformGroup();
> objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
> objRoot.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
>
> OrderedGroup objOG = new OrderedGroup();
> Sphere s1 = new Sphere(.5f);
> s1.setAppearance(S1Appear);
>
> Sphere s2 = new Sphere(.5f);
> s2.setAppearance(s2Appear);
>
> Sphere s3 = new Sphere(.5f);
> s3.setAppearance(s3Appear);
>
> objOG.addChild(s1);
> Transform3D t3d = new Transform3D();
> t3d.set(new Vector3f(0f,0f,.1f));
> TransformGroup tg = new TransformGroup(t3d);
> tg.addChild(s2);
> objOG.addChild(tg);
>
> t3d = new Transform3D();
> t3d.set(new Vector3f(0f,0f,.2f));
> TransformGroup tg2 = new TransformGroup(t3d);
> tg2.addChild(s3);
> objOG.addChild(tg2);
>
> objRoot.addChild(objOG);
>
> return objRoot;
>    }
>
>    public Test() {
>
> Material greenm = new Material();
> greenm.setDiffuseColor(GREEN);
>
> Material redm = new Material();
> redm.setDiffuseColor(RED);
>
> Material bluem = new Material();
> bluem.setDiffuseColor(BLUE);
>
> s1Appear = new Appearance();
> s1Appear.setMaterial(greenm);
> S1Appear.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ);
> TransparencyAttributes ta = new 
>TransparencyAttributes(TransparencyAttributes.NICEST,0f);
> ta.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
> s1Appear.setTransparencyAttributes(ta);
>
> s2Appear = new Appearance();
> s2Appear.setMaterial(red);
> ta = new TransparencyAttributes(TransparencyAttributes.NICEST,0f);
> ta.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
> s2Appear.setTransparencyAttributes(ta);
> s2Appear.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ);
>
>
> s3Appear = new Appearance();
> s3Appear.setMaterial(bluem);
> s3Appear.setCapability(Appearance.ALLOW_TRANSPARENCY_ATTRIBUTES_READ);
> ta = new TransparencyAttributes(TransparencyAttributes.NICEST,0f);
> ta.setCapability(TransparencyAttributes.ALLOW_VALUE_WRITE);
> s3Appear.setTransparencyAttributes(ta);
>
>
>
>
> setLayout(new BorderLayout());
>        GraphicsConfiguration config =
>           SimpleUniverse.getPreferredConfiguration();
>
> Canvas3D c = new Canvas3D(config);
> add("Center", c);
>
> // Create a simple scene and attach it to the virtual universe
> TransformGroup tg = createSceneGraph();
> BranchGroup scene = new BranchGroup();
> scene.addChild(tg);
> SimpleUniverse u = new SimpleUniverse(c);
>
>      u.getViewingPlatform().setNominalViewingTransform();
> .
>  .
> .
> .
> .
> .
> BoundingSphere lightBounds =
> new BoundingSphere(new Point3d(), Double.MAX_VALUE);
>        ambLight = new AmbientLight(true, new Color3f(1.0f, 1.0f, 1.0f));
>        ambLight.setInfluencingBounds(lightBounds);
>        ambLight.setCapability(Light.ALLOW_STATE_WRITE);
>        scene.addChild(ambLight);
>        headLight = new DirectionalLight();
>        headLight.setCapability(Light.ALLOW_STATE_WRITE);
>        headLight.setInfluencingBounds(lightBounds);
>        scene.addChild(headLight);
> u.addBranchGraph(scene);
>    }
>
>    //
>    // The following allows HelloUniverse to be run as an application
>    // as well as an applet
>    //
>    public static void main(String[] args) {
> new MainFrame(new Test(), 256, 256);
>    }
>}
>
>===========================================================================
>To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
>of the message "signoff JAVA3D-INTEREST".  For general help, send email to
>[EMAIL PROTECTED] and include in the body of the message "help".
>

===========================================================================
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff JAVA3D-INTEREST".  For general help, send email to
[EMAIL PROTECTED] and include in the body of the message "help".

Reply via email to