【问题标题】:GLSL Linker Error: Definition for "void main()" not foundGLSL 链接器错误:未找到“void main()”的定义
【发布时间】:2014-05-11 03:35:38
【问题描述】:

我在尝试创建和链接 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);
}

Shader程序创建代码:

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() 函数时会显示此错误消息,但我的有。我很确定这很愚蠢,但我整天盯着这个看无济于事。帮忙?

【问题讨论】:

  • 您是否查看了调试器中的值,并确保您的着色器源已正确读取?否则,我最好的猜测是你的一个或两个着色器没有成功读入。一个空的着色器可能编译没有错误,但当然没有main() 函数。
  • 您的机器是否可能不支持 GLSL 版本 330 内核?一些 GLSL 编译器非常糟糕,以至于如果版本无效,它们会吐出一些随机错误消息。
  • 我最近经常看到这个问题。它通常与逐行读取文件有关。您是否尝试过将整个文件作为二进制 blob 一次性读取?
  • @AndonM.Coleman 我一次读取了所有文件,并且不再出现链接器错误。话虽这么说,但是,我的着色器无法正常工作。出于某种原因,当我调用 glUseProgram 时,就好像该程序根本没有被使用。不过,这是一个单独的问题。感谢您的帮助!
  • 嗯,那是另一回事。您正在直接在顶点着色器中编写对象空间顶点... [-w,w] 范围之外的任何内容都将被剪裁。在这种情况下,w1.0gl_Position 的输出被称为剪辑空间是有原因的;)

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


【解决方案1】:

如果您将文件作为一个字符串输入,每行末尾没有 \n 字符,您可能会收到此错误。

【讨论】:

  • 即使这个答案被否决了,这也帮助我调试了我的问题。
【解决方案2】:

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

改成:

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

发件人:

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

【讨论】:

  • 所有主要操作系统都原生支持正斜杠作为路径分隔符。更糟糕的是,反斜杠在您的字符串文字中没有正确转义。
猜你喜欢
  • 2012-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多