2

我试图将一个对象放入 ByteBuffer 无济于事。

我正在尝试为 Android 创建一个模仿 DirectX/XNA 顶点缓冲区的 VertexBuffer 类。我的意思是我想允许任何类型的顶点结构(实现某个接口/扩展某个类。)为了做到这一点,我需要将该对象转换为字节 []。

我研究了 Serializable、ByteArrayOutputStream 和 ObjectOutputStream,字节它给了我太多字节。前任。对于 x、y 和 z 具有 3 个浮点数的 Vertex 类应该是大约 3 * 4 或 12 个字节,但结果数组的长度为 51!我很确定额外的字节是序列化的结果,我可能只取数组末尾的字节,但这会更慢,如果有更简单的方法,我会更喜欢。

我还研究了使用 getClass 方法并递归地遍历字段,直到获得原始数据。使用原始数据,我可以使用相应的 put 方法将其直接放入 ByteBuffer 中。这是迄今为止最强大的方法(在我看来),但这似乎比仅使用序列化更困难。

编辑:顶点缓冲区类应该将顶点数据作为字节存储在 ByteBuffer(或其他扩展名)中。顶点数据类应该继承一个“getVertexDeclaration”方法,该方法告诉顶点缓冲区应该如何使用字节。例如:

public class ColoredTexturedVertex implements Vertex
{
    public Vector3 Position;
    public Vector2 TexCoord;
    public int Color;

    public VertexDeclaration getVertexDeclaration()
    {
         return VertexDeclaration.createFromArray(new VertexElement[] {
             new VertexElement(0, 4 * 3, Usage.Position),
             new VertexElement(12, 4 * 2, Usage.TexCoord),
             new VertexElement(20, 4 * 1, Usage.Color)
             });
    }
}

当传入顶点缓冲区时,这个类将告诉缓冲区它是一个带有位置、纹理坐标和颜色数据的顶点。VertexDeclaration 反映了类的字段。前 12 个字节(Vector3)将用作位置数据。接下来的 8 个字节(Vector2)将用作纹理坐标。最后 4 个字节将用作颜色数据。

回到我的问题,我只是想隔离这些字节以存储在顶点缓冲区中。我在 ByteBuffer 中需要它们的原因是因为 glDrawElements 需要一个 Buffer 与它的其他参数一起传递。

我不想将顶点恢复到原始状态,所以我不需要序列化在创建字节时产生的所有额外内容。

我可以只使用浮点数组和 FloatBuffer,但如果我能弄清楚这将简化​​使用不同类型顶点的过程。

4

2 回答 2

1

Java 序列化使用一种特殊的格式,它可以被 Java 读取,并且允许恢复与写入的对象具有相同结构(和内容)的对象。如果您考虑到某些特定的接收器,这不是您想要的。(你的问题在这里不是很清楚。)

我真的不知道你的“顶点缓冲区”应该做什么,但你必须设计一个关于如何存储“任意顶点结构”对象的协议。如果这是某个接口给出的,则使用该接口的方法来存储数据。

对不起,这有点模糊,但你的问题也很模糊。

于 2011-08-15T21:50:14.120 回答
1

序列化不只是将浮点数放入输出流:它还放入一些关于 Vertex 类的信息,以便 JVM 知道在反序列化发生时应该实例化哪个类。

于 2011-08-15T21:52:33.467 回答