2016-11-02 5 views
0

Screen('DrawTexture') 기능을 사용하여 화면에 동시에 표시해야하는 두 개의 이미지가 있습니다. 하나의 이미지는 장면 이미지이고 두 번째 이미지는 배경이 투명한 오브젝트입니다. 장면 이미지 위에 개체를 표시하고 싶습니다. 그러나이 작업을 시도하면 개체의 배경이 검은 색으로 보입니다.Psychtoolbox에서 투명한 배경으로 PNG 파일을 표시하려면 어떻게해야합니까?

개체 이미지에는 문제가 없습니다. [object,map,alpha] = imread(objectimage.png)으로 호출하면 알파 값은 알맞은 크기의 행렬을 반환합니다. 나는 또한이 이미지들을 파이썬을 사용하여 성공적으로 디스플레이했다. 그러나 다양한 연구의 이유로이 프로젝트는 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

관련 문제