2016-09-27 1 views
1

셰이더와 Vertex Array Objects 및 Vertex Buffer Objects와 같은 최신 OpenGL 기능을 사용하여 간단한 삼각형을 그리기 위해 this tutorial을 따라 왔습니다. 튜토리얼 코드는 C++이지만, OpenGL은 사용하는 바인딩과 동일하므로 파이썬으로 쉽게 옮겨 놓을 수 있다고 생각했습니다. . 내가 코드를 실행하면이 C++ Modern OpenGL 튜토리얼을 기반으로 한 wxPython 컨텍스트에서 PyOpenGL을 사용하려면 어떻게해야합니까?

import wx 
from wx import glcanvas 
from OpenGL.GL import * 
from OpenGL.GLU import * 
from OpenGL.GLUT import * 
from OpenGL.GL.ARB.shader_objects import * 
from OpenGL.GL.ARB.fragment_shader import * 
from OpenGL.GL.ARB.vertex_shader import * 
import numpy as np 

vertexSource = """ 
#version 130 
in vec2 position; 
void main() 
{ 
    gl_Position = vec4(position, 0.0, 1.0); 
} 
""" 
fragmentSource = """ 
#version 130 
out vec4 outColor; 
void main() 
{ 
    outColor = vec4(1.0, 1.0, 1.0, 1.0); 
} 
""" 

class OpenGLCanvas(glcanvas.GLCanvas): 
    def __init__(self, parent): 
     glcanvas.GLCanvas.__init__(self, parent, -1, size=(640, 480)) 
     self.init = False 
     self.context = glcanvas.GLContext(self) 

    self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) 
    self.Bind(wx.EVT_PAINT, self.OnPaint) 

def OnEraseBackground(self, event): 
    pass # Do nothing, to avoid flashing on MSW. 

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

def InitGL(self): 

    # Vertex Input 
    ## Vertex Array Objects 
    vao = glGenVertexArrays(1) 
    glBindVertexArray(vao) 

    ## Vertex Buffer Object 
    vbo = glGenBuffers(1) # Generate 1 buffer 

    vertices = np.array([0.0, 0.5, 0.5, -0.5, -0.5, -0.5], dtype=np.float32) 

    ## Upload data to GPU 
    glBindBuffer(GL_ARRAY_BUFFER, vbo) 
    glBufferData(GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL_STATIC_DRAW) 

    # Compile shaders and combining them into a program 
    ## Create and compile the vertex shader 
    vertexShader = glCreateShader(GL_VERTEX_SHADER) 
    glShaderSource(vertexShader, vertexSource) 
    glCompileShader(vertexShader) 

    ## Create and compile the fragment shader 
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER) 
    glShaderSource(fragmentShader, fragmentSource) 
    glCompileShader(fragmentShader) 

    ## Link the vertex and fragment shader into a shader program 
    shaderProgram = glCreateProgram() 
    glAttachShader(shaderProgram, vertexShader) 
    glAttachShader(shaderProgram, fragmentShader) 
    glBindFragDataLocation(shaderProgram, 0, "outColor") 
    glLinkProgram(shaderProgram) 
    glUseProgram(shaderProgram) 

    # Making the link between vertex data and attributes 
    posAttrib = glGetAttribLocation(shaderProgram, "position") 
    glEnableVertexAttribArray(posAttrib) 
    glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, 0) 

def OnDraw(self): 
    # Set clear color 
    glClearColor(0.0, 0.0, 0.0, 1.0) 
#Clear the screen to black 
    glClear(GL_COLOR_BUFFER_BIT) 

    # draw six faces of a cube 
    glDrawArrays(GL_TRIANGLES, 0, 3) 

    self.SwapBuffers() 

class Frame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self, None, title="Hello World", size=(640,480)) 
     canvas = OpenGLCanvas(self) 

app = wx.App() 
frame = Frame() 
frame.Show() 
app.MainLoop() 

이 더 파이썬 오류 또는 OpenGL을 오류가없는, 그리고 : 가장 큰 차이점은 내가에서 그릴 창을 만들 수 wxPython에 glCanvas 컨텍스트를 사용하고있다 이것은 내가 지금까지 무엇을 가지고 셰이더가 올바르게 컴파일 된 것처럼 보입니다. 그러나 삼각형이없는 검정색 창이 그려집니다. 이것은 wxPython의 glcanvas.GLContext에 문제가 있다고 생각하지 않습니다. GELontext는 deprecated glBegin() 및 glEnd() 명령을 사용하기 전에 삼각형을 그리는 데 성공 적으로 사용했습니다.

덧붙여 말하자면, 완벽하게 작동하는 someone has converted the same tutorial to use Python and a pyglet context이지만, 내 GUI 용 wxPython을 사용하고 싶습니다. 누구도 전에 일할 수 있니?

답변

0

이 문제가 계속 발생하는 경우 다음 줄과 PyOpenGL의 작동 방식에 문제가 있다고 생각합니다. 이 문제를 수정하면 작업 데모가 생겼습니다.

glVertexAttribPointer(posAttrib, 2, GL_FLOAT, GL_FALSE, 0, None) 

분명히 0! = 바인딩에 없음!

관련 문제