Увеличить проблемы

Мое приложение представляет собой карту мира с некоторыми формами. Пользователь может перетаскивать карту и масштабировать ее для навигации.

Координация мировых границ minX = -180 minY = -90 maxX = 180 maxY = 90. Вершины моих фигур также находятся в этом диапазоне координат.

Я использую ортогональную проекцию для отображения мира на экране. Когда пользователь перетаскивает или масштабирует, я просто меняю матрицу с новыми видимыми границами карты.

Приложение работает хорошо, пользователь может масштабировать и перетаскивать карту. фигуры движутся соответственно.

Я использую lighgl как сторонний

Проблемы возникают, когда пользователь увеличивает выделение, затем вершины моих фигур начинают дрожать и в какой-то момент исчезают. Я почти уверен, что это проблема точности с плавающей запятой. потому что, когда мы увеличиваем видимую область, границы очень малы - например. minx: 30,0001 - maxX: 30,0002, поэтому y.

мои шейдеры - это базовые шейдеры, как показано ниже:

Вершинный шейдер

uniform mat4 gl_ModelViewProjectionMatrix;    
attribute vec4 gl_Vertex;
 
void main() {
   gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

Фрагментный шейдер

void main() {
  gl_FragColor = vec4(1.,0.,0.,1.);
}

Я ищу решение этой проблемы с помощью математики или WebGL ..

Попробуйте 1:

Пытался масштабировать все по факторам, но почему-то не вышло.

Например, вместо отображения minX: 30.001 он отобразит minx: 3000.1 - коэффициент 100 (и так далее для остальных значений границ). В моем шейдере я умножаю свой gl_Vertex на этот коэффициент. Но выглядит так же.


person Raziza O    schedule 11.01.2015    source источник


Ответы (1)


После многих попыток и изучения того, как работают биты с плавающей запятой, я понял, что когда мои значения с плавающей запятой находятся в диапазоне от -1 до 1, точность очень высока. около +/-1.e-45.

То, что я в основном делаю, это смещение моего сопоставления с исходной точкой - моя средняя точка будет (0,0). и так далее вершины поступают в шейдер.

Для Ex. если наша карта мира показывает область от 30.999999990 до 30.999999996 (по X и Y), то отображение этих значений будет в основном отображать круглые значения - от 40 до 40 из-за точности с плавающей запятой.

Чтобы решить эту проблему, мы смещаемся к исходной точке, как упоминалось ранее. это означает, что 30.999999993 - это середина значений сопоставления, я уменьшаю их по нему. Теперь сопоставление -0.000000003 с 0.000000003 - эти значения допустимы в формате float.

Наше целое число (если это подходящее слово) равно 0, поэтому теперь для дроби доступно больше битов.

В шейдере я также уменьшаю это среднее значение (30.999999993) из моих вершин ..

Надежда помогла кому-то с этим ответом.

Я использовал эту ссылку, чтобы помочь мне понять

person Raziza O    schedule 13.01.2015