Я сталкиваюсь с проблемами при попытке использовать буферы хранения шейдеров OpenGLES 3.1
Я могу отправить данные в GPU с помощью:
GLES31.glGenBuffers(1,this.storageShaderBufferObject,0)
GLES31.glBindBuffer(GLES31.GL_SHADER_STORAGE_BUFFER, this.storageShaderBufferObject[0])
GLES31.glBindBufferBase(GLES31.GL_SHADER_STORAGE_BUFFER,3,this.storageShaderBufferObject[0])
println("SSBO index : " + storageShaderBufferObject[0])
// nb of element in ssbo
val size = this.meshSizeX*this.meshSizeY
val ssboData = FloatArray(size)
var count=0
for (i in 0 until this.meshSizeX) {
for (j in 0 until this.meshSizeY) {
ssboData[count]=0F // custom function used to fill the ssbo
count++
}
}
val vertexDataBuffer = ByteBuffer.allocateDirect(ssboData.size * 4)
.order(ByteOrder.nativeOrder())
.asFloatBuffer()
vertexDataBuffer.put(ssboData)
vertexDataBuffer.position(0)
//sending data
GLES31.glBufferData(GLES31.GL_SHADER_STORAGE_BUFFER, ssboData.size * 4, vertexDataBuffer, GLES31.GL_STATIC_COPY)
После предоставления данных я выполняюэтот простой вычислительный шейдер:
#version 310 es
layout(std140, binding = 3) buffer destBuffer
{
float data[];
} outBuffer;
layout (local_size_x = 8, local_size_y = 8, local_size_z = 1) in;
void main()
{
uint gWidth = gl_WorkGroupSize.x * gl_NumWorkGroups.x;
uint offset = gl_GlobalInvocationID.x * gWidth + gl_GlobalInvocationID.y;
outBuffer.data[offset] = float(offset);
}
И, наконец, я хотел бы получить данные, но я не знаю, как поступить, но я думаю, что задействована функция GLES31.glUnmapBuffer (как используется в/ C ++ программы).
Любая помощь будет высоко ценится.