AndroidФорумПрограммирование

Движение текстуры

#0
0:22, 10 сен 2014

Здравствуйте!
Разбираюсь с openGL ES 2 и столкнулся с проблемой: у меня есть текстура, которую я использую как задний фон, "листаю" ее во фрагментном шейдере для того, чтобы задний фон был всегда в движении. Тестирую на телефоне, все отлично, картинка "движется" и повторяется, когда заканчивается. Если же запускаю на планшете, то все работает, но после нескольких повторений текстуры, ее качество сильно падает, она становится пиксельной и начинает подтормаживать, хотя на телефоне все норм. Не могли бы вы подсказать в чем мб проблема? Спасибо!

#1
4:13, 10 сен 2014

highp точность для текстурных координат выстави в шейдере

#2
7:32, 10 сен 2014

Чем больше float число, тем ниже точность. Твой планшет либо не поддерживает полную точность, либо она просто не указана в шейдере.
Значит надо либо указать highp точность, если она поддерживается, либо, двигая координаты на CPU, держать их небольшими (отсекать целую часть).

#3
7:57, 10 сен 2014

4ebureG
Покажи хоть текст шейдера. Как там текстура листается?

#4
9:17, 10 сен 2014

XProger, gammaker спасибо вам огромное!! Действительно проблема была в этом! Но почему из-за точности карёжит текстуру? Для меня это как-то очень нелогично..

#5
9:39, 10 сен 2014

4ebureG
Грубо говоря, чем больше целая часть числа, тем больше погрешность в дробной части. В итоге вместо выборки по значению 123123123.9 берётся 123123123.8

#6
9:53, 10 сен 2014

XProger,  это понятно, но почему текстура -то портится? Вроде бы openGL сам обрезает значения >1, то есть когда становится 1.1, грубо говоря, он это переводит в 0.1. Вот только он видимо интерпретирует так для себя это число,  а оно со временем и правда, из-за недостаточной точности начинает портится, но ведь в шейдере по этому числу указано простое смещение, поэтому что брать 0.9, что 0.8 на качество текстуры это не должно влиять?

#7
12:21, 10 сен 2014

4ebureG
Покажи где написано, что OpenGL что-либо обрезает?

#8
12:44, 10 сен 2014

http://andmonahov.blogspot.ru/2012/04/blog-post_455.html

Например, если координата S=1.4 то при текстурировании она автоматически отображается как 0.4. Таким образом, картинка будет повторяющейся.

Я, конечно, не уверен в правильности этой фразы, но даже если она неправильная, то все равно, как точность может влиять на качество текстуры. Ну допустим сместим мы не на 10000000000000.9, а на 10000000000000.8, один фиг, она сместится, каким боком здесь качество текстуры-то замешено, непонятно

#9
15:32, 10 сен 2014

4ebureG
> как точность может влиять на качество текстуры.
Ну вот, были 3 соседних пикселя с координатами 0.1, 0.2 и 0.3, все было хорошо.
Потом сместились и координаты стали 1000000.1, 1000000.2 и 1000000.3.
Это все округлилось до 1000000.2 и все 3 пикселя стали показывать один цвет, вместо 3-х разных.

#10
18:40, 10 сен 2014

4ebureG
> это понятно, но почему текстура -то портится? Вроде бы openGL сам обрезает
> значения >1, то есть когда становится 1.1, грубо говоря, он это переводит в
> 0.1.
Потеря точности происходит при передаче значения в шейдер. И только после этого, когда ты в шейдере читаешь из текстуры, происходит отбрасывание целой части. Точность mediump обычно даёт точность всего 3 значащей десятичной цифры (мантисса - 10 бит), а тебе именно столько и нужно, чтобы однозначно идентифицировать тексель текстуры 1024x1024. Если у тебя было число 9.724327, то при передаче в шейдер это значение усечётся до 9.72, а девятка не учитывается при чтении из текстуры. То есть выборка произойдёт по координатам 0.72. Но двух значащих цифр недостаточно, чтобы покрыть всё разрешение текстуры, если её размеры конечно не меньше 100.
Так что надо либо в программе (где точность намного выше) до передачи в шейдер выкидывать целую часть, либо повышать точность в шейдере. Но если координаты станут очень большими (100000 и выше), то этой точности всё равно не станет хватать и вернётся этот артефакт.

}:+()___ [Smile]
> Потом сместились и координаты стали 1000000.1, 1000000.2 и 1000000.3.
Что-то у тебя числа очень уж большие. Там погрешность будет не в десятых долях, а будет наверное даже доходить до тысяч. Мантисса числа с половинной точностью, которое обычно соответствует mediump, имеет всего 10 бит.

#11
19:09, 10 сен 2014

Спасибо вам, господа, я все понял :)

AndroidФорумПрограммирование

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