【发布时间】: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] 范围之外的任何内容都将被剪裁。在这种情况下,
w是 1.0。gl_Position的输出被称为剪辑空间是有原因的;)
标签: c++ opengl glsl opengl-3 glfw