我写了这个小函数来初始化一段shader时间试图搞定GLSL.
void createShader(string code, GLuint type) {
GLint success;
GLuint errorLogSize = 1024;
vector<GLchar> errorLog(errorLogSize);
cout << "trying to add shader, shader version is " << glGetString(GL_SHADING_LANGUAGE_VERSION) << " and opengl version is " << glGetString(GL_VERSION) << endl;
GLuint program = glCreateProgram();
GLuint obj = glCreateShader(type);
if (obj == 0) {
cout << "failed to create shader" << endl;
return;
} else {
cout << "created shader" << endl;
}
const GLchar* p = code.c_str();
GLint length = strlen(code.c_str());
cout << "trying to compile shader:" << endl << p << endl << "length: " << length << endl;
glShaderSource(obj, 1, &p, &length);
glCompileShader(obj);
glGetShaderiv(obj, GL_COMPILE_STATUS, &success);
if (success == 0) {
glGetProgramInfoLog(program, errorLogSize, NULL, &errorLog[0]);
cout << "error in shader compiling" << endl;
for (auto c : errorLog) cout << c;
cout << endl;
glGetShaderInfoLog(program, errorLogSize, NULL, &errorLog[0]);
for (auto c : errorLog) cout << c;
cout << endl;
}
glAttachShader(program, obj);
glLinkProgram(program);
glGetProgramiv(program, GL_LINK_STATUS, &success);
if (success == 0) {
glGetProgramInfoLog(program, errorLogSize, NULL, &errorLog[0]);
cout << "error in shader linking" << endl;
for (auto c : errorLog) cout << c;
cout << endl;
glGetShaderInfoLog(program, errorLogSize, NULL, &errorLog[0]);
for (auto c : errorLog) cout << c;
cout << endl;
}
glValidateProgram(program);
glGetProgramiv(program, GL_VALIDATE_STATUS, &success);
if (success == 0) {
glGetProgramInfoLog(program, errorLogSize, NULL, &errorLog[0]);
cout << "error in shader validating" << endl;
for (auto c : errorLog) cout << c;
cout << endl;
glGetShaderInfoLog(program, errorLogSize, NULL, &errorLog[0]);
for (auto c : errorLog) cout << c;
cout << endl;
}
glUseProgram(program);
}
Run Code Online (Sandbox Code Playgroud)
我称之为:
createShader("#version 150 out vec4 colorOut; void main() { colorOut = vec4(1.0, 0.0, 0.0, 1.0); }", GL_FRAGMENT_SHADER);
Run Code Online (Sandbox Code Playgroud)
当我运行程序时,它输出:
trying to add shader, shader version is 4.30 and opengl version is 4.4.12874 Compatibility Profile Context 14.100.0.0
created shader
trying to compile shader:
#version 150 out vec4 colorOut; void main() { colorOut = vec4(1.0, 0.0, 0.0, 1.0); }
length: 84
error in shader compiling
error in shader linking
Fragment shader(s) were not successfully compiled before glLinkProgram() was called. Link failed.
Fragment shader(s) were not successfully compiled before glLinkProgram() was called. Link failed.
error in shader validating
Fragment shader(s) were not successfully compiled before glLinkProgram() was called. Link failed.
Fragment shader(s) were not successfully compiled before glLinkProgram() was called. Link failed.
Run Code Online (Sandbox Code Playgroud)
所以这几乎告诉我的是它无法编译.但我似乎无法找出原因.我尝试搜索类似的情况(编译错误但日志中没有任何内容),但找不到任何相关的东西.
我希望这段代码至少可以编译着色器.我以本指南为准则.我正在使用的代码几乎是从该指南中复制的1对1.唯一的区别是他们在两个不同的函数中实现了它,并且在尝试找出我的代码有什么问题时添加了一些额外的错误处理.
我正在使用freeglut初始化我的窗口,我包含,链接和初始化了glew.
你需要一个换行符(\n)#version 150.以a开头的所有内容都是#预处理程序指令,预处理程序逐行操作.
将其更改为此,它应该工作:
createShader("#version 150\n out vec4 colorOut; void main() { colorOut = vec4(1.0, 0.0, 0.0, 1.0); }", GL_FRAGMENT_SHADER);
Run Code Online (Sandbox Code Playgroud)
如果在获取着色器信息日志的代码中没有出现小错误,您可能会看到来自着色器编译器的或多或少有意义的错误消息:
glGetShaderInfoLog(program, errorLogSize, NULL, &errorLog[0]);
Run Code Online (Sandbox Code Playgroud)
第一个参数glGetShaderInfoLog()是着色器,而不是程序.使用提供的代码中的变量命名,这应该是:
glGetShaderInfoLog(obj, errorLogSize, NULL, &errorLog[0]);
Run Code Online (Sandbox Code Playgroud)