着色器存储缓冲区对象:字节顺序?

Shader Storage Buffer Objects: endianness?

OpenGL ES 3.1,Android。

我设置 SSBO 的目的是在片段着色器中写入一些内容并在应用程序中读回。事情几乎可以正常工作,即我可以读回我写的值,但有一个问题:当我读取一个 INT 时,它的字节被反转(在着色器中写入的 '17' = 0x00000011 返回为 '285212672' = 0x11000000 )。

这是我的做法:

着色器

(...)
layout (std140,binding=0) buffer SSBO
  {
  int ssbocount[];
  };
(...)
ssbocount[0] = 17;   
(...)

申请代码

int SIZE = 40;
int[] mSSBO = new int[1];
ByteBuffer buf = ByteBuffer.allocateDirect(SIZE).order(ByteOrder.nativeOrder());
(...)
glGenBuffers(1,mSSBO,0);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, mSSBO[0]);
glBufferData(GL_SHADER_STORAGE_BUFFER, SIZE, null, GL_DYNAMIC_READ);
buf = (ByteBuffer) glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, SIZE, GL_MAP_READ_BIT );
glBindBufferBase(GL_SHADER_STORAGE_BUFFER,0, mSSBO[0]);
(...)
int readValue = buf.getInt(0);

现在打印出值,它以“17”的形式出现,字节反转。
请注意,我确实使用 'nativeOrder' 分配了 ByteBuffer。当然,我可以手动翻转字节,但问题是这有时会起作用,具体取决于主机的字节序...

解决方法是使用本机字节顺序,并使用 ByteBuffer.asIntBuffer() 创建 ByteBuffer 的整数视图。出于某种原因,本地 getInt() 调用似乎不遵守本地 ByteBuffer 字节序设置。