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

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

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

  • 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

Теперь я ожидаю увидеть это (четыре квадрата одинакового размера):

http://www.freeimagehosting.net/uploads/455375daac.png

Но вместо этого я получаю это (правая и нижняя стороны обрезаются, а верхний левый квадрат слишком велик):

http://www.freeimagehosting.net/uploads/df5c277c82.png

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

Я также попытался использовать [128 0 1152 1024] в качестве прямоугольника назначения (так как это квадрат в центре моего экрана). В этом случае все стороны равны 1024, что делает каждый участвующий прямоугольник степенью 2. Это не помогает. Увеличение размера шахматной доски приводит к аналогичной ситуации, когда правая и нижняя стороны отображаются неправильно.

Как я уже сказал, я использую Psychtoolbox, но я знаю, что он использует OpenGL под капотом. Я тоже мало знаю об OpenGL, но, возможно, кто-то, кто знает, может помочь, не зная Matlab. Я не знаю.

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

Хотя эта помощь не является специфичной для Matlab, надеюсь, она будет полезна.

Другие вопросы по тегам