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