При помощи модуля gpu в Blender Python API можно рисовать изображения, дополняя ими интерфейс сцены или вьюпорта. Изображения можно выводить в системе координат сцены для интуитивного взаимодействия в мешами или в системе координат вьюпорта для создания новых элементов интерфейса.
Рассмотрим простейший пример вывода изображения на экран при помощи модуля gpu.
Для начала выведем изображение в координатном пространстве сцены.
Определим текстуру для вывода изображения:
1 2 3 |
import gpu texture = gpu.texture.from_image(bpy.data.images['suzanne.png']) |
Создадим шейдер для отрисовки этой текстуры:
1 |
shader = gpu.shader.from_builtin('2D_IMAGE') |
и батч для отрисовки шейдера:
1 2 3 4 5 6 7 8 9 10 |
from gpu_extras.batch import batch_for_shader batch = batch_for_shader( shader, 'TRI_FAN', { 'pos': ((0, 0), (2, 0), (2, 2), (0, 2)), 'texCoord': ((0, 0), (1, 0), (1, 1), (0, 1)), }, ) |
Здесь важно отметить, какие координаты указывать в параметре “pos”. В данном случае мы хотим вывести изображение в пространстве сцены, поэтому указываем координаты такими, как будто мы добавляем в сцену простую плоскость (Plane) и располагаем ее углы в точках (0,0), (2,0), (2,2), (0,2) в плоскости сцены XY.
Определим функцию для отрисовки шейдера.
1 2 3 4 |
def draw(): shader.bind() shader.uniform_sampler('image', texture) batch.draw(shader) |
И добавим ее в стек вызова для вывода шейдера в рабочую область 3D вьюпорта:
1 |
bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_VIEW') |
Обратите внимание на значение четвертого параметра – “POST_VIEW”. Именно он определяет, что изображение выводится в пространстве координат сцены.
Если же нам нужно вывести изображение в пространстве координат вьюпорта, необходимо изменить значение этого параметра на “POST_PIXEL”.
1 |
bpy.types.SpaceView3D.draw_handler_add(draw, (), 'WINDOW', 'POST_PIXEL') |
Также нужно изменить значения координат в параметре “pos” при определении батча на значения в системе координат вьюпорта:
1 2 3 4 5 6 7 |
batch = batch_for_shader( shader, 'TRI_FAN', { 'pos': ((100, 100), (200, 100), (200, 200), (100, 200)), 'texCoord': ((0, 0), (1, 0), (1, 1), (0, 1)), }, ) |
Здесь мы указываем координаты в пикселях, отсчитываемые от левого нижнего угла рабочей области.
В остальном код остается без изменений.