Обмін функціями на декілька шейдерів


10

Просте запитання:

Чи є у GLSL спосіб поділитись функціями на декілька шейдерів, чи я повинен визначати всі функції у кожному шейдері, який їм потрібен?

Відповіді:


12

Ви можете визначити деякі функції у файлі заголовка та #include їх у свій шейдер. Це трохи відрізняється від C / C ++ тим, що ви поміщаєте тіла своїх функцій у заголовки, а не лише їхні прототипи (оскільки у шейдерів немає поняття окремої компіляції та зв’язування), але крім того, що це так само, як C / C ++ заголовки.


2
Зверніть увагу, що #include насправді не підтримується в жодній версії GLSL до 3.30, за винятком розширення, яке не є загальнодоступним. Будь-яка гідна структура шейдера повинна поширювати мову, щоб забезпечити цю функцію (включаючи Cg).
Шон Міддлічч

7

Якщо #include недоступний, ви використовуєте аргументи glShaderSource для вказівки спільних матеріалів. Приклад:

char *sharedcode = "...shared code here...";
char *fs1 = "...fragment shader 1...";
char *fs2 = "...fragment shader 2...";

char *awesomeeffect1[] = {sharedcode, fs1};
char *awesomeeffect2[] = {sharedcode, fs2};

glShaderSource (shader1, 2, awesomeeffect1, NULL);
glShaderSource (shader2, 2, awesomeeffect2, NULL);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.