跨多个着色器共享功能


10

简单的问题:

在GLSL中,有没有一种方法可以在多个着色器之间共享功能,或者我是否必须在每个需要它们的着色器中定义所有功能?

Answers:


12

您可以在头文件中定义一些函数,然后将其#include到着色器中。它与C / C ++有点不同,您将函数的主体放在标头中,而不仅仅是它们的原型(因为着色器没有单独的编译和链接的概念),除此之外,它就像C / C ++标头。


2
至少请注意,直到3.30之前的任何版本的GLSL都实际上不支持#include,除非通过非通用的扩展名。但是,任何体面的着色器框架都应扩展语言以提供此功能(包括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);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.