OpenGL ES 3.1,安卓。
我已经设置了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。当然,我可以手动翻转字节,但需要注意的是,这只会在某些时候起作用,这取决于主机的功能.
发布于 2018-04-04 09:38:11
修复方法是使用本机endianess,并使用ByteBuffer使用ByteBuffer.asIntBuffer()创建一个整数视图。由于某些原因,本地getInt()调用似乎不尊重本地ByteBuffer endianness设置。
https://stackoverflow.com/questions/49537730
复制相似问题