Форум программистов, компьютерный форум, киберфорум
Наши страницы
OpenGL
Войти
Регистрация
Восстановить пароль
 
homelleon
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
1

Передача данных буфера из Compute Shader в CPU

17.11.2017, 18:20. Просмотров 320. Ответов 1

Здравствуйте!
Пытаюсь реализовать чтение из карты высот и запись данных в массив.
Подключаю текстуру карты высот и пустой SSBO.
Запускаю вычисления.
Подключаю еще раз тот же SSBO.
Делаю glMapBuffer в локальный буфер, записываю все в массив.
В итоге: нули.
Подскажите, где ошибка? Или как еще прочитать данные? Если в последовательности нет ошибки - возможно не правильно использую ByteBuffer - тогда буду с ним разбираться.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class HeightPositionRenderer {
    
    HeightPositionShader shader;
    Texture2D heightMap;
    HeightStructure buffer;
    
    public HeightPositionRenderer(Texture2D heightMap) {
        this.heightMap = heightMap;
        this.shader = new HeightPositionShader();
        shader.start();
        shader.connectTextureUnits();
        shader.stop();
    }
    
    // inner structure class
    private class HeightStructure {
        public float[] heights;
        
        public HeightStructure(int size) {
            this.heights = new float[size];
        }
    }
    
    public void render() {
        int size =  heightMap.getHeight();
        buffer = this.new HeightStructure(size * size);
        VBO vbo = Loader.getInstance().getVertexLoader().loadToVBOasSSBO(buffer.heights);   
        // compute
        heightMap.bind(1);
        vbo.bindBase(0);
        GL43.glDispatchCompute(size, size, 1);
        GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT);
        GL11.glFinish();
        vbo.bind();
        ByteBuffer byteBuffer = GL15.glMapBuffer(GL43.GL_SHADER_STORAGE_BUFFER, GL15.GL_READ_ONLY, null);
        for(int i = 0; i < size; i++) {
            this.buffer.heights[i] = byteBuffer.getFloat(i);
            System.out.println(this.buffer.heights[i]);
        }
        GL15.glUnmapBuffer(GL43.GL_SHADER_STORAGE_BUFFER);
        System.exit(0);
        shader.stop();
    }
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//COMPUTE SHADER - heightPoints
#version 430 core
 
layout (local_size_x = 1, local_size_y = 1) in;
 
uniform sampler2D heightMap;
 
layout (std430, binding = 0) writeonly buffer positionBuffer {
    float height[];
};
 
void main(void) {
 
    vec2 textureCoord = gl_GlobalInvocationID.xy;
 
    int index = int(gl_WorkGroupID.y * gl_NumWorkGroups.x + gl_WorkGroupID.x);
    height[index] =  texture(heightMap, textureCoord).r;
 
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2017, 18:20
Ответы с готовыми решениями:

Использование обычного VBO с Compute Shader, а также SSBO, TBO, UBO
Здравствуйте! Для создания карты высот мне понадобилось использовать уже готовый VBO. Скажите, как...

[Тесселяция] Ошибки синтаксиса при компиляции Tesselation Control Shader и Tesselation Evaluation Shader
Изучаю OpenGL по книге &quot;OpenGL SuperBible&quot;. Пытаюсь компилировать примеры с помощью C# и OpenTK....

DirectX 11 + Compute Shader Input Data
Добрый вечер, начал разбираться с ComputeShaders в DirectX 11, но никак не могу понять, каким...

Передача данных между CPU и FPU
Всем привет! Скажите пожалуйста, как можно передавать данные из CPU в FPU ( и обратно )? И...

Ошибка при работе с шейдером Both a vertex shader and pixel shader must be set on the device before any draw operations may be performed
Собственно ошибка Шейдр sampler2D g_samSrcColor; float timeraslow=1.0; float4 MyShader(...

1
homelleon
4 / 4 / 3
Регистрация: 15.12.2012
Сообщений: 192
24.12.2017, 00:35  [ТС] 2
В итоге все было очень просто.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public void render() {
        int size =  heightMap.getHeight();
        buffer = this.new HeightStructure(size * size);
        VBO vbo = Loader.getInstance().getVertexLoader().loadToVBOasSSBO(buffer.heights);   
        // compute
        shader.start();  <<< ЗАБЫЛ ЭТО
        heightMap.bind(1);
        vbo.bindBase(0);
        GL43.glDispatchCompute(size, size, 1);
        GL42.glMemoryBarrier(GL43.GL_SHADER_STORAGE_BARRIER_BIT);
        GL11.glFinish();
        vbo.bind();
        ByteBuffer byteBuffer = GL15.glMapBuffer(GL43.GL_SHADER_STORAGE_BUFFER, GL15.GL_READ_ONLY, null);
        for(int i = 0; i < size; i++) {
            this.buffer.heights[i] = byteBuffer.getFloat(i);
            System.out.println(this.buffer.heights[i]);
        }
        GL15.glUnmapBuffer(GL43.GL_SHADER_STORAGE_BUFFER);
        System.exit(0);
        shader.stop();
    }
Добавлено через 2 минуты
Теперь другой вопрос. Я записываю таким образом в SSBO шейдер и передаю heights[i] данные из буфера, но у меня почему-то в heights[i] записывается всегда одно и тоже значение. Проблема возникает, когда я в шейдере делаю это:
height[index] = texture(heightMap, textureCoord).r;
Почему-то у меня всегда мапится только одна координата, хотя textureCoord прогоняется по всем, а вот функция texture() работает странно.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.12.2017, 00:35

Передача буфера
Здравствуйте. Нужно передать в драйвер информацию через DEVICE_CONTROL. Но информация не...

Передача большого буфера даных
Добрый день , столкнулся с такой проблемой, мне нужно передать на сервер буфер длинной допустим...

Передача буфера обмена по сети
Не знал как сформулировать тему, поэтому написал здесь и назвал так Я не админ. Всех тонкостей...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru