Почему значение по умолчанию pointsize не соответствует стандартному значению в webgl?

#google-chrome #glsl #webgl

Вопрос:

Я работал над механизмом рендеринга с использованием Webgl и заметил несогласованное поведение с примитивом gl.POINTS. На моем mac в Chrome точки отображаются и видны, как и ожидалось, хотя и с очень небольшим значением по умолчанию. Когда я запускаю тот же код на своем ПК с Windows 10 в Chrome, по умолчанию ни одна из точек не отображается. Если я явно задам размер точки в шейдере вершин (например, «gl_PointSize = 1.0»), точки станут видимыми, что говорит о том, что в Windows они по умолчанию имеют чрезвычайно малое значение, меньшее, чем на моем mac.

Это раздражает — это приводит к неожиданному поведению в браузерах и требует, чтобы я выполнял вызов в своих вершинных шейдерах, который в противном случае был бы ненужным и который, по-видимому, увеличивает накладные расходы на выполнение.

Мой вопрос — это ожидаемое поведение, или я обнаружил ошибку в Chrome, и если это ожидается, почему это будет поведение по умолчанию, когда мы стремимся к стандартизации между браузерами и устройствами? Спасибо.

Ответ №1:

Согласно документации OpenGL ES:

Если gl_PointSize не записан, его значение не определено на последующих этапах конвейера

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

Я считаю, что определение этого значения 0.0 как неуказанного (то, что вы видите в Windows) можно рассматривать как хороший вариант, поскольку WebGL стремится избегать «неопределенного» в пользу «нулевого определения». Поведение Chrome на macOS в этом случае может ввести в заблуждение, хотя, очевидно, рисование точек с 1.0 размером можно считать более полезным для просмотра чего-либо на экране.

На практике существует некоторое несоответствие, связанное gl_PointSize с различными графическими API. Например, gl_PointSize в GLSL программа необязательна в реализации рабочего стола OpenGL, и размер точки, указанный по glPointSize() умолчанию, будет использоваться по умолчанию, который, в свою очередь, определяется как 1.0 в исходном состоянии OpenGL. В то же время OpenGL ES 2.0 (и, следовательно, WebGL) вообще не определяет glPointSize() метод и gl_PointSize становится обязательным в коде GLSL, чтобы избежать неопределенного поведения.

Поэтому я считаю, что различное поведение связано с различными графическими библиотеками (слоями), используемыми в macOS / Windows для реализации WebGL в Chrome. Но, как gl_PointSize и в любом случае, обязательно для рисования точек — нет смысла исследовать, какое неопределенное поведение лучше или правильнее.

Комментарии:

1. Спасибо за объяснение, я ценю это. Я не понимал, что glPointSize не был реализован в ES 2.0. Это объяснение, по-видимому, объясняет, почему это несоответствие не будет обрабатываться браузером. И все же мне это не нравится! 🙂