java - JOGL 中的交错数据

标签 java opengl jogl

我找不到有关在 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/

相关文章:

Java 8 和流上的聚合操作

c++ - 从并行线程在主 Maya 线程上执行代码

java - gl.glScalef() 隐藏 gl.glDrawArrays() 绘图

Java列表类型参数

java - maven - 引用本地设置.xml

c++ - 无法在 openGL 中渲染天空盒

java - JOGL 无法弄清楚为什么绘制的线没有出现

opengl - Sampler2DArray - 设置和使用

java - 通过将 Spring MVC 与 AJAX/JSON 和 MappingJackson 结合使用来引发 LazyInitializationException

c++ - c++ 未指定结构布局时,为什么 glBufferData 可以为 UBO 和 SSBO 缓冲结构