если условия в вершинном шейдере приводят к ошибке «нет привязанного буфера к включенному атрибуту» в браузерах Android 10 - PullRequest
0 голосов
/ 24 апреля 2020

Я столкнулся со странной проблемой. Я использую WebGL для рендеринга карты в браузерах. Карта в порядке на любой платформе, но Android 10 браузеров.

На карте есть шейдер для рисования пунктирных линий. В браузерах Android 10 при рисовании пунктирных линий в консоли отображается ошибка «INVALID_OPERATION: drawElements: ни один буфер не связан с включенным атрибутом».

enter image description here

Я удалил два, если условия в вершинном шейдере и ошибки не отображаются (как показано ниже).

enter image description here

Но другое, если условия не вызвать ошибку.

Есть веб-приложение онлайн, которое использует эту карту сейчас (https://yongche.baidu.com). На платформе, отличной от Android 10, все отображается правильно. Но на Android 10 пунктирная линия или железные дороги на карте не будут отображаться из-за этой ошибки.

Есть идеи для решения этой проблемы?

1 Ответ

0 голосов
/ 24 апреля 2020

Мы можем только догадываться, но

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

Вы всегда должны искать местоположения атрибутов с помощью gl.getAttribLocation или назначать их перед связыванием с gl.bindAttribLocation.

Предположим, у вас есть шейдер, который объявляет

attribute vec4 position;
attribute float texcoord_y;
...

Расположение position и texcoord_y не определено. Если вы предполагаете, что position - это местоположение 1, а texcoord_y - это положение 0, все может сработать по счастливой случайности (поскольку это может отличаться на другом устройстве / драйвере / браузере), но когда texcoord_y оптимизирован и внезапно position - это местоположение 0 ваш код потерпит неудачу.

местоположения - оба значения имплантации c и для программы c. Таким образом, только то, что шейдерная пара A имеет position в местоположении 0 и texcoord_y в позиции 1, не означает, что они будут одинаковыми в шейдерной паре B.

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

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

gl.vertexAttribPointer(positionLocation, 3, gl.FLOAT, false, 0, 0);

, которая была скопирована и вставлена ​​в другое место, а positionLocation не была изменена на правильную переменную.

...