2017-02-19 146 views
1

我想在我的Mac上運行PyOpenGL上的glGenVertexArrays(10.11.5)。它沒有找到它。glGenVertexArrays Mac OSX PyOpenGL

這個問題似乎是我的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,或here似乎沒有問題在運行glGenVertexArrays。 This guy似乎碰到我一樣的問題,但解決方案建議他(添加GLUT_PROFILE_3_2_CORE是不是在我PyOpenGL定義)

我在做什麼錯?

編輯:

我試過pyglet和PyQt5(下python3運行),它總是歸結爲缺少glGenVertexArrays。

看來(很多關於這方面的錯誤信息),我需要做的是設置核心配置文件。我怎麼做?如果我放棄Python的要求會更容易嗎?考慮到我不是笨蛋,而且在發佈之前我已經對我的問題進行了大量排除。

我:

enter image description here

我在裸機上運行,​​而不是虛擬化,無VM,沒有搬運工。

的glxinfo的輸出是:

name of display: /private/tmp/com.apple.launchd.RUemSPHKIt/org.macosforge.xquartz:0 
display: /private/tmp/com.apple.launchd.RUemSPHKIt/org.macosforge.xquartz:0 screen: 0 
direct rendering: Yes 
server glx vendor string: SGI 
server glx version string: 1.4 
server glx extensions: 
    GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_visual_info, 
    GLX_EXT_visual_rating, GLX_OML_swap_method, GLX_SGIS_multisample, 
    GLX_SGIX_fbconfig 
client glx vendor string: Mesa Project and SGI 
client glx version string: 1.4 
client glx extensions: 
    GLX_ARB_create_context, GLX_ARB_create_context_profile, 
    GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float, 
    GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample, 
    GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile, 
    GLX_EXT_create_context_es_profile, GLX_EXT_fbconfig_packed_float, 
    GLX_EXT_framebuffer_sRGB, GLX_EXT_import_context, 
    GLX_EXT_texture_from_pixmap, GLX_EXT_visual_info, GLX_EXT_visual_rating, 
    GLX_INTEL_swap_event, GLX_MESA_copy_sub_buffer, 
    GLX_MESA_multithread_makecurrent, GLX_MESA_query_renderer, 
    GLX_MESA_swap_control, GLX_OML_swap_method, GLX_OML_sync_control, 
    GLX_SGIS_multisample, GLX_SGIX_fbconfig, GLX_SGIX_pbuffer, 
    GLX_SGIX_visual_select_group, GLX_SGI_make_current_read, 
    GLX_SGI_swap_control, GLX_SGI_video_sync 
GLX version: 1.4 
GLX extensions: 
    GLX_ARB_get_proc_address, GLX_ARB_multisample, GLX_EXT_import_context, 
    GLX_EXT_visual_info, GLX_EXT_visual_rating, 
    GLX_MESA_multithread_makecurrent, GLX_OML_swap_method, 
    GLX_SGIS_multisample, GLX_SGIX_fbconfig 
