Могу ли я отключить предупреждение об отключении массива атрибутов вершин 0? - PullRequest
0 голосов
/ 05 мая 2020

При рисовании с gl.disableVertexAttribArray(0), Firefox (как и другие браузеры, они говорят) выдает это предупреждение:

Предупреждение WebGL: drawElementsInstanced: Рисование без включенного массива атрибутов вершин 0 заставляет браузер для выполнения дорогостоящей эмуляции при работе на настольных платформах OpenGL, например на Ma c. Желательно всегда рисовать с включенным массивом атрибутов вершин 0, используя bindAttribLocation для привязки какого-либо всегда используемого атрибута к местоположению 0.

Я знаю это. Я знаю, что считается хорошей практикой не отключать 0. Я знаю, что это везде написано.

Тем не менее, забавно, это именно то, что я хочу. В моем шейдере у меня есть 3D-атрибут и еще один 2D-атрибут для рисования 2D-маркера в координатах окна вокруг 3D-точки:

gl_Position = doSomething(aPosition) + vec4(aDelta, 0.0, 0.0);

А иногда мне просто нужна константа aDelta и aPosition варьируется, а иногда и наоборот. Я специально не хочу связывать одну и ту же программу дважды (для привязки атрибутов к разным местоположениям) или иметь два разных шейдера, так как остальная часть функциональности является общей и либо будет пустой тратой.

знает о снижении производительности, но просто работает таким образом. Имитация или нет, результат правильный и по спецификации c. Это простая функция, которая вычерчивает aws всего несколько вершин за раз. Любой другой способ был бы с моей стороны "дорогой эмуляцией". Могу я объяснить это Firefox, чтобы он не затопил мою консоль (одно только это предупреждение занимает половину всего обычного места!), И если я когда-нибудь распространю это, мои пользователи не подумают, что я неспособен игнорировать предупреждение?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Могу ли я отключить предупреждение об отключении массива атрибутов вершин 0?

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

Что вы можете сделать, это IF ваш шейдер всегда использует определенный атрибут, вы можете убедиться, что этот атрибут использует местоположение 0.

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

 gl.bindAttribLocation(someProgram, 0, 'position');
 gl.linkProgram(someProgram);

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


Я не уверен, какое здесь правильное решение. Я бы предпочел, чтобы предупреждения не отображались или, по крайней мере, они не появлялись, если только я не попрошу об этом, например, с какой-либо опцией в отладчике «дополнительные предупреждения WebGL». Я чувствую, что предупреждение в основном бесполезно. Конечно, приятно знать, что если я пытаюсь добиться максимальной производительности, мне не следует этого делать, но, как и тысячи других программных оптимизаций, мне часто все равно. Вы можете отправить сообщение об ошибке / проблеме / запрос функции в браузеры, если вы отправите sh, чтобы go удалился.

0 голосов
/ 06 мая 2020

Вы можете просто установить для атрибута вершины постоянное значение, используя вместо него vertexAttrib[1234]fv. Таким образом, вы явно указываете желаемое поведение вместо того, чтобы полагаться на неявно предоставленное значение по умолчанию.

void vertexAttrib[1234]f(GLuint index, ...)
void vertexAttrib[1234]fv(GLuint index, ...) 

Sets the vertex attribute at the passed index to the given constant value.

Соответствующее спецификация раздел 5.14.10.

...