【发布时间】:2014-10-15 08:51:42
【问题描述】:
我用 SDL 窗口编写了一个 OpenGL 应用程序。在 Mac OSX 10.9 上运行 OpenGL 4.1 的核心配置文件。命令glClearColor 效果很好,我在屏幕上得到了正确的颜色。但是在我的渲染器中,每次执行命令glEnableVertexAttribArray 和glDrawArrays 时都会出现GL_INVALID_OPERATION 错误。
那是代码:
顶点着色器:
#version 410
in vec4 position;
void main(void)
{
gl_Position = position;
}
片段着色器:
#version 410
out vec4 out_Color;
void main(void)
{
out_Color = vec4(0.0, 1.0, 0.0, 1.0);
}
所有着色器都编译并链接到一个程序。没有链接错误!
用数据创建缓冲区:
static const float VertexBufferData[] = {
0.75f, 0.75f, 0.0f, 1.0f,
0.75f, -0.75f, 0.0f, 1.0f,
-0.75f, -0.75f, 0.0f, 1.0f,
};
glGenBuffers(1, &m_VertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexBufferData), VertexBufferData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
渲染:
glUseProgram(m_ShaderProgram);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
// glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, nullptr);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glUseProgram(0);
输出:
【问题讨论】:
-
据我所知,在核心配置文件中不允许在没有活动 VAO 的情况下进行绘图。尝试在 glBindBuffer 之前生成一个 vao 并绑定它。
-
好的。这就是问题所在。在我看来有点奇怪。为什么我需要 VAO……我觉得我必须再次阅读基础知识。 :-)
-
如果您没有显式创建和绑定 VAO,您将只使用默认 (0) VAO。核心配置文件中不再允许使用任何类型的默认对象。从规范中,在“已弃用和删除的功能”下:“默认顶点数组对象(名称为零)也已弃用。”