c++ - glDrawElements 成功但是 glDrawElementsInstance 失败并显示 GL_INVALID_OPERATION
问题描述
我正在将我们桌面应用程序的 3D 图形引擎从兼容性配置文件迁移到核心配置文件。由于有很多代码要覆盖,我在兼容性配置文件上一一更改渲染器,当所有的都转换后,我打算将配置文件切换到核心。
为此,我正在编写一个小型渲染测试,以确保我了解如何在兼容性配置文件之上使用 OpenGL 4.3 的高级功能。
我写了以下初始化代码:
glGenVertexArrays (1, &_vertexArrayObjectID);
glBindVertexArray (_vertexArrayObjectID);
glGenBuffers (1, &_vertexBufferObjectID);
glGenBuffers (1, &_indexBufferObjectID);
glGenBuffers (1, &_instanceBufferID);
glBindBuffer (GL_ARRAY_BUFFER, _vertexBufferObjectID);
glBufferData (GL_ARRAY_BUFFER, sizeof (Verts), Verts, GL_STATIC_DRAW);
glVertexAttribPointer ((GLuint) 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray (0);
glBindBuffer (GL_ARRAY_BUFFER, _instanceBufferID);
glBufferData (GL_ARRAY_BUFFER, sizeof (Centers), Centers, GL_STATIC_DRAW);
glVertexAttribPointer ((GLuint) 1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray (1);
glVertexAttribDivisor (1, 1);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, _indexBufferObjectID);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (Faces), Faces, GL_STATIC_DRAW);
// creates the shader objects and program and links it in the current VAO scope
generateShaderProgram ();
glBindVertexArray (0);
我的渲染功能是:
glBindVertexArray (_vertexArrayObjectID);
// Load the shader into the rendering pipeline
glUseProgram (_program);
// Render the scene:
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements (GL_LINE_LOOP, _indexCount, GL_UNSIGNED_INT, 0);
// Cleanup all the things we bound
glUseProgram (0);
glBindVertexArray (0);
此代码正常工作,没有任何错误。但是,当我将绘图线(不更改任何其他内容)更改为:
glDrawElementsInstanced (GL_LINE_LOOP, _indexCount, GL_UNSIGNED_INT, 0, 4);
在上述命令之后,我立即收到 GL_INVALID_OPERATION (1282) 错误。
我的着色器程序是:
// vertex shader
#version 400
in layout(location=0) vec3 Position;
in layout(location=1) vec3 Center;
out vec3 theColor;
void main () {
vec4 v = vec4(Position, 1.0);
vec4 offset = vec4(Center, 1.0);
mat4 transform = mat4(vec4(0.1,0.0,0.0,0.0),vec4(0.0,0.1,0.0,0.0),vec4(0.0,0.0,0.1,0.0),offset); "
gl_Position = transform * v;
theColor = Position;
}
//fragment shader
#version 400
in vec3 theColor;
out vec4 fragColor;
void main () {
fragColor = vec4(theColor, 1.0);
}
我是否错误地使用了实例渲染?
解决方案
问题已解决!
此代码在兼容模式下运行,因此可以通过扩展访问绘制实例。似乎在我的场景树(在我运行测试的顶部)中,通过显示列表支持缓存。似乎绘图元素与显示列表一起正常工作,但绘图实例却不能。
引用自:https ://www.khronos.org/registry/OpenGL/extensions/ARB/ARB_draw_instanced.txt
OpenGL 2.1 规范第 5 章的补充(特殊功能)
如果在显示列表编译期间调用 DrawArraysInstancedARB 或 DrawElementsInstancedARB,则会生成错误 INVALID_OPERATION。
当我追踪显示列表的创建并将其删除时,该错误已删除。
推荐阅读
- java - JVM 之外是否存在类似 JSP 的静态站点生成器?
- c++ - 我什么时候可以调用 OSAction::Cancel 处理程序?
- javascript - 使用 TypeScript 的 Blazor WebAssembly 存在运行时错误
- javascript - 检查数组中对象的属性是否包含在另一个对象数组中
- flutter - json数据flutter中搜索栏的实现
- python - 无法加载我刚刚创建的 JSON 文件(json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0))
- geopandas - 在 geopandas 的 LINESTRING Z 中访问 Z 坐标?
- postgresql - 模拟可空列的主键
- jquery - Validate and Post file using Jquery, PHP
- javascript - 将 2 个对象数组组合成 1 个对象数组(重构请求)