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'分配。当然,我可以手动翻转字节,但问题是这有时只会起作用,具体取决于主机的字节顺序......
答案 0 :(得分:1)
修复方法是使用原生endianess,并使用ByteBuffer
创建ByteBuffer.asIntBuffer()
的整数视图。由于某些原因,本地getInt()
调用似乎不尊重本地ByteBuffer
字节序设置。