2015-09-08 3 views
0

Я работаю над редактором на основе java/canvas для создания текстурированных фигур. Результаты позже отображаются в OpenGL, но мне нужно смоделировать интерполяцию цветовых пикселей из текстуры.

Предположим, у меня есть текстура с 10 текселем на 1 тексель. Я указываю диапазон от 0.0 до 1.0 для части холста. Поэтому я интерполирую координату текстуры каждого пикселя холста, нахожу два соседних текселя и интерполируем цвет.

Теперь я хочу нарисовать от tex 0.0 до 2.0 с повторяющейся текстурой. Расчет по модулю уже не является тривиальным anmyore, потому что 1.0, 2.0, ... необходимо сопоставить с 1.0, тогда как 1.x, 2.x, ... необходимо сопоставить с 0.x.

До сих пор я получил это, чтобы работать даже для отрицательных значений. Однако интерполяция «разрезается», когда происходит обертка. Диапазон между последним текселем (1.0) и повторным первым текселем (0.0) не соблюдается.

Как правильно имитировать это? Наверное, мне приходится иметь дело с смещением половины пикселей/текселя. Я хочу 0.0; 1.0 для рисования текстуры один раз, 0.0; 2.0 для рисования дважды и -1.0; 2.0 для рисования три раза (и т. Д.) С правильной интерполяцией, где текстура повторяется. Это должно быть возможно с помощью простых сдвиговых и модульных формул?

Может быть, какой-то «дешевый трюк», например, добавляет еще два текселя на внешние стороны для непрерывной интерполяции и делает некоторую магию смещения, чтобы исправить проблемы масштабирования?Моделирование обтекания текстуры OpenGL + интерполяция на холсте?

ответ

2

Ваша ошибка здесь в том, что координата текстуры (0.0) не попадает в центр первого текста. Он попадает в левый край первого текселя.

Таким образом, для реализации обертывания с линейной интерполяцией координата текстуры (0.0) приведет к чтению первого текста и последнего текста и утяжелению их как 0,5. Координата текстуры (1.0) затем попала бы на правый край последнего пикселя и затем привела бы к тому же цвету, что и tc (0.0).

enter image description here

+0

Спасибо. Я не хочу быть смартфоном, но на самом деле я знаю это. ;-) Моя проблема заключается в обработке индексирования и вычислении обернутых координат и т. Д. В основном существует интерполяция текстурных координат каждого пикселя холста и выполняется обработка текстурных координат, превышающих диапазон [0, 1]. Я, конечно, могу заставить его работать со многими условиями и т. Д. Но должен быть простой способ, который работает с математикой низкого уровня? –

+0

Если вы сделали это правильно, то упаковка должна быть простым вызовом 'frac()' и конверсией в пространство пикселей умножением на размер текстуры и вычитанием (0.5, 0.5). – dari

+0

Спасибо. Ты прав. Это должно быть так просто. Я понял, что у меня ошибка в моей концепции. Я не хочу работать в GLSL или на Canvas. Повторяемая цветовая гамма вдоль поверхности либо должна создавать жесткую грань между повторениями, либо требует дополнительного пространства между шкалами для интерполяции. Думаю, мне нужно интерполировать вручную. Ни текстурная упаковка, ни фильтрация не будут работать, если я использую только фракции текстуры. –