# displacement trick for exact pixelization
glTranslatef(0.375, 0.375, 0.0)
К сожалению, этого недостаточно, так как вам также нужно масштабировать текстуру. Для немасштабированной непереведенной матрицы текстур, чтобы обратиться к определенному пикселю i из текстуры с размером N , необходимо применить формулу
(2i + 1)/(2N)
Вы можете получить масштабирование и перевод из этого - или определить координаты текстуры напрямую.
РЕДАКТИРОВАТЬ из-за комментария.
Хорошо, допустим, ваша текстура имеет ширину 300 пикселей, и вы хотите адресовать в точности пиксели от 20 до 250, тогда координаты текстуры, которые нужно выбрать для матрицы идентичных текстур, будут
(2*20 + 1)/(2*300) = 41/600 = 0.0650
и
(2*250 + 1)/(2*300) = 501/600 = 0.8350
Но вы также можете применить преобразование через матрицу текстур. Вы хотите отобразить пиксели 0… 299 (для ширины 300 пикселей индекс идет от 0 до 300-1 = 299) к 0… 1. Итак, давайте вставим эти цифры:
(2*0 + 1)/(2*300) = 1/600 =~= 0.0017 = a
(2*299 + 1)/(2*300) = 599/600 =~= 0.9984 = b
b-a =~= 0.9967
Таким образом, вы должны уменьшить диапазон 0… 1 на 0,9967 и сместить его на 0,0017 по ширине. То же самое касается и высоты ← → t координат. Помните, что порядок преобразований имеет значение. Вы должны сначала масштабировать, а затем перевести при выполнении преобразования, поэтому при умножении матриц перевод умножается первым:
// for a texture 300 pixels wide
glTranslatef(0.0017, …, …);
glScale(0.9967, …, …);
Если вы хотите использовать пиксели вместо диапазона 0… 1, дополнительно разделите масштаб на ширину текстуры.
БОЛЬШОЙ ОДНАКО:
OpenGL-3 полностью отбросил все функции манипуляции с матрицами и ожидает, что вы предоставите его готовым к использованию матриц и шейдеров. А для фрагментных шейдеров OpenGL есть хорошая функция texelFetch
, которую вы можете использовать для непосредственного извлечения пикселей текстуры с абсолютными координатами. Использование этого сделает намного проще!