当前位置: 首页 > 知识库问答 >
问题:

JOGL中的交织数据

裴经义
2023-03-14

我找不到任何关于在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字节*每个属性4个浮点数*每个顶点2个属性。

共有1个答案

百里俭
2023-03-14

我怀疑设置FloatBuffer的位置不会给出所需的行为是因为通过引用传递了FloatBuffer。您可能希望创建另一个FloatBuffer,它基本上只是相同数据的不同视图(例如,包装一个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。我提出这个问题是因为当您使用客户机内存而不是VBOs时,会有更多的CPU->GPU内存传输进行,每一点大小的减小都会有所帮助。

 类似资料:
  • JOGL Transformation 转换 是一种为图形对象提供特殊效果的机制。这些效果在创建图像后应用。以下是常用的转换函数: JOGL glLoadIdentity() 方法 glLoadIdentity() 方法用单位矩阵替换当前的变换矩阵 它可以在执行转换之前重置当前的转换矩阵。 JOGL glTranslate() 方法 glTranslate() 方法将当前矩阵乘以一个平移矩阵。 要

  • JOGL 是Java对于OpenGl的绑定(Java Bindings for OpenGL). 示例代码: import net.java.games.jogl.*;public class HelloWorld {   public static void main (String args[]) {       try {         System.loadLibrary("jogl")

  • OpenGL (JOGL)的 Java 绑定是一个用 Java 绑定 OpenGL 图形的开源库。本教程提供了对 JOGL 库及其功能的基本了解。 它还解释了如何使用 JOGL 开发 2D 和 3D 图形应用程序。

  • 主要内容:JOGL 内置Primitive参数, JOGLDisplay() 方法, JOGL Primitive绘制线 示例, 作为一个开放的图形库,我们可以在 JOGL 中绘制不同的形状,如圆形、三角形、正方形。因此,为了绘制这些形状,Open GL 提供了有助于 JOGL 绘制 2D 和 3D 尺寸图形的基元。 OpenGL Primitive 提供了各种内置参数,根据这些参数可以绘制不同的形状。每个参数在绘制图形中都有一些特定的作用。 JOGL 内置Primitive参数 以下是 JOG

  • 主要内容:JOGL GLCanvas 类,JOGL GLJPanel 类,JOGL GLCapibilities类 在本节中,我们将了解 JOGL 提供的类。通过这些类,我们可以在Java代码中添加OpenGL的功能。 以下是 JOGL 提供的重要类: GLCanvas 和 GLJPanel 类是实现 GLAutoDrawable 接口并用作 Open GL 命令的绘图表面的 GUI 类。 GLCanvas 类 GLJPanel 类 GLProfile 类 GLCapabilities 类 JO

  • 我想用Java学习OpenGL。我没有使用OpenGL的经验,但我对Java很满意。 计划是在Eclipse Indigo中使用JOGL。首先,从Schabby的博客中编写了一个简单的hello world应用程序。我的应用程序的源代码是相同的。 我遵循所有步骤并引用gluegen-rt-natives-windows-amd64.jar、gluegen-rt.jar、jogl-all.jar和j