2013-08-03 3 views
3

Вы не можете использовать неподдерживаемое расширение, драйвер вернет ошибку компиляции. Но можете ли вы проверить доступность какого-либо расширения непосредственно из кода GLSL? Есть что-то вроде этого?GLSL: проверьте, поддерживается ли расширение

#version XXX core 
#if supported(EXT_some_extension) 
#extension EXT_some_extension: enable 
#endif 

... 

UPDATE: Согласно Болас ответ Никол «s. Да, появилась в моей голове тоже, но по какой-то причине, он не работает

#version 150 core 
#extension ARB_explicit_attrib_location : enable 
#ifdef ARB_explicit_attrib_location 
#define useLayout layout(location = 2) 
#else 
#define useLayout //thats an empty space 
#endif 

in vec2 in_Position; 
useLayout in vec2 in_TextureCoord; 
... 

Макро «useLayout» всегда устанавливается в пустое пространство, но если бы я оставил только #enable директиву без условий он будет использовать его (мой драйвер поддерживает его). Похоже, что расширения не определены, это что-то еще (возможно?) (#if defined(ARB_explicit_attrib_location) тоже не работает)

+1

Nicol Bolas правильный. Вы просто забыли префикс «GL_» для расширения, который определяет ... – derhass

+0

Только что понял. Спасибо за помощь. – TomatoMato

ответ

14
#if supported(EXT_some_extension) 
#extension GL_EXT_some_extension: enable 
#endif 

Вы пытаетесь написать шейдер, который условно использует определенное расширение. Правильный способ сделать то, что вы пытаетесь сделать это:

#extension EXT_some_extension: enable 

#ifdef GL_EXT_some_extension 
//Code that uses the extension. 
#endif //GL_EXT_some_extension 

Каждого OpenGL расширение, которое имеет функцию GLSL будет иметь определенную #define для него. И флаг enable будет выдавать предупреждение только в том случае, если расширение отсутствует. Если он не активен, то #ifdef не будет запускаться.

1

Варианты GLSL напрямую отображаются в версии OpenGL. До и inclusing OpenGL 3.2-отображение является

OpenGL Version GLSL Version 
      2.0 1.10 
      2.1 1.20 
      3.0 1.30 
      3.1 1.40 
      3.2 1.50 

Поскольку OpenGL-версия 3.3 OpenGL идентична поддерживаемой версии GLSL.

Аналогичным образом расширения GLSL относятся к расширениям OpenGL, указанным в строке расширения OpenGL.

С учетом этой информации вы можете загрузить подходящие шейдеры или даже добавить определения пропроцессора, которые поддерживают условную компиляцию.

Update: glShaderSource принимает массив строк, которые объединяются внутри. Это можно использовать для передачи строки с определениями препроцессора до фактического кода шейдера. Конечно, токен #version … все равно должен появиться раньше всего.

+2

Что номера версий связаны с проверкой расширений от «кода GLSL»? –

+0

@NicolBolas: Просто аналогия. Точно так же, как поддерживаемая GLSL может быть определена путем выполнения чего-то «вне» GLSL, доступность расширений GLSL зависит от наличия определенных расширений OpenGL, о которых сообщает строка расширений OpenGL. – datenwolf

Смежные вопросы