着色器GLSL文件未编译

时间:2011-10-04 20:18:24

标签: opengl glsl shader

我正在使用OpenGL编写我的第一个程序,并且我已经到了我想要编译我非常简单的着色器程序的地步。我总是得到它无法编译着色器的错误。我使用以下代码编译着色器:

struct Shader
{
    const char*  filename;
    GLenum       type;
    GLchar*      source;
 };
...
static char* readShaderSource(const char* shaderFile)
{
    FILE* fp = fopen(shaderFile, "r");

    if ( fp == NULL ) { return NULL; }

    fseek(fp, 0L, SEEK_END);
    long size = ftell(fp);

    fseek(fp, 0L, SEEK_SET);
    char* buf = new char[size + 1];
    fread(buf, 1, size, fp);

    buf[size] = '\0';
    fclose(fp);

    return buf;
}
...
Shader s;
s.filename = "<name of shader file>";
s.type = GL_VERTEX_SHADER;
s.source = readShaderSource( s.filename );
GLuint shader = glCreateShader( s.type );
glShaderSource( shader, 1, (const GLchar**) &s.source, NULL );
glCompileShader( shader );

我的着色器文件源如下:

#version 150

in vec4 vPosition;

void main()
{
    gl_Position = vPosition;
}

我也尝试用“属性”替换“in”以及删除版本行。什么都没有编译。 注意:我的实际C程序编译并运行。在GPU上运行的着色器程序是无法编译的。

我还确保下载显卡的最新驱动程序。我有一台NVIDIA 8800 GTS 512;

关于如何获取我的着色器程序(用GLSL编写)进行编译的任何想法?

1 个答案:

答案 0 :(得分:0)

正如在评论中写的那样,编译着色器是否输出到控制台?令我惊讶的是,当我使用ATI时,我得到了着色器程序成功编译的消息,但是当我开始使用Nvidia时,我第一次盯着屏幕,因为没有输出......但着色器正在工作。那么也许你是成功编译而且不接​​受它?如果他们不在上下文中工作,你尝试使用着色器程序并没有任何反应,我认为你错过了着色器的链接(但它可能在代码中更进一步)。 Google对如何正确执行每一步都有一些很好的答案,您可以将代码与此example进行比较。我还创建了一个用于处理whit着色器的界面,你可以查看我的UniShader。 Project缺少英文文档,主要用于GPGPU,但你可以轻松加载任何着色器,代码本身是用英文命名的,所以应该很舒服。在该zip文件夹中查看UniShader文件夹中的源代码。也有一些例子,一个名为Ukazkovy的程序NA GPGPU也包含了来源,所以你可以看看如何使用这些类..祝你好运!