【问题标题】:Psychopy: bad contrast in blendMode addPsychopy:混合模式中的对比度差添加
【发布时间】:2015-08-24 13:57:59
【问题描述】:

我在psychopy 中使用blendMode="add" - 不幸的是GratingStim 对比度只有在窗口中没有绘制文本时才能正常工作。绘制文本后 - 跟随 GratingStims 对比看起来好像从它中减去 1(查看屏幕截图)。 avg blendMode 没有遇到这个问题,但我真的需要blendMode="add"

这是在绘制文本之前 GratingStim 的外观:

这是绘制一些文本后的样子:

在将文本绘制到窗口后,任何跟随的 GratingStim 都会像这样呈现对比度。只有打开另一个窗口才有帮助。
我想这可以通过将一些着色器注入 pyglet 来解决,但我不知道该怎么做(related issue on 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 上都有这个问题。

【问题讨论】:

  • +1 表示可重现的示例。同样的事情也会发生,用 TextStim 代替新的 TextBox 刺激,这是我唯一的建议......

标签: python opengl pyglet psychopy


【解决方案1】:

好的,我的 猜测 是 pyglet 文本渲染器正在执行一些代码来更改混合模式规则,以便在绘制文本时其左侧处于错误状态。目前在做

win.blendMode = 'add'

在绘制文本刺激后解决了我的问题

【讨论】:

  • 我遇到了同样的问题,但这并不能解决我的问题。 win.blendMode 似乎没有改变,并且在绘制文本后将其强制为 'add' 不会恢复问题。如果没有绘制文本,我的 stims 看起来还不错。我正在使用精神病版本'1.80.01'。您对为什么它可能不起作用有任何想法吗?
  • FWIW 我正在使用英特尔集成显卡的笔记本电脑上开发代码,这可能是罪魁祸首。
  • 或者 1.80.01 已经有几年的历史了。从那时起,我们可能已经修复了错误。可以升级一下看看吗?
  • 我刚刚在 PsychoPy 中修复了这个问题,每次渲染文本时都会有效地重置 blendMode。这并不能解决 pyglet 文本本身的问题(我们无法使用 blendmode='add' 呈现 pyglet 文本本身,因为我们无法控制 pyglet 库)并且我已经向用户添加了一个警告问题,但至少现在不会影响其他刺激。
【解决方案2】:

设置visual.Window(wynType='pygame') 而不是默认的winType='pyglet'。在您的示例中:

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

为什么这能解决问题,我不完全确定。我通过查看TextStim.draw 方法的源代码得出了这个猜测,其中对 GL 的一大堆调用是为 pyglet 而不是为 pygame 执行的。

【讨论】:

  • 问题是我使用 blendMode add 来获得对比度 > 1.0 而不会用噪声标记越界 rgb 值,为此我依赖于一些猴子修补的着色器 pyglet (请参阅我在问题中链接的 github 问题),所以我不确定我正在尝试做的事情是否适用于 pygame。我明天去看看,谢谢!
  • 您确定在绘制文本时 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' 所以我无法使用 pygame 添加 blendMode。我的显卡是nvidia GeForce GTX 650,FBO应该够用了。
  • 不,我不确定 pygame 的 blendmode 是否保持不变,既然您提出了这个问题。很高兴看到 Jon 解决了您的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-03
  • 2020-12-27
  • 2021-08-16
  • 2020-01-06
相关资源
最近更新 更多