Мерцание текстуры OpenGL в некоторых устройствах Android - PullRequest
3 голосов
/ 10 февраля 2012

Мы - команда разработчиков, работающих над программным обеспечением для визуализации ландшафта над виртуальным 3D-земным шаром.Проект ориентирован на мобильные устройства под управлением Android, в основном планшеты и мобильные телефоны.Мы проверили это на нескольких устройствах, и, хотя мобильные телефоны, кажется, отлично работают (мы не обнаружили проблем ни на одном из них), некоторые планшеты, похоже, испытывают проблемы при рисовании текстур на экране.

Для ясности я прилагаю видео, в котором показана проблема, поскольку ее немного сложно объяснить словами.В этом примере показана сфера, разделенная на 200 секторов, каждый из которых имеет свою текстуру.

Видео с проблемой текстуры

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

Мы проверили это на следующих устройствах:

  • Samsung Galaxy S SLC (нормально)
  • HTC Desire (нормально)
  • Nook Ebook Reader (хорошо)
  • Samsung Galaxy Tab 10.1 (не работает с перебавкой)
  • Sony Tablet S (не работает)
  • Samsung Galaxy Tab 7.0 (хорошо)

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

varying mediump vec2 TextureCoordOut;
uniform sampler2D Sampler;
....
gl_FragColor = texture2D (Sampler, TextureCoordOut);

Затем я публикую ключевые инструкции, которые выполняются в OpenGL, так как код избавлен от нескольких больших функций:

GLES20.glGenTextures(num, idTextures, 1);  //declare 200 textures
...
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, idTextures[texture]); //texture binding
...
GLES20.glVertexAttribPointer(Attributes.Position, size, GLES20.GL_FLOAT, false, stride, fb);
...
GLES20.glVertexAttribPointer(Attributes.TextureCoord, size, GLES20.GL_FLOAT, false, stride, fb);
...
GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, first, count);

Извините, что не могу предоставить более подробную информацию, но после нескольких недель отладки мы не имеем ни малейшего представления о том, что может быть причиной этого.Я обращаюсь к вам, надеясь на какие-либо выводы, так как сейчас мы полностью потеряны.Заранее спасибо.

1 Ответ

2 голосов
/ 19 февраля 2012

Думаю, я знаю, что вызывает у вас трудности. Единственные устройства, где это не работает, - это устройства Tegra 2. Недавно я начал работать с устройством Tegra 2 и заметил некоторые различия. По сравнению с другими устройствами, Nvidia, похоже, ввела определенные виды ошибок округления, когда некоторые вещи могут вести себя не так, как другие графические процессоры. Мне пришлось пойти на крайние меры и использовать обходные пути, чтобы все работало так, как я хочу, с моими сложными шейдерами.

И то, что я мог видеть в вашем видео, похоже на то, что у z-буфера может быть недостаточно разрешения, и это приводит к некоторому z-бою: http://en.wikipedia.org/wiki/Z-fighting. Я не уверен, потому что на самом деле я не уверен посмотрите из своего кода / описания, рисуете ли вы треугольники, которые очень близки друг к другу и могут вызвать такое поведение в z-буфере.

Но, возможно, вы можете попытаться немного увеличить или уменьшить вершины (x, y, z) и посмотреть, что происходит с мерцанием. Если он меняется, он, вероятно, как-то связан с этим, если нет, то у проблемы может быть другая причина, но тогда немного больше кода будет хорошо.

Было бы также интересно попытаться сузить ее, нарисовав не всю сферу, а всего один или два треугольника, где возникает проблема, и посмотреть, не произойдет ли она еще.

PS: длинное видео было бы лучше, короткие клипы сосут vimeo.

...