Войти
ПрограммированиеФорумГрафика

Как получить данные из OpenGL Compute Shader?

Страницы: 1 2 Следующая »
#0
23:32, 14 июля 2020

Вроде бы простой вопрос, но внятного ответа на него я так нигде и не нашел.

Есть простой OpenGL Compute Shader (только учусь с ними работать), в который мы передаем данные, потом что-то с ними делаем, а потом надо как-то достать данные назад

#version 430 core

layout (local_size_x = 64, local_size_y = 1, local_size_z = 1) in;

layout (std430, binding = 0) buffer indices {
  int j[];
} bit_reversed;

uniform int N;

void main(void)
{
  uint x = gl_GlobalInvocationID.x;
  //uint y = gl_GlobalInvocationID.y;
  //uint z = gl_GlobalInvocationID.z;
  //const uint index = x + (y * 64) + (z * 64 * 64);

  int t = bit_reversed.j[x];
  bit_reversed.j[x] = t + N;
}

как вытащить назад данные массива bit_reversed?


#1
0:03, 15 июля 2020
  // read back data
  //
  glBindBuffer(GL_SHADER_STORAGE_BUFFER, buf2); 
  void* resultData = glMapBufferRange(GL_SHADER_STORAGE_BUFFER, 0, array2.size()*sizeof(float), GL_MAP_READ_BIT); 
  memcpy(&array2[0], resultData, array2.size()*sizeof(float));
  glUnmapBuffer(GL_SHADER_STORAGE_BUFFER); 
 
#2
(Правка: 3:54) 3:47, 15 июля 2020

Назад, ты имеешь ввиду на CPU? Тогда только через текстуру или буфер как FROL сказал. В любом случае это map/unmap.
Если тебе их нужно передать другому шейдеру, то пиши в текстуру или буфер и читай их непосредственно. Это быстрее и проще.

#3
3:57, 15 июля 2020

san
> Назад, ты имеешь ввиду на CPU? Тогда только через текстуру или буфер как FROL
> сказал. В любом случае это map/unmap.
У тебя проблемы со зрением, раз не можешь прочитать код ТС?

#4
4:06, 15 июля 2020

АкронимЛета
У тебя проблемы с воспитанием, раз не можешь культурно общаться? Извини, не люблю хамов и дураков.

#5
4:18, 15 июля 2020

san
> У тебя проблемы с воспитанием, раз не можешь культурно общаться?
Это я просто так люблю тебя)

#6
10:08, 15 июля 2020

Вот это поворот

#7
20:17, 15 июля 2020

Совет FROL мне реально помог, большое спасибо!

#8
20:27, 15 июля 2020

А можно ли как-то дебажить OpenGL Compute shader's? Например поставить в коде бряку и увидеть состояние переменной? Как народ решает такую проблему? Как быть если шейдер сложный и его нужно продебажить?

#9
20:28, 15 июля 2020

Proton
> Как народ решает такую проблему? Как быть если шейдер сложный и его нужно
> продебажить?
В голове

#10
23:16, 15 июля 2020
Как народ решает такую проблему?

Использованием актуальных графических API с поддержкой дебага, ваш К.О.
#11
23:26, 15 июля 2020

drcrack
> Использованием актуальных графических API с поддержкой дебага, ваш К.О.
вроде в metal такое реально можно, а вот в opengl облом.

#12
(Правка: 2:50) 1:48, 16 июля 2020

Proton
> Как быть если шейдер сложный и его нужно продебажить?
изголяться с сигнализацией цветом в один из аутпут параметров)

#13
8:29, 16 июля 2020

АкронимЛета
> В голове

+1000  - нужно думать прежде чем писать

kkolyan
> изголяться с сигнализацией цветом в один из аутпут параметров)

как вариант

#14
8:45, 16 июля 2020

Proton

> А можно ли как-то дебажить OpenGL Compute shader's? Например поставить в коде
> бряку и увидеть состояние переменной? Как народ решает такую проблему? Как быть
> если шейдер сложный и его нужно продебажить?


Вообще именно по этой причине в промышленном программировании цветут технологии различного рода автоматического тестирования (юнит, интеграционное, все вот эти черные и белые ящики).

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

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика