Шейдер я пишу под весьма гибкую и удачную на мой взгляд библиотеку nvFX. Но вот использование Subroutine в этой библиотеке не завершено, да и в целом как оказалось, данная возможность указателя на функцию весьма капризно работает на деле.

Ошибка компиляции происходит, когда я линкую шейдер как показано в примере OpenGLSimpleEffect_Subroutine библиотеки nvFX.

А именно объявление и реализация subroutine добавляется на уровне pass и отдельного шейдера (shader object)

FragmentProgram = { ObjectPS, DiffuseFromTexture };

FragmentProgram<«lighting»> = LightingModelSubRoutines;

В этом случае ничего не срабатывает, при этом если вытащить часть когда и подставить его перед функцией main, все благополучно запустится. Например:

//
// Subroutine Prototype
//
subroutine vec4 sampleTYPE();

//
//
//
subroutine(sampleTYPE)
vec4 sampleFunc1() {
return vec4(1.0);
}

//
// The array of subroutines
//
subroutine uniform sampleTYPE sample;

void main()
{
color = sample();
}

Объяснение приходит на ум только одно — причина в использовании ARB_separate_shader_objects. Т.е. если subroutine внутри одного шейдера, он срабатывает без проблем, а вот если nvFX собирает фрагментную программу из разных шейдеров, то вываливается ошибка компиляции.

GLSL Subroutine и ошибка компиляции C9999
Метки:        

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *