셰이더와 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을 사용하고 싶습니다. 누구도 전에 일할 수 있니?