着色器存储缓冲区对象:字节顺序?
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
字节序设置。
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
字节序设置。