2016-09-14 2 views
0

Это мой исходный код https://paste.fedoraproject.org/428184/89404314/PyOpenGL проверка BOOL

ошибка я получил это:

C:\Python27>python.exe wx_gl_vbo_001.py 
Traceback (most recent call last): 
    File "wx_gl_vbo_001.py", line 63, in <module> 
    MyApp(redirect = False).MainLoop() 
    File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8628, in __init__ 
    self._BootstrapApp() 
    File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8196, in _BootstrapApp 
    return _core_.PyApp__BootstrapApp(*args, **kwargs) 
    File "wx_gl_vbo_001.py", line 60, in OnInit 
    canvas = MyCanvas(frame) 
    File "wx_gl_vbo_001.py", line 16, in __init__ 
    }""", GL_VERTEX_SHADER) 
    File "C:\Python27\lib\site-packages\OpenGL\latebind.py", line 44, in __call__ 
    self._finalCall = self.finalise() 
    File "C:\Python27\lib\site-packages\OpenGL\extensions.py", line 245, in finalise 
    self.__name__, 
OpenGL.error.NullFunctionError: Attempt to call an undefined alternate function (glCompileShader, glCompileShaderARB), check for bool(glCompileShader) before calling 

реж (шейдеры) поставляются с этой функции:

'compileProgram', 'compileShader', 'found', 'fragment_shader', 'geometry_shader4', 'get_program_binary', 'glAttachShader', 'glBindAttribLocation', 'glCompileShader', 'glCreateProgram', 'glCreateShader', 
+0

Не слишком глубоко смотрели на ваш код, но вы, кажется, вызываете shaders.CompileShader вместо shaders.compileShader. Кроме того, похоже, что шейдер, который вы написали, - это шейдер версии 120, поэтому попробуйте переключить версию шейдера. Насколько мне известно, переменные типа gl_ModelViewProjectionMatrix больше не существуют в современных версиях OpenGL! – CodeSurgeon

+0

Некоторые проблемы возникают с PyPI и двоичным кодом. Я получил еще одну ошибку: попытался вызвать неопределенную функцию glutInit, проверить для bool (glutInit) перед вызовом –

ответ

1

К сожалению для получения к тебе так поздно. Вот демоверсия, которая отображает треугольник с opengl с помощью инструментария wxpython (который я никогда не пробовал раньше). В дополнение к тому, что я заметил в комментариях, я увидел, что вы не используете все содержимое вашего массива vbo и что некоторые из вещей в вашем коде, такие как «self.haveInited», не нужны. Вот пример, который отображает треугольник vbo с использованием OpenGL 2.1.

import wx 
from wx import glcanvas 
import sys 
from OpenGL.GL import * 
from OpenGL.arrays import vbo 
from OpenGL.GL import shaders 
import numpy as np 

class MyCanvas(glcanvas.GLCanvas): 
    def __init__(self, parent): 
     glcanvas.GLCanvas.__init__(self, parent, -1) 
     self.context = glcanvas.GLContext(self) 
     self.Bind(wx.EVT_PAINT, self.OnPaint) 

    def OnPaint(self, event): 
     dc = wx.PaintDC(self) 
     self.SetCurrent(self.context) 
     self.InitGL() 
     self.OnDraw() 

    def InitGL(self): 
     glClearColor(0, 0, 0, 1) 
     VERTEX_SHADER = shaders.compileShader(""" 
     #version 120 
     void main() 
     { 
      gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 
     } 
     """, GL_VERTEX_SHADER) 
     FRAGMENT_SHADER = shaders.compileShader(""" 
     #version 120 
     void main() 
     { 
      gl_FragColor = vec4(0, 1, 0, 1); 
     } 
     """, GL_FRAGMENT_SHADER) 
     self.shader = shaders.compileProgram(VERTEX_SHADER,FRAGMENT_SHADER) 
     self.vbo = vbo.VBO(np.array([ 
      [ 0, 1, 0 ], 
      [ -1,-1, 0 ], 
      [ 1,-1, 0 ], 
     ],'f')) 


    def OnDraw(self): 
     self.OnSize() 
     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) 
     shaders.glUseProgram(self.shader) 
     self.vbo.bind() 
     glEnableClientState(GL_VERTEX_ARRAY) 
     glVertexPointerf(self.vbo) 
     glDrawArrays(GL_TRIANGLES, 0, 9) 
     self.vbo.unbind() 
     glDisableClientState(GL_VERTEX_ARRAY) 
     shaders.glUseProgram(0) 
     self.SwapBuffers() 

    def OnSize(self): 
     size = self.size = self.GetClientSize() 
     glViewport(0, 0, size.width, size.height) 

class MyApp(wx.App): 
    def __init__(self): 
     wx.App.__init__(self) 

    def OnInit(self): 
     frame = wx.Frame(None, title="OpenGL Test", size=(400, 300)) 
     frame.Show(True) 
     c = MyCanvas(frame) 
     return True 

app = MyApp() 
app.MainLoop() 

Надеюсь, это поможет!

+0

Да, ваш код работает хорошо и помогает мне. Мой код старый, и я не знаю, все изменения внесены при разработке модулей python, используемых в этом исходном коде. Не стесняйтесь добавлять какие-либо сведения. Спасибо. –

Смежные вопросы