如何获得尽可能多的关于 OpenGL 上下文的信息

How to get as many information as possible about an OpenGL context

您好,感谢您花时间阅读本文!

我正在用 GTK2/3 + OpenGL 编写程序,我有两个版本的程序 运行:

一切看起来都很好,除了 (a) 中的渲染速度明显快于 (b) 中的渲染……我不知道为什么。 以下是用于创建 OpenGL 上下文的代码部分的一些示例:

为了理解为什么 (a) 比 (b) 快,我下载了 GtkGLext 库的源代码,阅读它们,发现命令与调用 X11 完全相同。 现在我的想法是 (b)

中的以下行
gtk_widget_set_double_buffered (drawing_area, FALSE);

正在搞乱渲染,然后我无能为力... 或者可能解释我注意到的行为的 OpenGL 上下文之间存在 is/are 差异,如果我朝这个方向跟进,我需要将两个上下文与尽可能多的细节进行比较......到目前为止我选择了什么似乎是获取一些信息最常用的方式:

OpenGL Version                  : 3.0 Mesa 12.0.3
OpenGL Vendor                   : nouveau
OpenGL Renderer                 : Gallium 0.4 on NVCF
OpenGL Shading Version          : 1.30

Color Bits (R,G,B,A)            : 8, 8, 8, 0
Depth Bits                      : 24
Stencil Bits                    : 0
Max. Lights Allowed             : 8
Max. Texture Size               : 16384
Max. Clipping Planes            : 8
Max. Modelview Matrix Stacks    : 32
Max. Projection Matrix Stacks   : 32
Max. Attribute Stacks           : 16
Max. Texture Stacks             : 10

Total number of OpenGL Extensions   : 227
Extensions list:
     N°1    :   GL_AMD_conservative_depth
     N°2    :   GL_AMD_draw_buffers_blend
 ...

但是两种上下文都返回完全相同的信息...

感谢您到达那里...现在我的问题是:

有没有办法输出尽可能多的关于 OpenGL 上下文的信息,如何?

我欢迎对我正在做的事情提出任何其他建议!

S.

PS:我正在为 GTK3 使用 GtkGLArea Widget,但如前所述here我还没有到那里。

[编辑] 一些 OpenGL 指令:

// OpenGL instructions to draw here !

glLoadIdentity (); 
glPushMatrix ();
// d is the depth ... calculated somewhere else
glTranslated (0.0, 0.0, -d); 
// Skipping the rotation part for clarity, I am using a quaternion
rotate_camera (); 
// r, g, b and a are GLFloat values
glClearColor (r,g,b,a); 
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); 
glDisable (GL_LIGHTING);
int i;
// nbds is the number of chemical bonds 
GLfloat * lineVertices;
// This is "roughly" what I do to draw chemical bonds, to give you an idea
for (i=0; i<nbds;i++)
{
   // get_bonds (i) gives backs a 6 float array
   lineVertices = get_bonds(i);
   glPushMatrix(); 
   glLineWidth (1.0); 
   glEnableClientState (GL_VERTEX_ARRAY); 
   glVertexPointer (3, GL_FLOAT, 0, lineVertices); 
   glDrawArrays (GL_LINES, 0, 2); 
   glDisableClientState (GL_VERTEX_ARRAY); 
   glPopMatrix();
}
glEnable (GL_LIGHTING);

[/编辑]

感谢您的建议,"ApiTrace" 的想法很棒,我不仅发现了一个很棒的工具,而且还帮助我获得了有关我的问题的一些线索。 使用 ApiTrace:

  1. 我检查了我的程序的 (a) 和 (b) 版本都使用了完全相同的 OpenGL 上下文......非常详细和轻松我必须添加......因此错误不是来自上下文初始化。
  2. 我发现在版本 (b) 中,渲染比在版本 (a) 中完成了 5 次...意味着同一帧渲染了 5 次!

我想要得出的唯一合乎逻辑的结论是版本 2 和版本 3 之间 GTK+ 信号的差异,在我程序的版本 (a) 中我使用 expose-event 而在版本 (b) 中我使用draw 事件(GtkDrawingArea 的新信号)...很明显,此时版本 2 和 3 之间的 GTK+ 库的行为存在一些差异...我正在寻找一种方法围绕它...我将编辑此答案以提供更多信息。

[编辑]世界,您好, 回答我自己的问题,希望能帮助别人避免我犯的同样错误。 要重新绘制我的 OpenGL window,我使用的是:

void update (GtkWidget * plot)
{
  gtk_widget_hide (plot);
  gtw_widget_show (plot);
}

相反,我应该使用:

gtk_widget_queue_draw (plot);

所有问题都解决了![/EDIT]