因此,我正在尝试为学校构建一个简单的螺旋形发生器,并且在eclipse CDT for windows 7中一切都很顺利。我的程序为每个生成的螺旋计分配一个默认着色器(最多5个)。还有3个其他着色器程序,用户可以选择分配给任何肺活量计。在eclipse中它的工作原理应该如此,但是当在eclipse之外运行时,着色器无法链接。该程序使用GLUT和GLEW,我已在可执行文件的目录中包含必要的.dll。我一直在努力解决这个问题4个小时,并且不知道是什么原因会导致在日食之外连接失败并且不会一直失败。
我不打算包含所有着色器,但这里是前2个无法链接并导致应用程序终止
#version 330
layout (location = 0) in vec4 vPosition;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
out vec4 color;
void main()
{
gl_Position = proj * view * model * vPosition;
color = vec4(
(4 - vPosition.z) * (4 - vPosition.z) / 16.0,
(2.0 - abs( 2.0 - vPosition.z )) / 2.0,
vPosition.z * vPosition.z / 16.0,
1.0
);
}
和片段着色器
#version 330
in vec4 color;
void main()
{
gl_FragColor = color;
}
和printlog
Vertex shader was successfully compiled to run on hardware.
Fragment shader was successfully compiled to run on hardware.
Fragment shader(s) failed to link, vertex shader(s) failed to link.
ERROR: error(#280) Not all shaders have valid object code
ERROR: error(#280) Not all shaders have valid object code
我用来编译和链接着色器的InitShader()
函数适用于我过去所做的应用程序。我唯一不同的是我使用它来生成一些不同的着色器程序并将它们分配给programs[]
,而不是仅仅编译1并为整个应用程序运行它。
program[0] = InitShader("shaders/vshader.glsl", "shaders/fshader.glsl");
program[1] = InitShader("shaders/vshader2.glsl", "shaders/fshader.glsl");
program[2] = InitShader("shaders/vshader3.glsl", "shaders/fshader.glsl");
program[3] = InitShader("shaders/vshaderw.glsl", "shaders/fshader.glsl");
但不管怎样,这里是InitShader()
的代码。
GLuint InitShader(const char* source, GLenum type)
{
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, (const GLchar**) &source, NULL );
glCompileShader(shader);
printLog( shader );
return shader;
}
GLuint InitShader(const char* vfile, const char *ffile) {
GLuint program = glCreateProgram();
GLuint shader;
// stringify and attach vshader
std::ifstream vertstream(vfile);
std::string vert((std::istreambuf_iterator<char>(vertstream)), std::istreambuf_iterator<char>());
shader = InitShader(vert.c_str(), GL_VERTEX_SHADER);
glAttachShader( program, shader );
// stringify and attach fshader
std::ifstream fragstream(ffile);
std::string frag((std::istreambuf_iterator<char>(fragstream)), std::istreambuf_iterator<char>());
shader = InitShader(frag.c_str(), GL_FRAGMENT_SHADER);
glAttachShader( program, shader );
// link program
glLinkProgram(program);
printLog(program);
// link and error check
GLint linked;
glGetProgramiv( program, GL_LINK_STATUS, &linked );
if ( !linked ) {
fprintf(stderr, "Shaders failed to link!\n");
exit( EXIT_FAILURE );
}
// use program object
glUseProgram(program);
return program;
}
凌晨4点,所以我的灰色细胞大概用完了哈哈。并且fyi它不是真正的功课帮助,可执行文件不需要在eclipse之外运行,我只是想知道如何为自己创建独立程序。
答案 0 :(得分:3)
问题的原因在于:
program[0] = InitShader("shaders/vshader.glsl", "shaders/fshader.glsl");
着色器源文件的路径是 relative 。有可能Eclipse在不同的工作目录(可能是您的项目根目录)中运行您的程序,而不是直接执行程序时的工作目录。
解决方案:
或者,我的建议