2013-04-12 2 views
3

На картах Nvidia, если вы хотите, чтобы плоскость клика была включена, gl_ClipVertex должен быть назначен в программе glsl. Но на картах Ati возникает проблема, если назначается gl_ClipVertex.Как распознать графическую карту Intel в программе GLSL?

Для совместимости Nvidia/ATI, мы пишем коды, как это:

// fix the clipping bug for both Nvidia and Ati 
#ifdef __GLSL_CG_DATA_TYPES 
    gl_ClipVertex = gl_ModelViewMatrix*gl_Vertex; 
#endif 

Вы можете проверить это link для получения дополнительной информации.

Возникла проблема. На графических картах Intel (например, HD Graphics 3000) необходимо назначить gl_GlipVertex. Если нет, плоскость клипа бесполезна. Но, как известно, __GLSL_CG_DATA_TYPES определяется только в системе Nvidia. Таким образом, строка gl_ClipVertex является skippd на Intel. Теперь кажется трудным написать совместимые программы glsl как на картах Nvidia/Ati/Intel.

Есть ли что-то вроде __GLSL_CG_DATA_TYPES, может распознавать графическую карту Intel в программе GLSL?

ответ

3

Я предполагаю, что вы говорите об обходном пути об ошибке. Ну, единственный реальный способ обойти это - #define__GLSL_CG_DATA_TYPES от за пределами шейдер (то есть: вставка строки в шейдер). Еще лучше создайте свой собственный #define, который вы вставляете в строку шейдера, после объявления #version.

Как вы вставляете строку в шейдер, зависит от вас. Вы можете сделать простой анализ GLSL, найти первую строку без комментария после директивы #version и сделать там вставку.

С внешней стороны шейдеров вам нужно будет использовать строки GL_RENDERER и GL_VENDOR, чтобы определить, следует ли предоставить #define или нет.

+0

Да, спасибо, Это доступное решение. Но было бы лучше, если бы GLSL определил, что Intel всегда устанавливает и никто другой не делает. То, что я говорю, является символом, определяемым компилятором или драйвером, а не самим собой. Вы знаете кого-либо? – wan

1

Как было предложено Nicol, вам придется обнаруживать оборудование вне шейдера и передавать определение. Вы можете передать дополнительные определения при компиляции шейдера:

const char *vertSrcs[2] = { "#define INTEL\n", vShaderSrc }; 
glShaderSource(vId, 2, vertSrcs, NULL); 

что-то подобное должно работать.

+1

* «что-то вроде этого должно работать». * * Это не должно быть вообще, так как '# version' должна быть первой (не пустой) строкой шейдера. Но хорошо, из использования устаревших функций в его примере он, вероятно, даже не знает о какой-либо версии и использует старый добрый 1.10. –

+0

@ChristianRau: Это не повод предложить плохой код. –

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