我附加了一个顶点和片段着色器到一个程序对象,然后尝试链接该程序。GL_LINK_STATUS
返回false。我查了信息日志,全是些乱七八糟的字符。我检查GL_INFO_LOG_LENGTH
,它是0。我如何调试这种情况?
//this is the end of my LoadBasicShaders function
glAttachShader(program, vertShader);
glAttachShader(program, fragShader);
glLinkProgram(program);
GLint status;
glGetProgramiv(program, GL_LINK_STATUS, &status);
if (status == GL_FALSE)
{
GLint logLength = 0;
glGetProgramiv(program, GL_INFO_LOG_LENGTH, &logLength);
std::vector<GLchar> log(logLength + 1);
glGetProgramInfoLog(program, logLength, &logLength, &log[0]);
fprintf(stderr, "%s\n\n", log);
//logLength returns 0, log returns seemingly random chars
return -3;//just my error code
}
我的着色器是最简单的,因为我刚刚开始。下面是顶点着色器:
#version 330
layout(location = 0) in vec4 position;
void main()
{
gl_Position = position;
}
这是片段着色器:
#version 330
out vec4 outputColor;
void main()
{
outputColor = vec4(1.0, 1.0, 1.0, 1.0);
}
我使用GLFW创建OpenGL窗口,GLEW加载函数:
if (!glfwInit())
{/*error checking*/}
window = glfwCreateWindow(800, 600, "Swash", NULL, NULL);
if (!window)
{/*more error checking*/}
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwSetKeyCallback(window, key_callback);
if (glewInit() != GLEW_OK)
{/*you guessed it*/}
//don't call anything that involves nonstandard OpenGL functions before this point
GLuint shaderProgram;
int shaderLoadResult = LoadBasicShaders(shaderProgram, "../res/vert.shader", "../res/frag.shader");
2条答案
按热度按时间u4dcyp6a1#
ARB_debug_output
orKHR_debug
glfwWindowHint()
请求明确的GL版本和配置文件(核心/兼容性)所有这些(这就是我发布MCVE的意思):
如果你的OpenGL实现和/或着色器有任何问题,程序应该对
stderr
尖叫血腥谋杀并退出。fnvucqvd2#
很抱歉更新得很慢,我一直在忙碌其他的事情。
无论如何,问题是在编写代码时,我包含了
但在整理的时候我不小心把它删了这就是为什么着色器在编译,但没有链接,它们没有链接到程序对象。