我正在尝试运行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();
修复了上述错误。
答案 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中,然后保存文件。