Как предоставить и получить данные с плавающей точкой в ​​GL_SHADER_STORAGE_BUFFER из приложения для Android - PullRequest
1 голос
/ 09 июля 2019

Я сталкиваюсь с проблемами при попытке использовать буферы хранения шейдеров 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 ++ программы).

Любая помощь будет высоко ценится.

...