OpenGL 着色器程序无法验证但未给出错误消息
OpenGL shader program fails to validate but gives no error message
我正在开发我的自定义游戏引擎,到目前为止一切正常。
直到我偶然发现一个奇怪的错误。
当我尝试验证我的着色器程序时 returns 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 class 中的 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.
如果您在代码中看到任何错误(例如 "shader" 作为变量名),那是因为我必须编辑原始代码以使其全部适合 1 个代码块。
glValidateProgram 应该放在 glLinkProgram
之后,glUseProgram
.
之前
引自here:
glValidateProgram checks to see whether the executables contained in
program can execute given the current OpenGL state
如果程序还没有链接,则无法执行。
我正在开发我的自定义游戏引擎,到目前为止一切正常。
直到我偶然发现一个奇怪的错误。
当我尝试验证我的着色器程序时 returns 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 class 中的 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.
如果您在代码中看到任何错误(例如 "shader" 作为变量名),那是因为我必须编辑原始代码以使其全部适合 1 个代码块。
glValidateProgram 应该放在 glLinkProgram
之后,glUseProgram
.
引自here:
glValidateProgram checks to see whether the executables contained in program can execute given the current OpenGL state
如果程序还没有链接,则无法执行。