Войти
ПрограммированиеФорумГрафика

Искажение текстуры при использовании атласа OpenGL

#0
1:42, 23 фев. 2014

Доброго времени суток.
Использую текстурный атлас, для эмуляции репита юзаю такой шейдер:
Фрагментный:

        precision lowp float;

        uniform sampler2D u_texture;
        uniform float u_texpartx;
        uniform float u_texparty;
        uniform float u_texpartwidth;
        uniform float u_texpartheight;
        uniform float u_texwidth;
        uniform float u_texheight;
        varying vec2 v_texCoord;

        void main()
        {
            vec2 coord;
            coord.x = (u_texpartx + mod(v_texCoord.x, u_texpartwidth))/u_texwidth;
            coord.y = (u_texparty + mod(v_texCoord.y, u_texpartheight))/u_texheight;
            gl_FragColor = texture2D(u_texture, coord);
        }

Текстурный:

        uniform mat4 u_viewmatrix;
        uniform mat4 u_modelmatrix;

        attribute vec4 a_position;

        varying vec2 v_texCoord;

        void main()
        {
            mat4 matrix = u_viewmatrix * u_modelmatrix;
            gl_Position = matrix * a_position;

            v_texCoord = a_position.xy;
        }

И тайлю огромные участки. В итоге получаю искажение, которое увеличивается по мере возрастания координат вершины от 0,0.
На втором скриншоте видна граница перехода к более искаженному участку. Всё это в сумме еще совмещается с bleeding-гом, но это отдельная история :)
Что подскажете по этому поводу?

Изображение
Изображение
Изображение

#1
3:06, 23 фев. 2014

> Что подскажете по этому поводу?
Это традиционное непопадание текселя в пиксель. Триста раз переварено.
Если хочешь точного отображения картинки - обеспечь такую трансформацию геометрии, при которой один тексель будет занимать один экранный пиксель.
Масштабирование может быть только целым (фильтрация nearest), перемещения по экрану должны быть привязаны к сетке экранных пикселей.
Если есть произвольное масштабирование/повороты или субпиксельное перемещение - прими эти артефакты как должное, или обменяй их на другие артефакты при выключенной фильтрации текстур.

#2
3:25, 23 фев. 2014

RPGman, проблема с блидингом именно в этом и заключается, но главная проблема не в нём. Смена фильтраций не помогает.
Представленные скриншоты взяты из одной(!) сцены при одинаковом скейле, просто те, что ниже, взяты из участков, расположенных на большом расстоянии от 0,0.

#3
10:15, 23 фев. 2014

DummyUA
> Представленные скриншоты взяты из одной(!) сцены при одинаковом скейле
RPGman
> перемещения по экрану должны быть привязаны к сетке экранных пикселей.
Хочется добавить, а нечего )

#4
16:13, 23 фев. 2014

DummyUA
> взяты из участков, расположенных на большом расстоянии от 0,0
Тогда точность вычисления.  попробуй прибавить или вычислить 0.5пикселя.

#5
17:05, 23 фев. 2014

susageP, RPGman, CasDev, упс, пропустил. Тем не менее, как обеспечить эту привязку, если дело в ней?
Коррекцию в 0.5 пикселя пробовал, сам атлас 1024*1024, все текстуры в нём - тоже пот, с точностью в шейдерах играл.

#6
18:10, 23 фев. 2014

DummyUA
> Тем не менее, как обеспечить эту привязку, если дело в ней?
unproject'ни экранную сетку в мир для заданной глубины спрайта, узнаешь шаг и позицию сетки в мировых координатах.
Или используй ортографическую проекцию, задавая её в пикселях, а не в попугаях (-1,1), тогда достаточно будет все координаты округлять до целого.

#7
1:15, 24 фев. 2014

RPGman, так и есть:

Matrix.orthoM(ViewMatrix, 0, 0, Width, Height, 0, 1, -1);
Matrix.translateM(ViewMatrix, 0, posCentred.x, posCentred.y, 0);
posCentred округлен до целых. Шейдера без твика для рипита выполняются правильно.
#8
11:08, 24 фев. 2014

DummyUA
> Шейдера без твика для рипита выполняются правильно.
Тогда возможно дело в "precision lowp float;"
Точность повыше что-нибудь меняет?

#9
11:13, 24 фев. 2014

фейковый тайлинг не сделать так же как реальный из-за кучи вершин), почти всегда будут подобные артефакты, чтобы артефактов не было, пробуй считать координаты вершины по x так - первый квад - [0..w-1], второй [w..2w-1] и т.д. по y аналогично

#10
15:10, 24 фев. 2014

RPGman, пробовал highp, но, к сожалению, ничего не поменялось. Есть опасение, что графика на андроидах игнорирует установку точности флоата.

#11
18:22, 24 фев. 2014

У вас проблема не в точности, а в не соответствии координат

ПрограммированиеФорумГрафика

Тема в архиве.