如何使用Matlab Psychtoolbox(OpenGL)放大/拉伸纹理?

问题描述 投票:2回答:2

更新:这似乎只是某些计算机的问题。正常,直观的代码似乎可以在我的家用电脑上正常工作,但是工作中的计算机有问题。

家用电脑:(没问题)

  • Windows XP Professional SP3
  • AMD Athlon 64 X2 3800+双核2.0 GHz
  • NVIDIA GeForce 7800 GT
  • 2 GB RAM

工作电脑:(这个问题适用于这台电脑)

  • Windows XP Professional SP3
  • 英特尔奔腾4 2.8 Ghz(双核,我认为)
  • 英特尔82945G高速芯片组家族
  • 1 GB RAM

原帖:

我正在尝试使用Matlab中的Psychtoolbox将一个非常简单的纹理应用到屏幕的一部分,其代码如下:

win = Screen('OpenWindow', 0, 127); % open window and obtain window pointer
tex = Screen('MakeTexture', win, [255 0;0 255]); % get texture pointer
% draw texture. Args: command, window pointer, texture pointer, source
% (i.e. the entire 2x2 matrix), destination (a 100x100 square), rotation
% (none) and filtering (nearest neighbour)
Screen('DrawTexture', win, tex, [0 0 2 2], [100 100 200 200], 0, 0);
Screen('Flip', win); % flip the buffer so the texture is drawn
KbWait; % wait for keystroke
Screen('Close', win); % close screen

现在我希望看到这个(四个大小相同的方块):

Expected result

但我得到了这个(右侧和底侧被切断,左上方是太大):

Actual result

显然,目标矩形比源矩形大很多,因此需要放大纹理。我希望这会像第一张图片那样对称地发生,这也是我需要的。为什么这不会发生,我该怎么办呢?

我也尝试使用[128 0 1152 1024]作为目标矩形(因为它是我屏幕中心的方块)。在这种情况下,所有边都是1024,这使得每个涉及的矩形的幂为2.这没有帮助。增加棋盘的尺寸会导致类似的情况,即右侧和最下侧未正确显示。

就像我说的,我使用Psychtoolbox,但我知道它使用OpenGL。我对OpenGL也不太了解,但也许有人可以在不知道Matlab的情况下提供帮助。我不知道。

谢谢你的时间!

opengl matlab psychtoolbox
2个回答
1
投票

虽然不知道很多关于Psychtoolbox的知识,但是在MATLAB中经常处理图形和用户界面,我要尝试的第一件事就是摆弄屏幕的第四个输入(“源”输入)。尝试将每个角移动半像素和整像素值。例如,我会尝试的第一件事是:

Screen('DrawTexture', win, tex, [0 0 2.5 2.5], [100 100 200 200], 0, 0);

如果那似乎没有做任何事情,我接下来会尝试:

Screen('DrawTexture', win, tex, [0 0 3 3], [100 100 200 200], 0, 0);

我对这个建议的推理:我注意到有时我的图形中的图像或GUI控件可能看起来像是一个像素,我只能推测它是缩放或定位时的某种舍入误差。

这是我能给出的最佳建议。希望能帮助到你!


2
投票

虽然我不太了解(阅读:任何)Matlab,但我知道纹理在openGL中非常挑剔。最后我检查过,openGL要求纹理文件为正方形,功率为2(即128 x 128,256 x 256,512 x 512)。

如果不是这样,openGL应该用适当的白色像素填充文件,以满足这种条件,尽管它可能是一个废话,具体取决于你运行它的系统。

我建议确保您的棋盘纹理符合这些要求。

此外,我无法确保您发布的代码,但openGL希望您将纹理的边角映射到您想要纹理的对象的角落。

另一点建议,也许尝试线性过滤器而不是最近邻居。它在计算上更重,但会产生更好的图像。这最终可能无关紧要。

虽然这个帮助不是Matlab特有的,但希望它有用。

© www.soinside.com 2019 - 2024. All rights reserved.