我试图将一个对象放入 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,但如果我能弄清楚这将简化使用不同类型顶点的过程。