История изменений
Исправление LINUX-ORG-RU, (текущая версия) :
Опишу задачу точнее. Есть программа, которая рисует на RAM буфере
Ок, есть картинка например 512x512. Понял.
изменённая часть этого буфера должна загружаться в текстуру
Тоесть не весь буфер становится текстурой? А например есть буфер 512x512 CPU заполняет скажем 64x64 пикселя в каком то месте. И нужно именно это место взять и получить тоже текстуру 64x64 котрая ижу и пойдёт на отрисовку?
Или
Есть текстура 512x512 есть набор прямоугольных областей и нужно весь этот буфер сделать текстурой, но в шейдере забирать только те области что являются обновлёнными?
Ты можешь вычислить на основе этих прямоугольников текстырные координаты, всё что за ними рисоваться не будет. Ты можешь одновременно с буфером те места где ЦПУ нарисовал рисовать ещё в альфа канал и по его значению просто отбрасывать нам где альфа равна нулю например, а остальное рисовать.
Мне кажется тебе никаких DMA и прочих ммапов не надо. Тебе просто нужно подобрать для себя вариант, как удобнее. Покурить OpenGL и поиграться.
По сути ты просто берёшь картинку от ЦПУ отдаёшь её на ГПУ и всё. Единственное что тебе надо просто указать области на вьюпорте, где рисовать, а где нет, тут много вариантов. Просто надо пробовать. Опять же повторюсь ты ещё на этапе цпу в альфа канале картинки в этих твоих прямоугольниках можешь просто писать ТУТ НУЛИК ТУТ НИРИСУИМ, А ТУТ ИДИНИЧКО! ТУТ РИСУИМ! в шейдере ты просто делаешь if(my_tex.a < 1.f) discard;
и всё. И никакой магии
Неизменённая часть текстуры в GPU должна сохраняться.
Гпу вообще никак не изменит твою текстуру. Что её изменить она должна быть пришита к рендер буферу в который можно рисовать.
Исходная версия LINUX-ORG-RU, :
Опишу задачу точнее. Есть программа, которая рисует на RAM буфере
Ок, есть картинка например 512x512. Понял.
изменённая часть этого буфера должна загружаться в текстуру
Тоесть не весь буфер становится текстурой? А например есть буфер 512x512 CPU заполняет скажем 64x64 пикселя в каком то месте. И нужно именно это место взять и получить тоже текстуру 64x64 котрая ижу и пойдёт на отрисовку?
Или
Есть текстура 512x512 есть набор прямоугольных областей и нужно весь этот буфер сделать текстурой, но в шейдере забирать только те области что являются обновлёнными?
Ты можешь вычислить на основе этих прямоугольников текстырные координаты, всё что за ними рисоваться не будет. Ты можешь одновременно с буфером те места где ЦПУ нарисовал рисовать ещё в альфа канал и по его значению просто отбрасывать нам где альфа равна нулю например, а остальное рисовать.
Мне кажется тебе никаких DMA и прочих ммапов не надо. Тебе просто нужно подобрать для себя вариант, как удобнее. Покурить OpenGL и поиграться.
По сути ты просто берёшь картинку от ЦПУ отдаёшь её на ГПУ и всё. Единственное что тебе надо просто указать области на вьюпорте, где рисовать, а где нет, тут много вариантов. Просто надо пробовать. Опять же повторюсь ты ещё на этапе цпу в альфа канале картинки в этих твоих прямоугольниках можешь просто писать ТУТ НУЛИК ТУТ НИРИСУИМ, А ТУТ ИДИНИЧКО! ТУТ РИСУИМ! в шейдере ты просто делаешь if(my_tex.a < 1.f) discard;
и всё. И никакой магии