3

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

错误出现在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 文件。

奇怪的是我能够运行预编译的 GLSL-demo ,并且还可以在我的电脑上编译和运行该项目。非工作程序中的“初始化”与此相同。

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


进步:

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

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

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

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

4

4 回答 4

4

程序中有两个错误:

第一的:

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

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

此外,fopen在着色器文件中读取的 应该rb作为参数使用,而不是r.

替换glGetShaderivglGetProgramiv添加glewInit()修复了我最初的错误之一。

更改参数以fopen修复着色器错误。

于 2009-12-21T09:01:46.210 回答
1

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

于 2009-12-21T07:18:00.723 回答
0

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

要在windows上访问它们,一般需要使用wgl提供的扩展机制,或者使用扩展包装器。

[编辑添加]

所以... 用 glew init 挡道!着色器编译在构建失败时提供构建日志(取自本教程):

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);
}
于 2009-12-17T17:25:06.530 回答
0

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

于 2009-12-18T12:32:29.610 回答