PyOpenGL 3.1.0 с Pygame - PullRequest
       43

PyOpenGL 3.1.0 с Pygame

0 голосов
/ 21 января 2019

Я изучаю библиотеку OpenGL с Python, поэтому я использую PyOpenGL 3.1.0 с Python 3.6.4 (и pygame 1.9.4 для управления окнами)

Я посмотрел несколько видео, чтобы узнать, как визуализировать базовые треугольники с помощью VBO и VAO, и поэтому написал следующий код, но я не понимаю, почему мой код не отображает простой прямоугольник из массива вершин ...

Я думаю, что что-то упустил из-за атрибутов массива в vbo, но я не уверен ... Кто-нибудь?

import pygame,numpy
from OpenGL.GL import *
from OpenGL.GLU import *


display = (800,600)

#pygame

pygame.init()
pygame.display.set_mode(display,pygame.DOUBLEBUF|pygame.OPENGL)

#opengl
"""
glMatrixMode(GL_PROJECTION)
gluPerspective(45, (display[0]/display[1]), 0.1, 4000)"""

vertices = [-0.5,0.5,0,
            -0.5,-0.5,0,
            0.5,-0.5,0,

            0.5,-0.5,0,
            0.5,0.5,0,
            -0.5,0.5,0]

vertices = numpy.array(vertices,dtype=numpy.float32)


vao = GLuint()
glGenVertexArrays(1,vao)
glBindVertexArray(vao)

vbo = GLuint()
glGenBuffers(1,vbo)
glBindBuffer(GL_ARRAY_BUFFER,vbo)

glBufferData(GL_ARRAY_BUFFER,len(vertices)*4,vertices,GL_STATIC_DRAW)
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0)

glBindBuffer(GL_ARRAY_BUFFER,0)
glBindVertexArray(0)

a=1

while a:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:
            a = 0

    glClearColor(0, 0, 1, 0)
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT )

    glBindVertexArray(vao)
    glEnableVertexAttribArray(0)
    glDrawArrays(GL_TRIANGLES,0,len(vertices)//3)
    glDisableVertexAttribArray(0)
    glBindVertexArray(0)

    pygame.display.flip()
    pygame.time.wait(10)

pygame.quit()

1 Ответ

0 голосов
/ 21 января 2019

Проблема в том, чтобы позвонить на glVertexAttribPointer.

Если указанный буферный объект массива связан, то последний параметр (шестой параметр) обрабатывается как смещение байта в хранилище данных буферного объекта.Тип данных параметра должен быть ctypes.c_void_p.

Это означает, что вы должны использовать ctypes.cast:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, ctypes.cast(0, ctypes.c_void_p))

или None:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)

В те дни, которые обычно используются* шейдерная программа .
Если вы не используете шейдерную программу , вам нужно использовать фиксированные атрибуты функций (glEnableClientState, glVertexPointer ...).
Единственным исключением является атрибут вершины 0. Установка атрибута вершины 0 полностью эквивалентна установке массива координат вершины с фиксированной функцией (glVertexPointer).
См. Также Каково расположение атрибутов для конвейера с фиксированными функциями в профиле ядра OpenGL 4.0 ++? .

...