Являются ли текстуры единственным способом передачи аудиоданных в GLSL? - PullRequest
0 голосов
/ 19 декабря 2018

Я наткнулся на статью, в которой разработчик создает музыкальный визуализатор с программированием шейдеров.Он передает аудио информацию в GLSL с помощью текстур.https://noisehack.com/build-music-visualizer-web-audio-api/

function copyAudioDataToTexture(gl, audioData, textureArray) {
  for (let i = 0; i < audioData.length; i++) {
    textureArray[4 * i + 0] = audioData[i] // R
    textureArray[4 * i + 1] = audioData[i] // G
    textureArray[4 * i + 2] = audioData[i] // B
    textureArray[4 * i + 3] = 255          // A
  }
  gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, audioData.length, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, textureArray)
}

Я также заметил, shadertoy делает то же самое .

Мне было интересно, данные вообще представлены только через текстуры, есть ли другие способынаправлять данные в glsl, может быть, как вершины или что-то еще?

Редактировать: Я заметил, что есть вещь, называемая «униформой», может быть, я могу вставить в нее аудиоданные?

1 Ответ

0 голосов
/ 20 декабря 2018

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

Aбуфер вершин не будет хорошим способом передачи данных в этом случае, потому что AFAIK фрагментный шейдер не может читать из буфера вершин.

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

Если текстуры не имеют смысла для вас, потому что вы хотите использовать графический процессор для чего-то другого, кроме визуализации, тогдаВозможно, вы захотите использовать что-то вроде OpenCL или DirectCompute, которые предназначены для выполнения произвольных вычислений.

(кстати, HLSL не используется в этом примере, поскольку HLSL - это язык, используемый в Direct3D. Авториспользуя GLSL.)

...