Ну смотрите.
Там нет массивов.
Создаете окошко — это обязательно.
Инииализируете конвейер.
Создаете vertex buffer object с координатами вершин. Да, я знаю что вершин у вас нет — но иначе шейдер не запустить, он будет работать по разу на вершину. Вершины могут быть фейковые.
Создаете текстуры. Современные видеокарты поддерживают текстуры из float — проблем быть не должно. Но следует убедиться для той видюхи, на которой все запускается — иначе нужно использовать другой способ расчета.
Устанавливаем все это добро как render state. Запускаем созданный и скомпилированный шейдер.
Он берет значения из текстур и рисует нам картинку. Вернее, шейдеров нужно два: вершинный и пиксельный. Второй должен записать результат. Есть еще выкрутасы с записью промежуточных результатов из шейдера — но тут нужно смотреть, что умеет конкретная видюха.
Берем результат. Откуда — вопрос. Если поддерживаются pixel buffer object и render target — то из PBO. Иначе из буфера экрана (надеюсь, до этого дело не дойдет, видюха будет более или менее сносной).
Может, я еще что-то забыл.
Перечисленная схема — лишь краткое изложение. На самом деле кода получается — мама не горюй. На «простое перемножение массивов» это ни разу не похоже.