OpenGL链接器错误,使用未编译的着色器进行链接
OpenGL Linker error, linking with uncompiled shader
我试图创建一个OpenGL应用程序,它只是绘制一个三角形,但我遇到了Linker错误:使用未编译的着色器进行链接。从调用glLinkProgram:
#include <GL/glew.h>
#include <GL/glut.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <assert.h>
using namespace std;
GLuint VBO;
void draw();
void CreateVBO();
GLuint MakeShader(const string& shaderFile);
GLuint CreateProgram();
string GetCode(const string& path);
int main(int argc, char* argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutInitWindowSize(768, 512);
glutInitWindowPosition(0, 0);
glutCreateWindow("Test");
glutDisplayFunc(draw);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLenum var = glewInit();
if(var != GLEW_OK){
cerr << "Couldn't initialize glew" << endl;
return -1;
}
CreateVBO();
glutMainLoop();
return 0;
}
void draw(){
glClear(GL_COLOR_BUFFER_BIT);
static GLuint program = CreateProgram();
glUseProgram(program);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
GLuint CreateProgram(){
GLuint program = glCreateProgram();
vector<GLuint> shaders;
shaders.push_back(MakeShader("shade.frag"));
shaders.push_back(MakeShader("shader.vert"));
for(size_t i = 0; i!= shaders.size(); ++i){
glAttachShader(program, shaders[i]);
}
glLinkProgram(program);
GLint linked;
glGetProgramiv(program, GL_LINK_STATUS, &linked);
if(linked == GL_FALSE){
GLint infoLogLength;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &infoLogLength);
GLchar* strInfoLog = new GLchar[infoLogLength+1];
glGetProgramInfoLog(program, infoLogLength, NULL, strInfoLog);
printf("Linker failure: %s n", strInfoLog);
delete strInfoLog;
}
return program;
}
string GetCode(const string &path){
ifstream file(path);
string ret = "";
string line;
if(file.is_open()){
while(getline(file, line)){
ret += line + 'n';
}
}
return ret;
}
GLuint MakeShader(const string& shaderFile){
string extension = shaderFile.substr(shaderFile.length()-4, 4);
GLenum type;
string shaderType;
if(extension == "vert")
{
type = GL_VERTEX_SHADER;
shaderType = "Vertex";
}
else if(extension == "frag")
{
type = GL_FRAGMENT_SHADER;
shaderType = "Fragment";
}
const char* code = (GetCode(shaderFile)).c_str();
GLuint shader = glCreateShader(type);
glShaderSource(shader, 1, &code, NULL);
glCompileShader(shader);
GLint status;
glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
if(status != GLEW_OK){
GLint logSize;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &logSize);
GLchar* errorLog = new GLchar[logSize+1];
glGetShaderInfoLog(shader, logSize, NULL, errorLog);
printf("Compile failed in %s shader: %s n", shaderType.c_str(), errorLog);
delete errorLog;
}
return shader;
}
void CreateVBO(){
float Vertices[12]= {
0.0f, 0.0f, 0.0f, 1.0f,
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f
};
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
如果我的问题是noobish,我很抱歉,但我有点难以使用OpenGL
您错误地检查着色器编译是否成功。将GL_COMPILE_STATUS
与GLEW_OK
(为0,与OpenGL无关)进行比较,而应与GL_TRUE
(为1)进行比较。此外,除了向stdout报告失败之外,代码什么也不做(即,调用方无法知道它是失败还是成功)。
相关文章:
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 生成一个生成文件,该生成文件使用Automake在一个步骤中编译和链接所有源文件
- Red Hat:使用<atomic>编译很好,但链接器找不到__atomic_store_16;什么库?
- 在发布模式下启动使用库的静态链接编译的应用程序时出错
- 编译时出错 - 链接.cpp和头文件
- 仅为从某种语言编译的对象添加链接库?
- C++ 为什么在定义的编译和链接之前引用外部实例的程序
- Visual Studio 2017 ARM 交叉编译链接器崩溃
- 在调试配置中编译工作正常,但发布会给出链接错误
- 可视化工作室项目中C++预编译标头未正确链接
- std::to_chars在MacOS/clang上编译但不链接
- 使用共享库编译可执行文件时仅链接所需的符号
- 编译时出现Boost.python链接错误
- 微控制器的首次 gcc 链接器脚本编译但不运行
- CUDA 和C++链接/编译,程序在 cudaMalloc 上崩溃
- 链接/编译时间有关静态模板库
- 链接/编译使用 boost/filesystem.hpp 的程序
- 我们可以动态链接编译的静态库吗?
- 如何在我的项目中使用CMake链接编译的cmph库
- 在msvc++ 2010中,在调试配置中用静态链接编译DLL时,链接器错误