Java LWJGL中glGetActiveAttrib结果中的切换字节顺序

Java LWJGL中glGetActiveAttrib结果中的切换字节顺序,java,opengl,lwjgl,Java,Opengl,Lwjgl,我试图将glGetActiveAttrib(值类型和大小)的输出与OpenGL常量进行比较,但没有得到合理的结果。经过一些实验后,我注意到字节顺序被切换,因此以下代码: ByteBuffer auxType = ByteBuffer.allocateDirect(4); IntBuffer type = auxType.asIntBuffer(); ByteBuffer auxSize = ByteBuffer.allocateDirect(4); IntBuff

我试图将glGetActiveAttrib(值类型和大小)的输出与OpenGL常量进行比较,但没有得到合理的结果。经过一些实验后,我注意到字节顺序被切换,因此以下代码:

    ByteBuffer auxType = ByteBuffer.allocateDirect(4);
    IntBuffer type = auxType.asIntBuffer();
    ByteBuffer auxSize = ByteBuffer.allocateDirect(4);
    IntBuffer size = auxSize.asIntBuffer();
    String name = glGetActiveAttrib(shader.program, 1, size, type);
    System.out.println(type.get(0));
产出138484216。重新排序字节后,我得到35666(GL_FLOAT_VEC4)-这是正确的。大小值也有同样的问题。LWJGL中是否有任何小的big-endian开关,或者图形卡驱动程序是否有问题?我使用的是LWJGL 3.1.1,图形卡是NVIDIA GTX 1060

LWJGL中是否有任何小的big-endian开关,或者图形卡驱动程序是否有问题

它实际上是关于
ByteBuffer
本身的。它有一个字节顺序。因此,不要像这样创建
类型
ByteBuffer

IntBuffer type = ByteBuffer.allocateDirect(4)
                           .asIntBuffer();
创建它并告诉它字节顺序:

IntBuffer type = ByteBuffer.allocateDirect(Integer.BYTES)
                           .order(ByteOrder.nativeOrder())
                           .asIntBuffer();
另外,由于您使用的是LWJGL,因此还可以使用静态帮助器类
org.LWJGL.BufferUtils
,而只需执行以下操作:

IntBuffer type = BufferUtils.createIntBuffer(1);
现在
type.get(0)
应该正确地生成
35666
,而不是
138484216
。如果将相同的值应用于
大小
,则应同样产生假定值

由于您没有提供着色器,因此我使用以下工具对其进行了测试:

...
layout(location = 1) in vec3 position;
...
然后,当调用
glGetActiveAttrib
时,它正确地生成:

String name = glGetActiveAttrib(shader.program, 1, size, type);
System.out.println(name); // prints "position"
System.out.println(type.get(0)); // prints "35665"
System.out.println(size.get(0)); // prints "1"
请记住,
size
只是数组的元素计数,因此,由于我们不处理数组,因此它会产生
1