- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个在 Qt Widgets 应用程序中使用 OpenGL 的应用程序。在切换到 Linux 之前,我曾经在 macOS 上开发它,一切都运行良好。现在,当我调用 glBindVertexArray(mesh->getVao());
时,OpenGL 吐出 INVALID_OPERATION。
使用 AMD 的 CodeXL,我确定 mesh->getVao()
retuened 2
。我还用它来获取所有 OpenGL 调用的列表。检查它,它似乎生成了一个 ID 为 2 的 VAO,并且调用列表中没有 glDeleteVertexArrays
。我什至注释掉了删除顶点数组的代码。
OpenGL 文档指出 glBindVertexArray
可能失败的唯一原因是它没有被赋予零,或者没有生成 VAO。
是否有任何其他可能的原因导致 glBindVertexArray
可能吐出 INVALID_OPERATION,尽管 VAO 存在,以及为什么它可以在 macOS 上运行但不能在 Linux 上运行?
一些代码示例,如果有帮助的话
网格渲染
void renderMesh(const Resource::ResourceMesh *mesh) {
//Set up textures
for (unsigned int i = 0; i < mesh->getTextures().size(); i++) {
glActiveTexture(GL_TEXTURE0 + i);
mesh->getTextures().at(i)->getTexture()->bind();
}
static const int texIDs[32] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
glUniform1iv(shaderTexID, MAX_SHADER_TEXTURES, texIDs);
//Draw the mesh
glBindVertexArray(mesh->getVao());
qDebug() << "mesh == nullptr:" << (mesh == nullptr);
glDrawElements(GL_TRIANGLES, mesh->getIndices().size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
VAO生成
//In ResourceMesh.hpp
protected:
QVector<Model::Vertex> vertices;
QVector<unsigned int> indices;
QVector<Resource::ResourceTexture*> textures;
GLuint vao;
GLuint vbo;
GLuint ebo;
//In ResourceMesh.cpp
void ResourceMesh::generateGlBuffers() {
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Model::Vertex), &vertices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
//Vertex positions
glEnableVertexAttribArray(GLManager::VertexAttribs::VERTEX_POSITION);
glVertexAttribPointer(GLManager::VertexAttribs::VERTEX_POSITION, 3, GL_FLOAT, GL_FALSE, sizeof(Model::Vertex), (void*) offsetof(Model::Vertex, position));
//Vertex normals
glEnableVertexAttribArray(GLManager::VertexAttribs::VERTEX_NORMAL);
glVertexAttribPointer(GLManager::VertexAttribs::VERTEX_NORMAL, 3, GL_FLOAT, GL_FALSE, sizeof(Model::Vertex), (void*) offsetof(Model::Vertex, normal));
//Vertex texture coordinates
glEnableVertexAttribArray(GLManager::VertexAttribs::VERTEX_TEX_COORD);
glVertexAttribPointer(GLManager::VertexAttribs::VERTEX_TEX_COORD, 2, GL_FLOAT, GL_FALSE, sizeof(Model::Vertex), (void*) offsetof(Model::Vertex, texCoord));
glBindVertexArray(0);
}
如果有帮助,这里是 CodeXL 的屏幕截图,在 glBindVertexArray
处中断
最佳答案
已在评论中解决 - 结果发现 VAO 是在错误的上下文中创建的。我猜 Qt 的 macOS 实现为所有内容共享一个上下文,而在 Linux 上,它们是分开的。
关于c++ - VAO 在 macOS 上呈现良好,但在 Linux 上呈现 INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45061160/
我不明白,为什么 glResolveMultisampleFramebufferAPPLE 会生成错误 1282(0x0502,GL_INVALID_OPERATION)。 设置代码: glGenFr
问题: 紧接在“glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);”之后我收到了 GL 错误 #1282(INVALID_OPERATION)
假设我有 COpenGLControl class downloaded here from codeguru假设the first event handler runned when creatin
基本上我有 200 X 200 像素的 Canvas ,一个 20 X 20 X 20 像素的体素。所以我有 100 个体素。当我在 Canvas 上绘图时,我想查看绘制了哪个像素,如果该像素位于其中
我正在尝试在片段着色器中设置两个纹理,但如果我尝试使用以下命令设置相应的统一变量,则会收到此错误: gl.uniform1i(getUniformLocation(program, "uTexture
我学习 WebGL。 当我尝试绘制三个点时,当每个点都有自己的位置、大小和颜色时,我遇到了一些错误。我尝试通过相同的缓冲区来完成。 // To draw three points. Each of t
我学习 WebGL。 当我尝试绘制三个点时,当每个点都有自己的位置、大小和颜色时,我遇到了一些错误。我尝试通过相同的缓冲区来完成。 // To draw three points. Each of t
我正在将一个正常运行的 OpenGL 应用程序从 Windows 移植到 OSX,并在调用 glEnableVertexAttribArray() 后不断收到“无效操作”(代码 1282)错误。这是渲
我正在尝试为 NDK 掌握 OGLES2 并坚持使用 GLSL 着色器。情况类似于 the one already highlighted here ,但背后的原因似乎有些不同。 我有最简单的着色器。
我目前正在按照本指南将我的场景渲染为纹理以生成深度/阴影贴图:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-14-ren
我有一个在 Qt Widgets 应用程序中使用 OpenGL 的应用程序。在切换到 Linux 之前,我曾经在 macOS 上开发它,一切都运行良好。现在,当我调用 glBindVertexArra
我是一名优秀的程序员,十分优秀!