四边形的纹理更新是很迅速的:每秒可更新25帧,纹理需要变化25次。因此,实现高效地纹理化是十分重要的。这有可能通过把某些特定的格式指定给BufferedImage和ImageComponent2D对象来实现。
ImageComponent2D对象由JMFMovieScreen所使用,其声明如下:
ImageComponent2D ic = new ImageComponent2D(
ImageComponent2D.FORMAT_RGB,
FORMAT_SIZE, FORMAT_SIZE, true, true);
构造器中的最后两个参数指出,它使用的是"by reference"和"Y-up"方式。由于Java 3D会避免把图像从应用程序空间复制到图像内存中去,所以这里指出的方式将减少存储纹理图像的内存需求。
在Windows操作 系统环境下,Java 3D用OpenGL作基本的着色引擎,ImageComponent2D格式应该是ImageComponent2D.FORMAT_RGB(如上所述),BufferedImage格式应该是BufferedImage.TYPE_3BYTE_BGR。在JMFSnapper中BufferedImage格式是固定的。
要想对此和其它性能技巧有更多的了解,可以参见j3d.org。
把纹理链接到四边形上
把纹理图像平铺到一个四边形上的常用方法是,把纹理的左下角链接到四边形的左下角,并以反时针方向指定其它链接。这种方法显示在图4中。
图 4.纹理与四边形间的标准链接
纹理坐标的范围是0-1,沿着x轴和y轴,且y轴方向向上。例如,纹理左下角使用坐标(0,0),则右上角为(1,1)。
当使用"Y-up"方式时,y轴的纹理坐标是颠倒的,即指向下方。这就是说,坐标(0,0)对应纹理的左上角,而(1,1)对应纹理的右下角。
在使用"Y-up"方式情况下,纹理坐标一定要赋给四边形的不同点以取得图像的相同的方向。这种新的配置显示在图5中。
图 5. 当使用"Y-up"方式时的纹理与四边形的链接
在JMFMovieScreen中,实现把四边形顶点与纹理坐标相链接的代码如下:
TexCoord2f q = new TexCoord2f();
q.set(0.0f, 0.0f);
plane.setTextureCoordinate(0, 3, q);
//纹理坐标(0,0)-->四边形左上点(p3)
q.set(1.0f, 0.0f);
plane.setTextureCoordinate(0, 2, q);
// (1,0) -->右上(p2)
q.set(1.0f, 1.0f);
plane.setTextureCoordinate(0, 1, q);
// (1,1) -->右下(p1)
q.set(0.0f, 1.0f);
plane.setTextureCoordinate(0, 0, q);
// (0,1) -->左下(p0)
这里的平面对象代表了四边形。
更新图像
前面已经提到,一个TimeBehavior对象被建立以每隔40毫秒调用一次JMFMovieScreen的nextFrame()方法。而ne