OpenGL 着色器无法编译但没有给出错误信息
Posted
技术标签:
【中文标题】OpenGL 着色器无法编译但没有给出错误信息【英文标题】:OpenGL shader does not compile but gives no error message 【发布时间】:2020-12-10 17:34:05 【问题描述】:我正在尝试编写一个使用 OpenGl 加载和编译着色器的函数,但着色器拒绝编译,同时给我一个空(或随机)错误日志。
以下是我的最小示例:
vertexShader = glCreateShader( GL_VERTEX_SHADER );
std::string vertexSource = ShaderLoader::load("vertexShader.vert");
const char * vertexAdress = vertexSource.c_str();
glShaderSource( vertexShader, 1, &vertexAdress, NULL );
int shaderCompiled = GL_FALSE;
char errorLog[512];
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &shaderCompiled );
glGetShaderInfoLog(vertexShader, 512, nullptr, &errorLog[0]);
glDeleteShader(vertexShader);
输出shaderCompiled
给出0
和errorLog
给出一个空字符串或几个随机字符。
函数ShaderLoader::load
包含以下代码:
std::string ShaderLoader::load(std::string source)
std::string shader;
std::fstream readFile(source, std::ios::in);
if (readFile.is_open())
std::stringstream buffer;
buffer << readFile.rdbuf();
shader = buffer.str() + "\0";
else
throw std::runtime_error( "Couldn't load shader file: " + source);
return shader;
它似乎按预期工作。着色器源代码是
#version 330 core
layout (location = 0) in vec3 inVertex;
layout (location = 1) in vec3 inNormal;
out vec3 FragmentPosition;
out vec3 Normal;
uniform mat4 transform;
void main()
FragmentPosition = vec3(inVertex);
Normal = mat3(transpose(inverse(transform))) * inNormal;
gl_Position = transform * vec4( inVertex, 1 );
如何使用实际的错误消息填充errorLog
,或者更好的是让着色器进行编译。
【问题讨论】:
这是一个错字。您正在使用 2 个不同的变量vertexShader
和 shader
。
感谢您指出这一点!然而,不幸的是,它在更改变量名后做同样的事情。我已经更新了问题。
抱歉问题不可重现。代码工作正常。着色器代码正确,可以编译成功。
你检查glError
吗?因为shaderCompiled
只有在没有错误发生时才会被改变。您将其初始化为 false,因此在您检查它之前它可能根本没有被更改。正如 Rabbid76 已经说过的:着色器对我来说编译得很好。
我的其余代码中一定有一些奇怪的地方。不幸的是,glError
返回GL_NO_ERROR
,所以我还是一头雾水。不管怎样,非常感谢您的意见。
【参考方案1】:
首先仅在 shaderCompiled 为 false 时使用错误记录,这样您就不会得到随机字符串,
glGetShaderiv(VS, GL_COMPILE_STATUS, &shaderCompiled);
if (!shaderCompiled)
//error
GLchar InfoLog[256];
glGetShaderInfoLog(vertexShader, sizeof(InfoLog), NULL, InfoLog);
其次,您是否真的在链接和使用着色器,问题可能不在于编译:
// after compilation
GLuint shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glLinkProgram(shaderProgram);
glDetachShader(shaderProgram, vertexShader);
glDeleteShader(vertexShader);
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
【讨论】:
以上是关于OpenGL 着色器无法编译但没有给出错误信息的主要内容,如果未能解决你的问题,请参考以下文章