This example (as well as Java3D) will blend between two textures.
However, you can not set the amount of blend, it's always 50/50.
I think Michael is looking to control the blend function a little bit
more (so am I!).

Am I misinterpreting this?
And can you control the amount of blend/alpha (ex texture1.alpha = .2)
directly - other than the actual alpha of each pixels?

Charmaine Lee wrote:

 > Mike,
 >
 >      You can use multiple texture unit states to blend multiple
 >      textures onto a shape.  Included in the attachment is an
 >      example of multi texturing in Java3D.
 >
 > -Charmaine Lee
 > Java3D Engineering Team
 >
 >
 >
 >
 >
 >> X-Originating-IP: [128.187.171.43]
 >> Mime-Version: 1.0
 >> X-OriginalArrivalTime: 14 Feb 2001 22:50:46.0351 (UTC)
 >
 > FILETIME=[916FF5F0:01C096D8]
 >
 >> Date: Wed, 14 Feb 2001 15:03:13 -0800
 >> From: Michael Smith <[EMAIL PROTECTED]>
 >> Subject: [JAVA3D] texture map blending
 >> To: [EMAIL PROTECTED]
 >>
 >> Java3D people,
 >>      I'm doing research in image morphing and animation.  I'd like
to know
 >> how you would recommend handling the problem of blending two different
 >> textures onto a shape (triangulated grid) in Java3d.  We'd like to do it
 >> taking advantage of java3d's hardware acceleration if we can.
 >>      I've looked through the documentation on Java3D and couldn't find
 >> anything that I thought would work for this.  The BLEND option in the
 >> TextureAppearance class only works with regaurd to the blend color.
 >>      One thing we've done in the past was to paint the first texture
map at
 >> a fraction of it's value (ex texture1.alpha = .2 ) and then paint
the second
 >> texture map on top of that with a the rest of the value(
texture2.alpha = .8
 >> ).  I don't know how you would do this in java3d.
 >>      I would be most grateful for any advice you would have.
 >>
 >> -Mike Smith.
 >> _________________________________________________________________
 >> Get your FREE download of MSN Explorer at http://explorer.msn.com
 >>
 >>
