Я наткнулся на базовую ошибку драйвера OpenGL и не уверен, где о ней сообщить.
Вот как драйвер идентифицирует себя и как мы создаем RC:
OpenGL vendor: X.Org
OpenGL renderer: AMD CARRIZO (DRM 3.26.0, 4.18.0-13-generic, LLVM 7.0.0)
OpenGL version: 4.4 (Compatibility Profile) Mesa 18.2.2
v - using GL version 2.0 (core)
В его списке расширений есть ARB_gpu_shader5, но нет EXT_gpu_shader4.
Этот шейдер не может быть скомпилирован
#version 120
#extension GL_EXT_gpu_shader4: enable
...
uniform usampler2D u_stencilTexture;
С этой ошибкой:
interaction VFWARNING:CompileShader(glprogs/interaction.fs): FAILED
0:2(12): warning: extension `GL_EXT_gpu_shader4' unsupported in fragment shader
0:27(20): error: syntax error, unexpected NEW_IDENTIFIER, expecting '{'
Итак, мой вопрос: как мне получить шейдер версии 120 с расширением usampler, чтобы он работал на графическом процессоре / драйвере с поддержкой Opengl-4.4?
Желательно кроссплатформенным, кросс-вендорным способом.
Обратите внимание, что один и тот же шейдер прекрасно компилируется на большом количестве устройств / драйверов как в Linux, так и в Windows.
Ваша проблема в том, что вы отмечаете # Версия 120, которая будет GLS 1.20 или OpenGL 2.0. В идеале вы должны использовать как минимум #version 400
. Это расширение технически разработано для GLSL 4.0.x и более поздних версий и OpenGL 4.0. Оно было необязательным в исправленных выпусках OpenGL 4.0 и ядра в 4.2. Чтобы обеспечить поддержку, вы должны использовать GLSL версии 4.20 (т.е. # версия 420 НЕ # версия 120). Он может работать в шейдерах 130+, совместимых с прямой совместимостью, но это не гарантируется, поскольку это зависит от реализации.
Что касается последних чипов и поддержки Mesa, вы можете увидеть обзор на http://www.mesamatrix.net
Как видите, все, кроме freedrino, очень старых чипов nVidia и очень старых Intel Chips поддерживает как минимум GLSL версии 4.20
. Я настоятельно рекомендую не рисковать и использовать #version 420 для ваших шейдеров, если вы не планируете делиться кодом со старыми Mac.