Advertisement
trishLEX

Untitled

May 26th, 2017
322
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.38 KB | None | 0 0
  1. import glfw
  2. from OpenGL.GL import *
  3.  
  4. global rotate_x
  5. rotate_x = 0
  6. global rotate_y
  7. rotate_y = 0
  8. def keyCallback(window, key, scancode, action, mods):
  9.     global rotate_x
  10.     global rotate_y
  11.  
  12.     if key == glfw.KEY_UP and action:
  13.         rotate_x += 10.0
  14.     elif key == glfw.KEY_DOWN and action:
  15.         rotate_x -= 10.0
  16.     elif key == glfw.KEY_LEFT and action:
  17.         rotate_y += 10.0
  18.     elif key == glfw.KEY_RIGHT and action:
  19.         rotate_y -= 10.0
  20.  
  21. def create_shader(shader_type, source):
  22.     shader = glCreateShader(shader_type)
  23.     glShaderSource(shader, source)
  24.     glCompileShader(shader)
  25.     compilestatus = glGetShaderiv(shader, GL_COMPILE_STATUS)
  26.     if compilestatus != GL_TRUE:
  27.         raise RuntimeError(glGetShaderInfoLog(shader)
  28.                            .decode('ASCII'))
  29.     return shader
  30.  
  31. def shader():
  32.     vertex = create_shader(GL_VERTEX_SHADER, """
  33.    varying vec4 vertex_color;
  34.        void main(){
  35.            gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  36.            vertex_color = gl_Color;
  37.        }""")
  38.  
  39.     # фрагментный шейдер
  40.     fragment = create_shader(GL_FRAGMENT_SHADER, """
  41.    varying vec4 vertex_color;
  42.        void main() {
  43.            gl_FragColor = vertex_color;
  44.        }""")
  45.     program = glCreateProgram()
  46.  
  47.     glAttachShader(program, vertex)
  48.     glAttachShader(program, fragment)
  49.  
  50.     glBindFragDataLocation(program, 0, "outColor")
  51.     glLinkProgram(program)
  52.  
  53.  
  54.  
  55.     glUseProgram(program) ###должно идти перед draw elements
  56. # Определяем массив вершин (три вершины по три координаты)
  57. #pointdata = [[0, 0.5, 0], [-0.5, -0.5, 0], [0.5, -0.5, 0]]
  58. pointdata = [[- 0.5, - 0.5, - 0.5], [0.5, - 0.5, - 0.5], [0.5, 0.5, - 0.5], [- 0.5, 0.5, - 0.5],
  59.              [- 0.5, - 0.5, 0.5], [0.5, - 0.5, 0.5], [0.5, 0.5, 0.5], [- 0.5, 0.5, 0.5],
  60.              [0.5, - 0.5, - 0.5], [0.5, - 0.5, 0.5], [0.5, 0.5, 0.5], [0.5, 0.5, - 0.5],
  61.              [- 0.5, - 0.5, - 0.5], [- 0.5, - 0.5, 0.5], [- 0.5, 0.5, 0.5], [- 0.5, 0.5, - 0.5],
  62.              [- 0.5, 0.5, - 0.5], [0.5, 0.5, - 0.5], [0.5, 0.5, 0.5], [- 0.5, 0.5, 0.5],
  63.              [- 0.5, - 0.5, - 0.5], [0.5, - 0.5, - 0.5], [0.5, - 0.5, 0.5], [- 0.5, - 0.5, 0.5]]
  64. # Определяем массив цветов (по одному цвету для каждой вершины)
  65. #pointcolor = [[1, 1, 0], [0, 1, 1], [1, 0, 1]]
  66. pointcolor = [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1],
  67.               [1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0],
  68.               [0, 1, 0], [0, 1, 0], [0, 1, 0], [0, 1, 0],
  69.               [0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1],
  70.               [1, 1, 0], [1, 1, 0], [1, 1, 0], [1, 1, 0],
  71.               [1, 0, 1], [1, 0, 1], [1, 0, 1], [1, 0, 1]]
  72.  
  73. def background():
  74.     glClearColor(0.8, 0.8, 0.8, 1.0)
  75.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
  76.     glEnable(GL_DEPTH_TEST)
  77.     #shader()
  78.  
  79. def draw():
  80.     glLoadIdentity()
  81.     glMatrixMode(GL_MODELVIEW)
  82.  
  83.     global rotate_x
  84.     global rotate_y
  85.  
  86.     glRotatef(rotate_x, 1, 0, 0)
  87.     glRotatef(rotate_y, 0, 1, 0)
  88.  
  89.     glEnableClientState(GL_VERTEX_ARRAY)            # Включаем использование массива вершин
  90.     glEnableClientState(GL_COLOR_ARRAY)             # Включаем использование массива цветов
  91.     glVertexPointer(3, GL_FLOAT, 0, pointdata)
  92.     glColorPointer(3, GL_FLOAT, 0, pointcolor)
  93.  
  94.     glDrawArrays(GL_QUADS, 0, 24)
  95.     glDisableClientState(GL_VERTEX_ARRAY)           # Отключаем использование массива вершин
  96.     glDisableClientState(GL_COLOR_ARRAY)            # Отключаем использование массива цветов
  97.  
  98.  
  99. class Drawer:
  100.     window = False
  101.  
  102.     def __init__(self):
  103.         if not glfw.init():
  104.             return
  105.  
  106.         self.window = glfw.create_window(800, 800, "OpenGL", None, None)
  107.  
  108.         glfw.set_key_callback(self.window, keyCallback)
  109.  
  110.         if not self.window:
  111.             glfw.terminate()
  112.             return
  113.  
  114.         glfw.make_context_current(self.window)
  115.         shader()
  116.  
  117.     def startLoop(self):
  118.         while not glfw.window_should_close(self.window):
  119.             background()
  120.             draw()
  121.  
  122.             glfw.swap_buffers(self.window)
  123.             glfw.poll_events()
  124.  
  125.         glfw.terminate()
  126.  
  127. drawer = Drawer()
  128. drawer.startLoop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement