c++ - glDrawElements 成功但是 glDrawElementsInstance 失败并显示 GL_INVALID_OPERATION

标签 c++ opengl

我正在将桌面应用程序的 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

Additions to Chapter 5 of the OpenGL 2.1 Specification (Special Functions)

The error INVALID_OPERATION is generated if DrawArraysInstancedARB or DrawElementsInstancedARB is called during display list compilation.

当我追踪显示列表的创建并将其删除时,错误被删除。

关于c++ - glDrawElements 成功但是 glDrawElementsInstance 失败并显示 GL_INVALID_OPERATION,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50270671/

相关文章:

iphone - iPhone 上压缩顶点数组的最佳排序

java - OpenGL + 处理 : Rotate and move based on direction

.net - UI 和后台线程之间的交叉线程

c++ - 为什么装饰器模式的实现需要与核心类共同的抽象父类(super class)?

c++ - 在运行时改变对象的行为

c++ - Kdevelop 5 + kdev-control-flow-graph

opengl - 如何使用 OpenGL 在 Forth 中画一条线?

c++ - 我如何从主要功能到 QGLWidget 获得 'argc' 和 'argv'

c++ - 导入 3d 模型 - 我是否必须使用自定义顶点类型进行索引?

c++ - 如何将 BSTR 传递给 printf?