2009-12-17 27 views
2

我试图运行一个GLSL example,但我不能。编译和运行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和过剩和他们的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

你给的链接是坏的? – ufukgun 2009-12-17 15:53:57

+0

有关更多信息,在该点程序停止工作(我假设通过视觉工作室运行它也会告诉你异常的起源)也将有所帮助(当然链接是固定的...) – Grizzly 2009-12-17 16:09:39

+0

Link isn破坏了。 :)我已经提供了有关错误发生位置的更多信息。 – jumoel 2009-12-17 16:27:25

回答

2

program有两个错误:

第一:

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

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

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

glGetShaderiv代替glGetProgramiv并加入glewInit()修复了我最初的错误之一。

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

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); 
} 
+0

正如我写的:我正在使用GLEW。链接的源文件和我使用的唯一区别是我包含了而不是。 – jumoel 2009-12-17 17:44:50

+0

对不起。那么,glew可能隐藏了这个问题。你初步接近了吗? glCreateShader的价值是什么? – Bahbar 2009-12-17 17:53:37

+0

我忘了启动glew -_-。现在顶点着色器显然不能编译。 – jumoel 2009-12-17 18:25:16

0

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

1

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