我找不到有关在 JOGL 中渲染交错顶点数组(不是 VBO)的正确方法的任何信息。具体来说,使用 glVertexAttribPointer() 似乎不允许在交错数据(FloatBuffer)内指定偏移量。在 C、C++ 或 Objective-C 中,我确切地知道如何做到这一点,但在 Java 中似乎没有明确的胜利之路。
我尝试过的唯一看起来可能有效的方法是在使用 glVertexAttribPointer() 之前设置缓冲区的位置,但这没有效果。
为了清楚起见,下面是渲染函数中的代码示例:
gl.glEnableVertexAttribArray( POSITION_ATTRIB );
gl.glEnableVertexAttribArray( NORMAL_ATTRIB );
gl.glVertexAttribPointer( POSITION_ATTRIB, 4, GL.GL_FLOAT, false, 32, vertexBuffer );
// vertexBuffer.position( 4 ); if I try to specify an offset
gl.glVertexAttribPointer( NORMAL_ATTRIB, 4, GL.GL_FLOAT, false, 32, vertexBuffer );
gl.glDrawArrays( GL.GL_TRIANGLES, 0, nummy );
gl.glDisableVertexAttribArray( NORMAL_ATTRIB );
gl.glDisableVertexAttribArray( POSITION_ATTRIB );
我为我拥有的每个属性使用 4 个 float 。我选择的步幅为 32,基于
每个 float 4 个字节 * 每个属性 4 个 float * 每个顶点 2 个属性。
最佳答案
我怀疑设置 FloatBuffer 的位置没有给你想要的行为的原因是因为你通过引用传递了 FloatBuffer 。您可能想要创建另一个 FloatBuffer,它基本上只是相同数据的不同 View (例如,包装一个 float []),并将此其他 FloatBuffer 中的位置设置为 4...
例如:
// Somewhere in your class
private float [] verts;
// You can fill this with actual data yourself, I did the hard part :P
verts = new float [] { 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f };
// ^^^^^^^^^ POS ^^^^^^^^ ^^^^^^^ NORMAL ^^^^^^^
//
// When it comes time to supply the vertex pointers, use this:
//
FloatBuffer vtx_base = FloatBuffer.wrap (verts);
FloatBuffer norm_base = FloatBuffer.wrap (verts, 4, verts.length () - 4);
gl.glVertexAttribPointer (POSITION_ATTRIB, 4, GL.GL_FLOAT, false, 32, vtx_base);
gl.glVertexAttribPointer (NORMAL_ATTRIB, 4, GL.GL_FLOAT, false, 32, norm_base);
免责声明:我已经很多年没有使用 Java 了,所以不要指望它能立即编译。不过,基本理论应该是合理的。
我确实想知道你是否真的需要 4D 顶点位置和法线? w
有非常实际的用途,但如果您实际上不需要它,请节省一些存储/带宽并使用 3D。我提出这一点是因为当您使用客户端内存而不是 VBO 时,会发生更多的 CPU->GPU 内存传输,并且每一位大小的减小都会有所帮助。
关于java - JOGL 中的交错数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18667789/