编译和运行GLSL程序需要什么?

时间:2009-12-17 15:47:25

标签: windows opengl glsl

我正在尝试运行GLSL example,但我不能。

错误位于程序退出的行glGetShaderiv(vShader, GL_COMPILE_STATUS, &status);中。 vShader是文件vPhong.glsl

返回的错误是:

0(18) : error C0000: syntax error, unexpected $undefined at token "<undefined>"
0(18) : error C0501: type name expected at token "<undefined>"

我已'安装'并引用了GLEW和Glut及其lib文件。我glewInit'编了我的程序。

该程序能够找到.glsl文件。

奇怪的是,我能够运行precompiled GLSL-demo,并在我的电脑上编译并运行the project。非工作程序中的“初始化”与此相同。

我已经尝试将有缺陷的源复制到成功的项目中,以查看项目设置中是否存在导致错误的内容,但不幸的是,情况并非如此。 所以错误似乎是在C ++代码中,而不是项目。


进展:

在我的Windows 7机器上,通过Visual Studio运行时出现“访问冲突”。如果我“单独”运行它,该程序就停止了工作。在Windows XP机器上,我得到了一个未被捕获的例外。

编译程序时,我没有收到任何错误或警告(警告fopen不安全)。

Visual Studio将行vShader = glCreateShader(GL_VERTEX_SHADER);突出显示为错误的来源。

添加glewInit();修复了上述错误。

4 个答案:

答案 0 :(得分:3)

program中有两个错误:

首先:

glLinkProgram(program);
glGetShaderiv(program, GL_LINK_STATUS, &status);

最后一行应该是glGetProgramiv(program, GL_LINK_STATUS, &status);

此外,着色器文件中读取的fopen应该与rb一起用作参数,而不仅仅是r

glGetShaderiv替换为glGetProgramiv并添加glewInit()修复了我的一个初始错误。

将参数更改为fopen修复了着色器错误。

答案 1 :(得分:1)

这些错误来自GLSL编译器,而不是C ++编译器。在某些着色器的第18行,你有一些混淆了GLSL编译器的东西;可能是随机垃圾或不可打印的角色。一种简单的方法是为着色器源指定太长的长度(或根本没有长度),并且在字符串末尾没有NUL终结符

答案 2 :(得分:0)

我不确定你是如何编译该代码的。它使用的是不在Windows SDK中直接提供的GL API。所有着色器API都属于该类别。

要在Windows上访问它们,通常需要使用wgl提供的扩展机制,或使用扩展包装。

[编辑添加]

所以...用glew init阻止!无法构建时,着色器编译提供构建日志(取自this tutorial):

GLint blen = 0; 
GLsizei slen = 0;

glGetShaderiv(ShaderObject, GL_INFO_LOG_LENGTH , &blen);       

if (blen > 1)
{
 GLchar* compiler_log = (GLchar*)malloc(blen);

 glGetInfoLogARB(ShaderObject, blen, &slen, compiler_log);
 cout << "compiler_log:\n", compiler_log);
 free (compiler_log);
}

答案 3 :(得分:0)

该错误消息通常表示着色器程序文件本身存在某种错误。根据我的经验,它在文件的开头或结尾处就像一个意外的字符。尝试将该URL中的文本复制并粘贴到记事本或gedit中,然后保存文件。