Vertglas OpenGLarax公司

2024-10-01 02:27:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在我的Mac(10.11.5)上的PyOpenGL上运行glgenvertexarray。它找不到它。在

问题似乎出在我的Mac(?)支持的OpenGL版本上。我曾试图研究这个问题,但似乎文档是为历史书呆子或琐事爱好者编写的,我都不是。在

当我尝试这样做时:

print("OpenGL: " + str(glGetString(GL_VERSION)))
print('glGenVertexArrays Available %s' % bool(glGenVertexArrays))
vao = glGenVertexArrays(1)

我明白了:

OpenGL: 2.1 NVIDIA-10.10.10 310.42.25f01

glGenVertexArrays Available False

Traceback (most recent call last): File "_ctypes/callbacks.c", line 315, in 'calling callback function' File "draw.py", line 99, in doRedraw mesh.draw() File "/Users/carlos/vc/SimpleRender/Mesh.py", line 170, in draw vao = glGenVertexArrays(1) File "/Users/carlos/.virtualenvs/janus/lib/python2.7/site-packages/OpenGL/platform/baseplatform.py", line 407, in call self.name, self.name, OpenGL.error.NullFunctionError: Attempt to call an undefined function glGenVertexArrays, check for bool(glGenVertexArrays) before calling

所有在线的人都看到here,或者{a2}似乎运行glgenvertexarray没有问题。This guy似乎遇到了我同样的问题,但是向他建议的解决方案(添加GLUT_PROFILE_3_2_内核在我的PyOpenGL中没有定义)

我做错什么了?在

编辑:

我试过pyglet和PyQt5(在python3下运行),结果总是因为缺少了Glgenvertexarays。在

似乎(网上有很多关于这方面的错误信息)我需要做的是建立核心配置文件。我该怎么做?如果我放弃Python需求,会不会更简单?考虑到我不是傻瓜,我已经解决了我的问题之前,张贴在这里。在

我有:

enter image description here

我在裸机上运行,不是虚拟化,没有虚拟机,没有docker。在

glxinfo的输出为:

^{pr2}$

Tags: inpymaclinecallfileopenglavailable
1条回答
网友
1楼 · 发布于 2024-10-01 02:27:31

首先,我建议您每次使用Opengl函数时,检查需要哪个Opengl版本才能正常运行它,例如,如果我们看一下glGenVertexArrays,我们会发现您需要Opengl>;=3.0。现在,在使用glGetString(GL_version)时获得2.1版本的原因可能是因为您有一个非常旧的卡(不太可能),或者因为您没有启用Opengl核心配置文件。一旦你这样做,你应该看到正确的Opengl版本和运行的现代Opengl函数,如你所要求的。在

在某些情况下,比如使用pyqt opengl小部件,上下文设置将在幕后为您完成。。。或者,正如您所说,如果您使用的是glut,则会有一个特性来实现这一点。在

一种方法是手动启用核心配置文件,如果你是opengl的初学者,这可能会很整洁,如果你只是想使用opengl而没有太多的混乱,我建议在pyopengl上使用一些东西,比如pyqt、pyglet、glut、pygame。。。有大量的包装,你不会发现自己在做手动设置。下面是一个简单的例子,它使用了PyQt5(pip install PyQt5)附带的QGlWidget,它应该可以开箱即用:

import textwrap
import sys
import time
import ctypes
from array import array

from PyQt5 import QtWidgets
from PyQt5.QtOpenGL import QGLWidget
from PyQt5.QtWidgets import QApplication

from OpenGL.GL import *
from OpenGL.GLU import *


class FooOpengl(QGLWidget):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        # Test to show how at this point Opengl Context setup hasn't been done
        # and therefore will crash
        print('{:*^80}'.format('Opengl Context not ready'))
        try:
            print(self._opengl_info())
        except Exception as e:
            print(e)

        self.start_time = time.clock()
        self.startTimer(0)

    def initializeGL(self):
        # Test to show how at this point Opengl Context is ready to go
        print('{:*^80}'.format('Opengl Context ready'))
        print(self._opengl_info())

        # Shaders: Trivial program
        vs_source = textwrap.dedent("""
            #version 330
            in vec3 position;
            void main()
            {
               gl_Position = vec4(position, 1.0);
            }\
        """)

        fs_source = textwrap.dedent("""
            #version 330
            void main()
            {
               gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
            }\
        """)

        vs = glCreateShader(GL_VERTEX_SHADER)
        glShaderSource(vs, vs_source)
        glCompileShader(vs)
        fs = glCreateShader(GL_FRAGMENT_SHADER)
        glShaderSource(fs, fs_source)
        glCompileShader(fs)

        self.program = glCreateProgram()
        glAttachShader(self.program, fs)
        glAttachShader(self.program, vs)
        glLinkProgram(self.program)

        vertices = [
            0.0, 0.5, 0.0,
            0.5, -0.5, 0.0,
            -0.5, -0.5, 0.0
        ]

        vbo = glGenBuffers(1)
        glBindBuffer(GL_ARRAY_BUFFER, vbo)

        self.vao = glGenVertexArrays(1)
        glBindVertexArray(self.vao)
        position = glGetAttribLocation(self.program, 'position')
        glEnableVertexAttribArray(position)
        glVertexAttribPointer(
            position, 3, GL_FLOAT, False, 0, ctypes.c_void_p(0))

        glBufferData(
            GL_ARRAY_BUFFER, array("f", vertices).tostring(), GL_STATIC_DRAW)
        glBindVertexArray(0)
        glDisableVertexAttribArray(position)
        glBindBuffer(GL_ARRAY_BUFFER, 0)

    def timerEvent(self, event):
        elapsed = time.clock() - self.start_time
        self.repaint()

    def paintGL(self):
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        glLoadIdentity()
        glUseProgram(self.program)

        glBindVertexArray(self.vao)
        glDrawArrays(GL_TRIANGLES, 0, 3)
        glBindVertexArray(0)

        glUseProgram(0)

    def _opengl_info(self):
        return textwrap.dedent("""\
            Vendor: {0}
            Renderer: {1}
            OpenGL Version: {2}
            Shader Version: {3}
            Num Extensions: {4}
            Extensions: {5}
        """).format(
            glGetString(GL_VENDOR).decode("utf-8"),
            glGetString(GL_RENDERER).decode("utf-8"),
            glGetString(GL_VERSION).decode("utf-8"),
            glGetString(GL_SHADING_LANGUAGE_VERSION).decode("utf-8"),
            glGetIntegerv(GL_NUM_EXTENSIONS),
            glGetString(GL_EXTENSIONS)
        )

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = FooOpengl()
    ex.show()

    sys.exit(app.exec_())

这只是一个简单的测试,它向您展示了上下文准备就绪和未准备就绪时会发生的情况,它还为您提供了一些有关vbo+vao+着色器用法的额外信息,它应该会给您提供类似于以下内容的内容:

enter image description here

这应该可以让你开始。。。正如我所说,opengl上有大量的包装器,如果不是pyglet,pygame是python社区中非常著名的一个,它有很多很酷的特性。在

相关问题 更多 >