23

GLSL 有一个完整的 C 风格的预处理器。唯一不起作用的是#include。一个很棒的特性是,您可以使用#ifdef 注释掉函数,从而创建一个着色器,如果不使用某些特性,它可以被细化。

我的问题是:

有没有办法从 C 代码定义宏?

使用 openGL 界面似乎没有办法做到这一点。快速破解是在代码加载表单文件之前添加几行#define FOO。但这似乎有点倒退。

4

2 回答 2

25

您实际上不需要将其添加到您加载的代码中。这就是 glShaderSourceARB API 中有多个字符串的原因。

类似于以下内容的内容可以满足您的需求:

char *sources[2] = { "#define FOO\n", sourceFromFile };
glShaderSourceARB(shader, 2, sources, NULL);
于 2010-03-04T10:53:56.277 回答
7

这是我用来避免#version问题的方法。它是 Java,并没有针对 perfo 进行优化,但它可以完美运行:

// extract shader sourcecode from file
StringBuilder shaderSource = Tools.readTextRessource(shaderSrcFile.url);

// apply defined values
int versionIndex = shaderSource.indexOf("#version");
if(versionIndex == -1) err("missing #version xxx in shader "+shaderSrcFile.name());
int defineInsertPoint = shaderSource.indexOf("\n", versionIndex)+1;

for (int i = defined.size() - 1; i >= 0; --i)
    shaderSource.insert(defineInsertPoint, "#define " + defined.get(i) + "\n");
于 2013-10-23T12:21:12.690 回答