У меня есть два изображения, которые нужно отображать одновременно на экране, используя функцию Screen('DrawTexture')
. Одно изображение - это изображение сцены, а второе - объект, в котором фон прозрачен. Я хочу отобразить объект поверх изображения сцены. Однако, когда я пытаюсь это сделать, у объекта появляется черный фон.Как сделать отображение PNG-файла в Psychtoolbox прозрачным фоном?
Нет проблем с изображением объекта; при вызове с [object,map,alpha] = imread(objectimage.png)
значение альфа возвращает матрицу соответствующего размера. Я также успешно отобразил эти изображения, один поверх другого, используя Python. Однако из-за различных причин исследования этот проект не может быть написан на Python.
Я пробовал искать решения, но единственные решения, которые я могу найти, относятся к цифрам или графикам, а не к Screen
. Я подозреваю, что мне нужно что-то сделать с альфа-смешиванием (возможно, что-то очень простое), но я не смог найти никаких полезных для новичков руководств.
Мой тестовый код в настоящее время выглядит следующим образом:
% screen setup
PsychDefaultSetup(2); Screen('Preference', 'SkipSyncTests', 1);
screenNum = max(Screen('Screens')); % set screen
Screen('Preference','VisualDebugLevel',3);
[w,rect] = Screen('OpenWindow',screenNum);
% Activate for alpha
Screen('BlendFunction', w, 'GL_SRC_ALPHA', 'GL_ONE_MINUS_SRC_ALPHA');
% image presentation rectangles
bigImSq = [0 0 500 500];
[bigIm, xOffsetsigB, yOffsetsigB] = CenterRect(bigImSq, rect);
smImSq = [0 0 250 250];
[smallIm, xOffsetsigS, yOffsetsigS] = CenterRect(smImSq, rect);
% IMAGES
sceneIm = 'scene.png';
objIm = 'object.png';
sceneLoad = imread(sceneIm);
[objLoad,map,alpha] = imread(objIm);
% final textures for display
scene = Screen('MakeTexture',w,sceneLoad);
object = Screen('MakeTexture',w,objLoad);
% Image presentation
grey = [100 100 100];
Screen('FillRect',w,grey);
Screen('Flip',w);
WaitSecs(0.5);
Screen('FillRect',w,grey);
Screen('DrawTexture', w, scene,[],bigIm); % draw the scene
Screen('DrawTexture', w, object,[],smallIm); % draw the object
Screen('Flip',w);
WaitSecs(3);
Screen('CloseAll');
Любые советы будут оценены!
Отлично! Спасибо за вашу помощь. – treismanwolfe