GLSL链接器错误:未找到“void main()”的定义

时间:2014-05-11 03:35:39

标签: c++ opengl glsl opengl-3 glfw

我在尝试创建和链接GLSL程序时遇到了错误。每当我尝试链接程序时,都会遇到错误。

输出:

  

错误:" void main()"的定义找不到

顶点着色器:

#version 330 core

layout(location = 0) in vec3 vertex_modelspace;

void main()
{
gl_Position.xyz = vertex_modelspace;
gl_Position.w = 1.0;
}

片段着色器:

#version 330 core

out vec3 color;

void main()
{
    color = vec3(1, 0, 0);
}

着色器程序创建代码:

ifstream vertStream(vertPath);
ifstream fragStream(fragPath);
string line;

while (!getline(vertStream, line))
{
    vertexShaderSource.append(line).append("\n");
}
vertStream.close();

while (!getline(fragStream, line))
{
    fragmentShaderSource.append(line).append("\n");
}
fragStream.close();

vertexShaderSourcePointer = vertexShaderSource.c_str();
fragmentShaderSourcePointer = fragmentShaderSource.c_str();

vertexShaderLength = vertexShaderSource.length();
fragmentShaderLength = fragmentShaderSource.length();

vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShaderID, 1, &vertexShaderSourcePointer, &vertexShaderLength);
glCompileShader(vertexShaderID);
checkShader(vertexShaderID);

fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShaderID, 1, &fragmentShaderSourcePointer, &fragmentShaderLength);
glCompileShader(fragmentShaderID);
checkShader(fragmentShaderID);

programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
checkProgram(programID);

checkShader和checkProgram函数是使用glGetShaderiv和glGetProgramiv进行简单的错误检查,并将错误日志打印到stderr中。我已经检查了着色器和程序名称是否有效,它们是。我还检查了两个着色器的编译状态,并且编译没有问题。这段代码以前对我有用(使用不同的绑定),我不知道为什么它不起作用。

根据我的理解,这个错误信息是在着色器没有main()函数时显示的,但是我的。我很确定这是愚蠢的事情,但我整天都在盯着这一点无济于事。帮助

2 个答案:

答案 0 :(得分:1)

如果您将文件作为一个字符串提供,而每行的末尾没有\ n字符,则可能会出现此错误。

答案 1 :(得分:-1)

您可以检查着色器的文件路径。

将其更改为:

myshader.loadShaderCode("Resources/shaders/default.vs", "Resources/shaders/default.frag")

自:

myshader.loadShaderCode("Resources\shaders\default.vs", "Resources\shaders\default.frag")