我试图了解Python OpenGL正在做什么和Qt使用。实际问题采用粗体。如果对于正确的SO格式有太多问题,请提前道歉,但它们都是相关的,我猜测知道答案的人可能知道答案。
我在PyQt4上使用Python 2.7,在Win7 x64上使用Python OpenGL模块。
GL.glGetString('GL.GL_VERSION')
返回'3.3.0 - Build 8.15.10.2725'
所以这告诉我我正在使用现代版的OpenGL,根据我的理解,我不再使用固定管道,用户需要提供着色器。
Python模块提供的OpenGL版本是否被视为合理的现代版本?
PyQt4.QtOpenGL是否提供自己的实现,还是依赖于Python OpenGL模块?
如何检查PyQt4.QtOpenGL提供的OpenGL版本,如果它实际上是一个单独的安装?
但是,如果我不使用GL.glUseProgram(...)
功能,我仍然可以在屏幕上呈现一些基本着色以响应光线的东西。所以这意味着有一些默认着色器。我不确定这是否是OpenGL的一部分,或者只是Python模块中包含的内容。
glUseProgram(...)
,则使用它,或者这是兼容模式提供的固定管道着色器? 另一方面,我可以安装自己的着色器,因此这与更高版本的OpenGL一致。
此外,Python Qt4 OpenGL示例广泛使用glBegin()
和glEnd()
,glVertex
,旋转矩阵等,告诉我这是使用传统的OpenGL。
GL_ARB_compatibility
?或者这可能来自PyQt4.QtOpenGL子模块? 另外,在C ++中查看Qt5.5 OpenGL示例时,没有调用glBegin()
,并且示例中包含一些着色器。我猜这是纯粹的现代OpenGL,没有传统的东西。
对于OpenGL的所有Qt支持我也有点不知所措,我希望能够关注网络上的非Qt示例,并尝试使用OpenGL提供的结构如果可能的话,而不是QT课程。
例如(从HeNe网站http://nehe.gamedev.net/tutorial/blending/16001/复制):
#include <gl\gl.h> // Header File For The OpenGL32 Library
#include <gl\glu.h> // Header File For The GLu32 Library
#include <gl\glaux.h> // Header File For The GLaux Library
...
GLfloat xrot; // X Rotation
GLfloat yrot; // Y Rotation
GLfloat xspeed; // X Rotation Speed
GLfloat yspeed; // Y Rotation Speed
GLfloat z=-5.0f; // Depth Into The Screen
GLfloat LightAmbient[]= { 0.5f, 0.5f, 0.5f, 1.0f }; // Ambient Light Values
GLfloat LightDiffuse[]= { 1.0f, 1.0f, 1.0f, 1.0f }; // Diffuse Light Values
GLfloat LightPosition[]= { 0.0f, 0.0f, 2.0f, 1.0f }; // Light Position
GLuint filter; // Which Filter To Use
GLuint texture[3]; // Storage for 3 textures
QMatrix4x4
等? 非常感谢
答案 0 :(得分:2)
TL; DR:使用Qt使用原始OpenGL所需的一切都记录在案here。您将以相同的方式访问任何其他函数集,但您不会使用QOpenGLFunctions
,因为它们适用于OpenGL ES 2.0,但其他一些类派生自QAbstractOpenGLFunctions
。
您可以选择阅读并考虑使用更高级别的界面。如果您想使用它们,它们就在那里,但是再次 - 无论您是否愿意,它都是您的选择。只要平台的实现支持您需要的功能(即提供您请求的接口版本),Qt就可以方便地为您提供完整的,功能分辨的OpenGL API。
是。但它不是Python模块提供的版本,它是底层平台提供的版本。当平台不支持特定功能时,您将获得异常。 Python只是为你做了函数地址解析,它本身并没有实现任何OpenGL - 它只提供了一个很好的方式来使用你的平台从Python提供的东西(对比C)。
它直接使用底层的OpenGL实现 - 调用Python没有任何意义,因为Python的OpenGL模块除了在C和Python之间进行转换之外什么都不做。
这不是一个单独的安装。 Python和Qt都使用相同的平台实现,并将调用相同的库。
您的代码必须以您在QOpenGLContext
上设置的格式请求特定版本,然后在create()
成功后,您可以检查是否有该版本或更低版本。在所有情况下,都是提供版本的上下文format
。
这些功能本身可以通过QAbstractOpenGLFunctions
界面获得,这是原始的。
Qt提供了有用的便利类,可以在C数据结构之上添加可用的接口 - 没有任何不纯的东西,你也不会被迫使用它们。实际上,它们不是通过基本的OpenGL接口提供的。获得上下文后,可以通过versionFunctions
使用其功能。为了方便起见,一旦您将上下文设置为当前,就私下继承QOpenGLFunctions_maj_min
,然后initializeOpenGLFunctions()
。有关使用示例,请参阅QOpenGLFunctions
的文档。