我正在开发自定义游戏引擎,到目前为止一切正常
直到我偶然发现了一个奇怪的错误
当我尝试验证我的着色器程序时,它返回GL_FALSE,以确保良好的调试我检查错误消息的日志信息当出现故障时,但是这个错误没有信息日志消息,我检查它是否正确读取文件并且有那里没有错误...所以我有点卡住了,我在互联网上看都没有任何成功,我希望这里有人可以帮我解决这个问题。
提前谢谢!
在main函数中,我创建了一个带有2个着色器文件的新着色器程序,一个顶点着色器和一个片段着色器,两者都编译没有任何错误。
GLuint shaderProgram = glCreateProgram();
std::string vertexFile = FileUtils::read_file("shaders/basic.vert");
std::string fragmentFile = FileUtils::read_file("shaders/basic.frag");
const char* vertexSource = vertexFile.c_str();
const char* fragmentSource = fragmentFile.c_str();
GLuint vertex = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertex, 1, &vertexSource, NULL);
glCompileShader(vertex);
GLint result;
glGetShaderiv(vertex, GL_COMPILE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetShaderiv(vertex, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(vertex, length, &length, &error[0]);
std::cerr << "Failed to compile the vertex shader!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteShader(vertex);
return -1;
}
glAttachShader(shaderProgram, vertex);
GLuint fragment = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(fragment, 1, &fragmentSource, NULL);
glCompileShader(fragment);
glGetShaderiv(fragment, GL_COMPILE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetShaderiv(fragment, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetShaderInfoLog(fragment , length, &length, &error[0]);
std::cerr << "Failed to compile the fragment shader!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteShader(fragment);
return -1;
}
glAttachShader(shaderProgram, fragment);
glValidateProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_VALIDATE_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
std::cerr << "Failed to validate the shader program!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteProgram(shaderProgram);
return -1;
}
glLinkProgram(shaderProgram);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &result);
if (result != GL_TRUE)
{
GLint length;
glGetProgramiv(shaderProgram, GL_INFO_LOG_LENGTH, &length);
std::vector<char> error(length);
glGetProgramInfoLog(shaderProgram, length, &length, &error[0]);
std::cerr << "Failed to link the shader program!" << std::endl;
std::cerr << &error[0] << std::endl;
glDeleteProgram(shaderProgram);
return -1;
}
glUseProgram(shaderProgram);
这是我的FileUtils类的read_file函数:
std::string FileUtils::read_file(const char* filepath)
{
FILE* file = fopen(filepath, "rt");
fseek(file, 0, SEEK_END);
unsigned long length = ftell(file);
char data[length + 1];
memset(data, 0, length + 1);
fseek(file, 0, SEEK_SET);
fread(data, 1, length, file);
fclose(file);
std::string result(data);
return result;
}
我知道它正确加载文件,因为我将它们打印到控制台以确保路径和文件是正确的,没有错误!
P.S。
如果您在代码中看到任何错误(例如“着色器”作为变量名称),那是因为我必须编辑原始代码以使其完全适合1个代码块。
答案 0 :(得分:1)
glValidateProgram应放在glLinkProgram
之后,但应放在glUseProgram
之前。
来自here的引用:
glValidateProgram检查是否包含可执行文件 程序可以在当前的OpenGL状态下执行
如果程序尚未链接,则无法执行。