OpenGL vendor string: NVIDIA Corporation 
OpenGL renderer string: NVIDIA GeForce GT 750M OpenGL Engine 
OpenGL version string: 2.1 NVIDIA-10.10.10 310.42.25f01 
OpenGL shading language version string: 1.20 
OpenGL extensions: 
    GL_APPLE_aux_depth_stencil, GL_APPLE_client_storage, 
    GL_APPLE_element_array, GL_APPLE_fence, GL_APPLE_float_pixels, 
    GL_APPLE_flush_buffer_range, GL_APPLE_flush_render, 
    GL_APPLE_object_purgeable, GL_APPLE_packed_pixels, GL_APPLE_pixel_buffer, 
    GL_APPLE_rgb_422, GL_APPLE_row_bytes, GL_APPLE_specular_vector, 
    GL_APPLE_texture_range, GL_APPLE_transform_hint, 
    GL_APPLE_vertex_array_object, GL_APPLE_vertex_array_range, 
    GL_APPLE_vertex_point_size, GL_APPLE_vertex_program_evaluators, 
    GL_APPLE_ycbcr_422, GL_ARB_color_buffer_float, GL_ARB_depth_buffer_float, 
    GL_ARB_depth_clamp, GL_ARB_depth_texture, GL_ARB_draw_buffers, 
    GL_ARB_draw_elements_base_vertex, GL_ARB_draw_instanced, 
    GL_ARB_fragment_program, GL_ARB_fragment_program_shadow, 
    GL_ARB_fragment_shader, GL_ARB_framebuffer_object, 
    GL_ARB_framebuffer_sRGB, GL_ARB_half_float_pixel, 
    GL_ARB_half_float_vertex, GL_ARB_imaging, GL_ARB_instanced_arrays, 
    GL_ARB_multisample, GL_ARB_multitexture, GL_ARB_occlusion_query, 
    GL_ARB_pixel_buffer_object, GL_ARB_point_parameters, GL_ARB_point_sprite, 
    GL_ARB_provoking_vertex, GL_ARB_seamless_cube_map, GL_ARB_shader_objects, 
    GL_ARB_shader_texture_lod, GL_ARB_shading_language_100, GL_ARB_shadow, 
    GL_ARB_sync, GL_ARB_texture_border_clamp, GL_ARB_texture_compression, 
    GL_ARB_texture_compression_rgtc, GL_ARB_texture_cube_map, 
    GL_ARB_texture_env_add, GL_ARB_texture_env_combine, 
    GL_ARB_texture_env_crossbar, GL_ARB_texture_env_dot3, 
    GL_ARB_texture_float, GL_ARB_texture_mirrored_repeat, 
    GL_ARB_texture_non_power_of_two, GL_ARB_texture_rectangle, 
    GL_ARB_texture_rg, GL_ARB_transpose_matrix, GL_ARB_vertex_array_bgra, 
    GL_ARB_vertex_blend, GL_ARB_vertex_buffer_object, GL_ARB_vertex_program, 
    GL_ARB_vertex_shader, GL_ARB_window_pos, GL_ATI_separate_stencil, 
    GL_ATI_texture_env_combine3, GL_ATI_texture_float, 
    GL_ATI_texture_mirror_once, GL_EXT_abgr, GL_EXT_bgra, 
    GL_EXT_bindable_uniform, GL_EXT_blend_color, 
    GL_EXT_blend_equation_separate, GL_EXT_blend_func_separate, 
    GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_clip_volume_hint, 
    GL_EXT_debug_label, GL_EXT_debug_marker, GL_EXT_depth_bounds_test, 
    GL_EXT_draw_buffers2, GL_EXT_draw_range_elements, GL_EXT_fog_coord, 
    GL_EXT_framebuffer_blit, GL_EXT_framebuffer_multisample, 
    GL_EXT_framebuffer_multisample_blit_scaled, GL_EXT_framebuffer_object, 
    GL_EXT_framebuffer_sRGB, GL_EXT_geometry_shader4, 
    GL_EXT_gpu_program_parameters, GL_EXT_gpu_shader4, 
    GL_EXT_multi_draw_arrays, GL_EXT_packed_depth_stencil, 
    GL_EXT_packed_float, GL_EXT_provoking_vertex, GL_EXT_rescale_normal, 
    GL_EXT_secondary_color, GL_EXT_separate_specular_color, 
    GL_EXT_shadow_funcs, GL_EXT_stencil_two_side, GL_EXT_stencil_wrap, 
    GL_EXT_texture_array, GL_EXT_texture_compression_dxt1, 
    GL_EXT_texture_compression_s3tc, GL_EXT_texture_env_add, 
    GL_EXT_texture_filter_anisotropic, GL_EXT_texture_integer, 
    GL_EXT_texture_lod_bias, GL_EXT_texture_mirror_clamp, 
    GL_EXT_texture_rectangle, GL_EXT_texture_sRGB, GL_EXT_texture_sRGB_decode, 
    GL_EXT_texture_shared_exponent, GL_EXT_timer_query, 
    GL_EXT_transform_feedback, GL_EXT_vertex_array_bgra, 
    GL_IBM_rasterpos_clip, GL_NV_blend_square, GL_NV_conditional_render, 
    GL_NV_depth_clamp, GL_NV_fog_distance, GL_NV_fragment_program2, 
    GL_NV_fragment_program_option, GL_NV_light_max_exponent, 
    GL_NV_multisample_filter_hint, GL_NV_point_sprite, 
    GL_NV_texgen_reflection, GL_NV_texture_barrier, 
    GL_NV_vertex_program2_option, GL_NV_vertex_program3, 
    GL_SGIS_generate_mipmap, GL_SGIS_texture_edge_clamp, GL_SGIS_texture_lod 

128 GLX Visuals 
... 

回答

2

首先,我每次使用您檢查哪個版本的OpenGL需要與問題,不運行它,一個OpenGL函數時間提示,例如,如果我們看看glGenVertexArrays我們會看到你需要Opengl> = 3.0。現在,你在做glGetString(GL_VERSION)時得到2.1版本的原因是因爲你有一張非常舊的卡片(不太可能)或者因爲你沒有啓用Opengl核心配置文件。一旦你這樣做,你應該看到正確的Opengl版本,並運行現代的Opengl功能,如你要求的功能。

在某些情況下,比如使用pyqt opengl小部件,上下文設置將在幕後完成...或者當您提到如果您使用的是過剩,那麼將會有一個功能可以這麼做。

其中一種方式是手動啓用核心配置文件,如果您是初學者使用opengl,如果您只是想使用opengl而沒有太多的hazzle,那麼可能會變得很難,我建議在pyopengl,比如pyqt,pyglet,glut,pygame ......有很多包裝器,你不會發現自己正在進行手動設置。下面你會發現它使用QGLWidget來繪圖一個簡單的例子,它帶有PyQt5(pip install PyQt5),它應該工作開箱:

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社區,它有很多很酷的功能。

+0

嘗試了您鏈接的pyglet示例:RuntimeError :(在全局變量上下文中,「Shader編譯失敗(0):錯誤:0:3:無效的存儲限定符'in'\ nERROR:0:6:使用未聲明的標識符'位置'\ n',['\ n#version 120 \ nin vec4 position; \ nvoid main()\ n {\ n gl_Position = position; \ n} \ n'],GL_VERTEX_SHADER) – carlosdc

+0

如果我停用着色器,我回到:OpenGL.error.NullFunctionError:嘗試調用未定義的函數glGenVertexArrays,檢查布爾(glGenVertexArrays)之前致電 – carlosdc

+0

@carlosdc編輯答案 – BPL