2016-11-02 9 views
0

У меня есть два изображения, которые нужно отображать одновременно на экране, используя функцию 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'); 

Любые советы будут оценены!

ответ

1

Я думаю, все, что вам нужно сделать, это включить альфа-канал в ваше изображение во время MakeTexture.

% slightly modified boilerplate -- non-fullscreen by default, 
% and set the background color (no need for all the FillRects) 
PsychDefaultSetup(2); 
Screen('Preference', 'SkipSyncTests', 1); 
screenNum = max(Screen('Screens')); % set screen 
Screen('Preference', 'VisualDebugLevel', 3); 
[w, rect] = Screen('OpenWindow', screenNum, [100 100 100], [0 0 400 400]); 

Screen('BlendFunction', w, 'GL_SRC_ALPHA', 'GL_ONE_MINUS_SRC_ALPHA'); 

% image presentation rectangles 
smImSq = [0 0 250 250]; 
[smallIm, xOffsetsigS, yOffsetsigS] = CenterRect(smImSq, rect); 

Вот изображение с прозрачным фоном (для воспроизводимости).

% from http://pngimg.com/upload/cat_PNG100.png 
[img, ~, alpha] = imread('cat.png'); 
size(img) 
%% 2557 x 1993 x 3 (rgb) 

Мы сделаем одну текстуру без альфа-канала и одну с.

texture1 = Screen('MakeTexture', w, img); 
img(:, :, 4) = alpha; 
texture2 = Screen('MakeTexture', w, img); 

Во-первых, изображение без альфа-канала.

Screen('DrawTexture', w, texture1, [], smallIm); 
Screen('Flip', w); 

Затем текстура RGBA.

Screen('DrawTexture', w, texture2, [], smallIm); 
Screen('Flip', w); 
sca; 
+0

Отлично! Спасибо за вашу помощь. – treismanwolfe

 Смежные вопросы

  • Нет связанных вопросов^_^