[英]OpenGL shader linking error with no error message
I've been trying to figure this one out for a long time, but can't manage to get things to work. 很长时间以来,我一直在试图解决这个问题,但是却无法使事情正常进行。 I want simply to compile/run my OpenGL program, but my shaders does not link correctly and I get no helpful error message. 我只想编译/运行我的OpenGL程序,但是我的着色器无法正确链接,并且没有得到有用的错误消息。 In one case the error is purely empty, and in the other case it is ??y?
在一种情况下,该错误纯为空,而在另一种情况下,其为??y?
for some reason. 由于某些原因。
To create my program and compile my shaders, I have the following code: 要创建我的程序并编译我的着色器,我有以下代码:
GLuint buildProgram(const char* vertexShaderFile, const char* fragmentShaderFile)
{
std::string vs = fileContents(vertexShaderFile);
std::string fs = fileContents(fragmentShaderFile);
return createProgram(vs.c_str(), fs.c_str());
}
The shaders look like 着色器看起来像
#version 330
out vec4 out_color;
void main()
{
out_color = vec4(0.5, 0.5, 0.5, 0.5);
}
#version 330
in vec4 in_Position;
void main()
{
gl_Position = in_Position;
}
With 用
GLuint createProgram(const char* vertexSource, const char* fragmentSource)
{
GLuint vertexshader = createShader(vertexSource, GL_VERTEX_SHADER);
GLuint fragmentshader = createShader(fragmentSource, GL_FRAGMENT_SHADER);
GLuint program = glCreateProgram();
glAttachShader(program, vertexshader);
glAttachShader(program, fragmentshader);
glLinkProgram(program);
GLint ret;
checkShader(vertexshader, GL_LINK_STATUS, &ret, "unable to link vertex shader");
checkShader(fragmentshader, GL_LINK_STATUS, &ret, "unable to link fragment shader");
glUseProgram(program);
return program;
}
GLuint createShader(const char* source, GLenum shaderType)
{
GLuint shader = glCreateShader(shaderType);
glShaderSource(shader, 1, &source, NULL);
glCompileShader(shader);
GLint isCompiled = 0;
checkShader(shader, GL_COMPILE_STATUS, &isCompiled, "shader failed to compile");
if (isCompiled == GL_FALSE)
{
glDeleteShader(shader);
return 0;
}
return shader;
}
I try to generate error messages from the shaders by 我尝试通过以下方式从着色器生成错误消息
void checkShader(GLuint shader, GLuint type, GLint* ret, const char* onfail)
{
switch(type) {
case(GL_COMPILE_STATUS):
glGetShaderiv(shader, type, ret);
if(*ret == false) {
int infologLength = 0;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &infologLength);
GLchar buffer[infologLength];
GLsizei charsWritten = 0;
std::cout << onfail << std::endl;
glGetShaderInfoLog(shader, infologLength, &charsWritten, buffer);
std::cout << buffer << std::endl;
}
break;
case(GL_LINK_STATUS):
glGetProgramiv(shader, type, ret);
if(*ret == false) {
int infologLength = 0;
glGetProgramiv(shader, GL_INFO_LOG_LENGTH, &infologLength);
GLchar buffer[infologLength];
GLsizei charsWritten = 0;
std::cout << onfail << std::endl;
glGetProgramInfoLog(shader, infologLength, &charsWritten, buffer);
std::cout << buffer << std::endl;
}
break;
default:
break;
};
}
Running GLuint program = buildProgram("shaders/test.vert", "shaders/test.frag");
运行GLuint program = buildProgram("shaders/test.vert", "shaders/test.frag");
gives me the following output: 给我以下输出:
unable to link vertex shader 无法链接顶点着色器
unable to link fragment shader 无法链接片段着色器
??y? 是吗?
error build program error 502 : GL_INVALID_OPERATION 错误生成程序错误502:GL_INVALID_OPERATION
Does anyone have a guess why my shaders compile just fine but does not link? 有谁能猜出为什么我的着色器可以编译而不能链接?
You are calling getProgramiv(...,GL_LINK_STATUS,...)
on shader objects . 您正在着色器 对象上调用getProgramiv(...,GL_LINK_STATUS,...)
It doesn't make the slightest sense to even call that checkShader
function twice - once for each shader object - when you try to get information about the program (of which there is only one). 当您尝试获取有关程序的信息(其中只有一个)时,甚至两次调用该checkShader
函数(对于每个着色器对象一次)都没有丝毫意义。 And it also doesn't make sense to name the function that way, for the GL_LINK_STATUS
case. 对于GL_LINK_STATUS
情况,以这种方式命名该函数也没有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.