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

时间:2018-03-28 14:51:00

标签: android opengl-es bytebuffer

OpenGL ES 3.1,Android。

我已经设置了SSBO,意图在片段着色器中写入内容并在应用程序中将其读回。事情几乎可以工作,即我可以读回我写的值,有一个问题:当我读取INT时,它的字节反转(在着色器中写入的' 17' = 0x00000011返回为&# 39; 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'反转字节。
请注意,我将ByteBuffer与' nativeOrder'分配。当然,我可以手动翻转字节,但问题是这有时只会起作用,具体取决于主机的字节顺序......

1 个答案:

答案 0 :(得分:1)

修复方法是使用原生endianess,并使用ByteBuffer创建ByteBuffer.asIntBuffer()的整数视图。由于某些原因,本地getInt()调用似乎不尊重本地ByteBuffer字节序设置。