Психопия: плохой контраст в добавлении blendMode

Я использую blendMode="add" в психопии - к сожалению, GratingStim контраст работает хорошо только тогда, когда в окне не отображается текст. Как только текст нарисован - после GratingStim контраст выглядит так, как будто из него вычли 1 (посмотрите скриншоты). Я не испытываю этой проблемы с avg blendMode, но мне действительно нужно blendMode="add".

Вот как выглядит GratingStim до отрисовки текста:
 введите описание изображения здесь
Вот как это выглядит после рисования текста:
 введите здесь описание изображения

После рисования текста в окне любой последующий GratingStim имеет такой контраст. Помогает только открытие другого окна.
Я думаю, это можно решить, вставив шейдеры в пиглет, но я понятия не имею, как это сделать (связанная проблема на github).

В приведенном ниже коде воспроизводится эта проблема:

from psychopy import visual, event, core

win = visual.Window(monitor='testMonitor', useFBO=True,
    blendMode='add', units='deg')

g = visual.GratingStim(win, tex='sin', mask='gauss', size=4.5, pos=(0,6))
t = visual.TextStim(win=win, text='Hello blendMode="add"!')

draw_order = [[g], [g, t], [g, t]]
for draw_now in draw_order:
    for stim in draw_now:
        stim.draw()
    win.flip()
    event.waitKeys()

core.quit()

Я использую Windows - у меня эта проблема как в Windows 7, так и в 8.


person mmagnuski    schedule 24.08.2015    source источник
comment
+1 для воспроизводимого примера. То же самое происходит при замене TextStim на новый стимул TextBox, что было моим единственным предложением ...   -  person Michael MacAskill    schedule 24.08.2015


Ответы (2)


Хорошо, я догадываюсь, что средство визуализации текста pyglet выполняет некоторый код, который изменяет правило режима наложения, так что, когда текст рисуется, его левая часть находится в неправильном состоянии. На данный момент делаю

win.blendMode = 'add'

после рисования текстового стимула проблема для меня решает

person Jon    schedule 25.08.2015
comment
У меня такая же проблема, но это не решает ее. win.blendMode, похоже, не меняется, и установка 'add' после рисования текста не решает проблему. Мои стимуляторы выглядят нормально, если текст не был нарисован. Я использую версию психопии 1.80.01. У вас есть идеи, почему это может не работать? - person mwaskom; 29.06.2016
comment
FWIW Я разрабатываю код на ноутбуке со встроенной видеокартой Intel, что может быть виновником. - person mwaskom; 29.06.2016
comment
Или то, что 1.80.01 уже пару лет. С тех пор мы, возможно, исправили ошибки. Не могли бы вы сделать апгрейд и посмотреть? - person Jon; 30.06.2016
comment
Я только что исправил это в самом PsychoPy, эффективно сбрасывая blendMode каждый раз при рендеринге текста. Это не решает проблему с самим текстом pyglet (мы не можем визуализировать сам текст pyglet с помощью blendmode = 'add', потому что у нас нет контроля над pyglet lib), и я добавил предупреждение пользователям об этом проблема, но, по крайней мере, теперь это не повлияет на другие раздражители. - person Jon; 15.03.2017

Установите visual.Window(wynType='pygame') вместо значения по умолчанию winType='pyglet'. В вашем примере:

win = visual.Window(monitor='testMonitor', useFBO=True,
blendMode='add', units='deg', winType='pygame')

Почему это решает проблему, я не совсем уверен. Я пришел к этой догадке, просмотрев исходный код метода TextStim.draw, в котором целая куча вызовов GL выполняется для pyglet, но не для pygame.

person Jonas Lindeløv    schedule 24.08.2015
comment
Проблема в том, что я использую blendMode add, чтобы получить контраст ›1.0 без пометки значений rgb за пределами границ шумом, и для этого я полагаюсь на некоторые исправленные шейдеры обезьяны для пиглета (см. Проблему github, на которую я ссылаюсь в вопрос), поэтому я не уверен, будет ли то, что я пытаюсь сделать, работать с pygame. Завтра проверю, спасибо! - person mmagnuski; 25.08.2015
comment
Вы уверены, что blendMode остается «добавить» при отрисовке текста? В моем случае я получаю следующие предупреждения: 6.9603 WARNING Framebuffer object (FBO) not supported on this graphics card 6.9603 WARNING Framebuffer object (FBO) is required for blendMode='add'. Reverting to blendMode='avg' поэтому я не могу добавить blendMode с помощью pygame. У меня видеокарта nvidia GeForce GTX 650, так что ее должно хватить для FBO. - person mmagnuski; 25.08.2015
comment
Нет, я не уверен, что режим смешивания остается таким же для pygame, теперь, когда вы подняли эту проблему. Рад видеть, что Джон решил твою проблему! - person Jonas Lindeløv; 25.08.2015