WebGL отличается от препроцессора OpenGL в том же графическом стеке - PullRequest
2 голосов
/ 06 марта 2012

Я только что натолкнулся на интересный эффект от использования Chrome компилятора GLSL.Инструкция

#define addf(index) if(weights[i+index]>0.) r+=weights[i+index]*f##index(p);

не компилируется с указанием

preprocessor command must not be preceded by any other statement in that line

Кажется, что синтаксис ## не поддерживается.Однако на той же платформе (например, Linux 64bit, Nvidia GPU) тот же шейдер компилируется и работает нормально.Почему это?Я думал, что шейдерный компилятор является частью стека драйверов графических процессоров и будет использоваться в обоих случаях.Так почему этот другой опыт?

Ответы [ 3 ]

11 голосов
/ 06 марта 2012

На самом деле WebGL также указан как «OpenGL ES 2.0 для Интернета», поэтому есть некоторые отличия от OpenGL.

Спецификация WebGL (https://www.khronos.org/registry/webgl/specs/1.0/) говорит нам: «Реализация WebGLдолжны принимать только шейдеры, соответствующие OpenGL ES Shading Language, версия 1.00. "

Просмотр спецификации GLSL ES 1.0 (https://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf), которую я нашел:

Раздел 3.4 определяетпрепроцессор и также заявляет: «Нет никаких основанных на знаках чисел операторов (нет #, # @, ## и т. д.), а также нет оператора sizeof».

Так что, независимо от того, что реализация браузера делает внутренне, онаследует стандарту:)

1 голос
/ 17 июля 2012

Это потому, что в Windows Chrome по умолчанию не использует драйвер OpenGL. Он использует Direct3D, а перевод из OpenGL в Direct3D выполняется проектом ANGLE .

ANGLE имеет свой собственный шейдер-валидатор и препроцессор. И, следовательно, вы можете увидеть различия между Windows и другими операционными системами, даже если вы используете то же оборудование. ANGLE был создан, потому что в Windows поддержка Direct3D, как правило, намного лучше, чем поддержка OpenGL, и потому, что он обеспечивает больший контроль над реализацией и ее соответствием.

1 голос
/ 19 марта 2012

Реализации WebGL должны соответствовать спецификациям WebGL.Многие ограничения необходимы для обеспечения безопасности.Проблема ## не является, но в любом случае не корректной в спецификациях WebGL.

Для соответствия они могут использовать либо полностью соответствующий графический стек (например, предоставляя оболочку для расширенного профиля OpenGL ES, еслидрайвер демонстрирует их) или путем предварительной проверки кода шейдера GLSL и самого состояния WebGL, чтобы обеспечить соответствие перед передачей команд в какую-либо полную реализацию OpenGL.

Таким образом, поведение WebGL может отличаться от поведения OpenGL на той же машине.

...