2017-02-19 4 views
1

Я пытаюсь запустить glGenVertexArrays на PyOpenGL на своем Mac (10.11.5). Это не находит.glGenVertexArrays Mac OSX PyOpenGL

Проблема, по-видимому, в версии OpenGL, поддерживаемой моим Mac (?). Я попытался исследовать проблему, но, похоже, документация написана как для ботаников истории, так и для баффов, которые я не являюсь ни тем, ни другим.

Когда я пытаюсь сделать это:

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)

Что я делаю неправильно?

EDIT:

Я попытался pyglet и PyQt5 (работают под Python3), и он всегда сводится к отсутствующему glGenVertexArrays.

Кажется (много дезинформации в Интернете об этом), что мне нужно сделать, это настроить профиль ядра. Как мне это сделать? Если я откажусь от требования Python, было бы проще? Подумайте, что я не chump и что я устранил свою проблему значительно, прежде чем публиковать ее здесь.

у меня есть:

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. Теперь причина, по которой вы получаете версию 2.1 при выполнении glGetString (GL_VERSION), либо потому, что у вас действительно старая карта (маловероятная), либо потому, что вы не включили основной профиль Opengl. Как только вы это сделаете, вы должны увидеть правильную версию Opengl и запустить современные функции Opengl, такие как тот, который вы просите.

В некоторых случаях, например, с использованием виджетов pyqt opengl, настройка контекста будет выполняться за занавесками для вас ... Или, как вы говорите, если вы используете перегиб, это будет особенность.

Один из способов обеспечить ручную работу основного профиля, который может быть чистым, если вы новичок с opengl, если вы просто хотите использовать opengl без лишнего шума, я бы рекомендовал использовать что-то поверх 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

Пробужденный пример пигге: RuntimeError: («Ошибка компиляции шейдера (0): ОШИБКА: 0: 3: Недопустимые квалификаторы хранилища« в »в контексте глобальной переменной \ 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, проверить для bool (glGenVertexArrays) перед вызовом – carlosdc

+0

@carlosdc Отредактировав ответ – BPL