Как увеличить / растянуть текстуру с помощью Matlab Psychtoolbox (OpenGL)? - PullRequest
2 голосов
/ 28 апреля 2009

Обновление: это кажется проблемой только на некоторых компьютерах. Кажется, что нормальный, интуитивно понятный код отлично работает на моем домашнем компьютере, но у компьютера на работе проблемы.

Домашний компьютер: (без проблем)

  • Windows XP Professional SP3
  • AMD Athlon 64 X2 3800+, двухъядерный 2,0 ГГц
  • NVIDIA GeForce 7800 GT
  • 2 ГБ ОЗУ

Рабочий компьютер: (этот вопрос относится к этому компьютеру)

  • Windows XP Professional SP3
  • Intel Pentium 4 2,8 ГГц (я думаю, двухъядерный)
  • Семейство наборов микросхем Intel 82945G Express
  • 1 ГБ ОЗУ

Исходное сообщение:

Я пытаюсь применить очень простую текстуру к части экрана, используя Psychtoolbox в Matlab со следующим кодом:

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. Я не знаю.

Спасибо за ваше время!

Ответы [ 2 ]

2 голосов
/ 28 апреля 2009

Хотя я не знаю много (читай: любого) Matlab, я знаю, что текстуры в openGL очень требовательны. Последнее, что я проверил, openGL требует, чтобы файлы текстур были квадратными и имели степень двойки (то есть 128 х 128, 256 х 256, 512 х 512).

Если это не так, предполагается, что openGL дополняет файл соответствующими белыми пикселями там, где они необходимы для выполнения этого условия, хотя это может быть броский удар в зависимости от того, на какой системе вы его используете.

Я предлагаю убедиться, что ваша текстура шахматной доски соответствует этим требованиям.

Кроме того, из вашего кода я не могу точно убедиться, но openGL ожидает, что вы сопоставите углы вашей текстуры с углами объекта, который вы собираетесь текстурировать.

Еще один совет, возможно, попробуйте линейный фильтр вместо ближайшего соседа. Это тяжелее в вычислительном отношении, но приводит к лучшему изображению. Это, вероятно, не будет иметь значения в конце концов.

Хотя эта справка не относится к Matlab, надеюсь, она полезна.

1 голос
/ 28 апреля 2009

Не зная много о Psychtoolbox, но много разбираясь с графикой и пользовательскими интерфейсами в MATLAB, первое, что я бы попробовал, - это поиграть с четвертым вводом Screen (источник «вход». Попробуйте сместить каждый угол на полпиксельные и целые пиксельные значения. Например, первое, что я бы попробовал, было бы:

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);

Мое обоснование этого совета: я иногда замечал, что изображения или элементы управления графическим интерфейсом на моих рисунках могут казаться отключенными на пиксель, и я могу только предположить, что это какая-то ошибка округления при их масштабировании или позиционировании.

Это лучший совет, который я могу дать. Надеюсь, это поможет!

...