LINUX.ORG.RU

История изменений

Исправление 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; и всё. И никакой магии