===========================================================================
 >> 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".
 >>
 >>
 >> ------------------------------------------------------------------------
 >>
 >> /*
 >>  *      @(#)MultiTextureTest.java 1.8 01/01/11 07:40:34
 >>  *
 >>  * Copyright (c) 1996-2001 Sun Microsystems, Inc. All Rights Reserved.
 >>  *
 >>  * Sun grants you ("Licensee") a non-exclusive, royalty free,
license to use,
 >>  * modify and redistribute this software in source and binary code form,
 >>  * provided that i) this copyright notice and license appear on all
copies of
 >>  * the software; and ii) Licensee does not utilize the software in a
manner
 >>  * which is disparaging to Sun.
 >>  *
 >>  * This software is provided "AS IS," without a warranty of any
kind. ALL
 >>  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
INCLUDING ANY
 >>  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE OR
 >>  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS
SHALL NOT BE
 >>  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING,
MODIFYING
 >>  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
SUN OR ITS
 >>  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
DIRECT,
 >>  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES,
HOWEVER
 >>  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF
THE USE OF
 >>  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
 >>  * POSSIBILITY OF SUCH DAMAGES.
 >>  *
 >>  * This software is not designed or intended for use in on-line
control of
 >>  * aircraft, air traffic, aircraft navigation or aircraft
communications; or in
 >>  * the design, construction, operation or maintenance of any nuclear
 >>  * facility. Licensee represents and warrants that it will not use or
 >>  * redistribute the Software for such purposes.
 >>  */
 >>
 >> import com.sun.j3d.utils.image.TextureLoader;
 >> import com.sun.j3d.utils.geometry.Box;
 >> import com.sun.j3d.utils.behaviors.vp.*;
 >> import java.applet.Applet;
 >> import java.awt.*;
 >> import java.awt.event.*;
 >> import com.sun.j3d.utils.applet.MainFrame;
 >> import com.sun.j3d.utils.universe.*;
 >> import javax.media.j3d.*;
 >> import javax.vecmath.*;
 >> import java.awt.image.BufferedImage;
 >>
 >> public class MultiTextureTest extends Applet implements ItemListener{
 >>
 >>   Choice choice;
 >>   TextureUnitState textureUnitState[] = new TextureUnitState[2];
 >>   Texture stoneTex;
 >>   Texture skyTex;
 >>   Texture lightTex;
 >>
 >>   private java.net.URL stoneImage = null;
 >>   private java.net.URL skyImage = null;
 >>
 >>     private SimpleUniverse u = null;
 >>
 >>   public Texture createLightMap(){
 >>
 >>     int width = 128;
 >>     int height = 128;
 >>     BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
 >>     int [] rgbArray = new int[width * height];
 >>     int index, index2;
 >>     int rgbInc = 256 / (width / 2 - 20);
 >>     int rgbValue = 0;
 >>     int k = width/2 - 5;
 >>     int i, j, rgb;
 >>
 >>     rgb = 0xff;
 >>     rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
 >>     for ( i = width / 2 - 1, j = 0; j < 10; j++, i--) {
 >>          rgbArray[i] = rgbValue;
 >>     }
 >>
 >>     for (; i > 8; i--, rgb -= rgbInc) {
 >>          rgbValue = rgb | (rgb << 8) | (rgb << 16) | (rgb << 24);
 >>          rgbArray[i] = rgbValue;
 >>     }
 >>
 >>     for (; i >= 0; i--) {
 >>          rgbArray[i] = rgbValue;
 >>     }
 >>
 >>     for (i = 0; i < width/2; i++) {
 >>          rgbValue = rgbArray[i];
 >>          index = i;
 >>          index2 = (width - i - 1);
 >>          for (j = 0; j < height; j++) {
 >>               rgbArray[index] = rgbArray[index2] = rgbValue;
 >>               index += width;
 >>               index2 += width;
 >>          }
 >>     }
 >>
 >>     bimage.setRGB(0, 0, width, height, rgbArray, 0, width);
 >>
 >>
 >>     ImageComponent2D grayImage = new
ImageComponent2D(ImageComponent.FORMAT_RGB, bimage);
 >>
 >>     lightTex = new Texture2D(Texture.BASE_LEVEL, Texture.RGB, width,
height);
 >>     lightTex.setImage(0, grayImage);
 >>
 >>     return lightTex;
 >>   }
 >>
 >>
 >>   public BranchGroup createSceneGraph() {
 >>     // Create the root of the branch graph
 >>     BranchGroup objRoot = new BranchGroup();
 >>
 >>     // Create a Transformgroup to scale all objects so they
 >>     // appear in the scene.
 >>     TransformGroup objScale = new TransformGroup();
 >>     Transform3D t3d = new Transform3D();
 >>     t3d.setScale(0.4);
 >>     objScale.setTransform(t3d);
 >>     objRoot.addChild(objScale);
 >>
 >>     TransformGroup objTrans = new TransformGroup();
 >>     //write-enable for behaviors
 >>     objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
 >>     objTrans.setCapability( TransformGroup.ALLOW_TRANSFORM_READ );
 >>     objTrans.setCapability(TransformGroup.ENABLE_PICK_REPORTING);
 >>     objScale.addChild(objTrans);
 >>
 >>     Appearance ap = new Appearance();
 >>
 >>     // load textures
 >>     TextureAttributes texAttr1 = new TextureAttributes();
 >>     texAttr1.setTextureMode(TextureAttributes.DECAL);
 >>     TextureAttributes texAttr2 = new TextureAttributes();
 >>     texAttr2.setTextureMode(TextureAttributes.MODULATE);
 >>
 >>     TextureLoader tex = new TextureLoader(stoneImage, new
String("RGB"), this);
 >>     if (tex == null)
 >>         return null;
 >>     stoneTex = tex.getTexture();
 >>
 >>     tex = new TextureLoader(skyImage, new String("RGB"), this);
 >>     if (tex == null)
 >>         return null;
 >>     skyTex = tex.getTexture();
 >>
 >>     lightTex = createLightMap();
 >>
 >>
 >>     textureUnitState[0] = new TextureUnitState(stoneTex, texAttr1,
null);
 >>
textureUnitState[0].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
 >>
 >>     textureUnitState[1] = new TextureUnitState(lightTex, texAttr2,
null);
 >>
textureUnitState[1].setCapability(TextureUnitState.ALLOW_STATE_WRITE);
 >>
 >>     ap.setTextureUnitState(textureUnitState);
 >>
 >>     //Create a Box
 >>     Box BoxObj = new Box(1.5f, 1.5f, 0.8f, Box.GENERATE_NORMALS |
 >>                             Box.GENERATE_TEXTURE_COORDS, ap, 2);
 >>     // add it to the scene graph.
 >>     objTrans.addChild(BoxObj);
 >>
 >>     BoundingSphere bounds =
 >>       new BoundingSphere(new Point3d(0.0,0.0,0.0), 100.0);
 >>
 >>     //Shine it with two lights.
 >>     Color3f lColor1 = new Color3f(0.7f, 0.7f, 0.7f);
 >>     Color3f lColor2 = new Color3f(0.2f, 0.2f, 0.1f);
 >>     Vector3f lDir1  = new Vector3f(-1.0f, -1.0f, -1.0f);
 >>     Vector3f lDir2  = new Vector3f(0.0f, 0.0f, -1.0f);
 >>     DirectionalLight lgt1 = new DirectionalLight(lColor1, lDir1);
 >>     DirectionalLight lgt2 = new DirectionalLight(lColor2, lDir2);
 >>     lgt1.setInfluencingBounds(bounds);
 >>     lgt2.setInfluencingBounds(bounds);
 >>     objScale.addChild(lgt1);
 >>     objScale.addChild(lgt2);
 >>
 >>     // Let Java 3D perform optimizations on this scene graph.
 >>     objRoot.compile();
 >>
 >>     return objRoot;
 >>   }
 >>
 >>   public MultiTextureTest (){
 >>   }
 >>
 >>   public MultiTextureTest(java.net.URL stoneURL, java.net.URL skyURL) {
 >>     stoneImage = stoneURL;
 >>     skyImage = skyURL;
 >>   }
 >>
 >>   public void init() {
 >>     if (stoneImage == null) {
 >>       // the path to the image for an applet
 >>       try {
 >>         stoneImage = new java.net.URL(getCodeBase().toString() +
 >>                                       "../images/stone.jpg");
 >>       }
 >>       catch (java.net.MalformedURLException ex) {
 >>         System.out.println(ex.getMessage());
 >>         System.exit(1);
 >>       }
 >>     }
 >>
 >>     if (skyImage == null) {
 >>       // the path to the image for an applet
 >>       try {
 >>         skyImage = new java.net.URL(getCodeBase().toString() +
 >>                                     "../images/bg.jpg");
 >>       }
 >>       catch (java.net.MalformedURLException ex) {
 >>         System.out.println(ex.getMessage());
 >>         System.exit(1);
 >>       }
 >>     }
 >>
 >>     setLayout(new BorderLayout());
 >>     GraphicsConfiguration config =
 >>        SimpleUniverse.getPreferredConfiguration();
 >>
 >>     Canvas3D c = new Canvas3D(config);
 >>     add("Center", c);
 >>
 >>     // create the gui
 >>     choice = new Choice();
 >>     choice.addItem("stone + light");
 >>     choice.addItem("stone");
 >>     choice.addItem("lightMap");
 >>     choice.addItem("sky");
 >>     choice.addItem("stone + sky");
 >>     choice.addItemListener(this);
 >>     add("North", choice);
 >>
 >>     BranchGroup scene = createSceneGraph();
 >>     u = new SimpleUniverse(c);
 >>
 >>     ViewingPlatform viewingPlatform = u.getViewingPlatform();
 >>     // This will move the ViewPlatform back a bit so the
 >>     // objects in the scene can be viewed.
 >>     viewingPlatform.setNominalViewingTransform();
 >>
 >>     // add orbit behavior but disable translate
 >>     OrbitBehavior orbit =
 >>         new OrbitBehavior(c, OrbitBehavior.DISABLE_TRANSLATE);
 >>     BoundingSphere bounds =
 >>         new BoundingSphere(new Point3d(0.0, 0.0, 0.0), 100.0);
 >>     orbit.setSchedulingBounds(bounds);
 >>     viewingPlatform.setViewPlatformBehavior(orbit);
 >>
 >>     u.addBranchGraph(scene);
 >>   }
 >>
 >>     public void destroy() {
 >>         u.removeAllLocales();
 >>     }
 >>
 >>   public void itemStateChanged(ItemEvent e)
 >>   {
 >>     int index = choice.getSelectedIndex();
 >>
 >>     switch (index) {
 >>     case 0 : /* stone + light */
 >>         textureUnitState[0].setTexture(stoneTex);
 >>         textureUnitState[1].setTexture(lightTex);
 >>         break;
 >>     case 1 : /* stone */
 >>         textureUnitState[0].setTexture(stoneTex);
 >>         textureUnitState[1].setTexture(null);
 >>         break;
 >>     case 2 : /* light */
 >>         textureUnitState[0].setTexture(null);
 >>         textureUnitState[1].setTexture(lightTex);
 >>         break;
 >>     case 3 : /* sky */
 >>         textureUnitState[0].setTexture(null);
 >>         textureUnitState[1].setTexture(skyTex);
 >>         break;
 >>     case 4 : /* stone + sky */
 >>         textureUnitState[0].setTexture(stoneTex);
 >>         textureUnitState[1].setTexture(skyTex);
 >>         break;
 >>     default:  /* both */
 >>         break;
 >>     }
 >>   }
 >>
 >>   public static void main(String argv[])
 >>   {
 >>     java.net.URL stoneURL = null;
 >>     java.net.URL skyURL = null;
 >>     // the path to the image for an application
 >>     try {
 >>       stoneURL = new java.net.URL("file:../images/stone.jpg");
 >>       skyURL = new java.net.URL("file:../images/bg.jpg");
 >>     }
 >>     catch (java.net.MalformedURLException ex) {
 >>       System.out.println(ex.getMessage());
 >>       System.exit(1);
 >>     }
 >>     new MainFrame(new MultiTextureTest(stoneURL, skyURL), 750, 750);
 >>   }
 >> }
 >>
 >> MultiTextureTest.java
 >>
 >> Content-Description:
 >>
 >> MultiTextureTest.java
 >> Content-Type:
 >>
 >> TEXT/plain
 >>
 >>


--
___________________________________________________________

Shawn Kendall               Full Sail Real World Education
Course Director             3300 University BLVD
Real Time 3D for Gaming     Winter Park FL 32792
[EMAIL PROTECTED]       http://www.fullsail.com
___________________________________________________________


--
___________________________________________________________

Shawn Kendall               Full Sail Real World Education
Course Director             3300 University BLVD
Real Time 3D for Gaming     Winter Park FL 32792
[EMAIL PROTECTED]       http://www.fullsail.com
___________________________________________________________

===========================================================================
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