首页 > 解决方案 > pyopengl黑屏不绘图

问题描述

似乎不能画一个三角形

import pygame
from pygame.locals import *
import numpy as np
from OpenGL.GL import *

pygame.init()
display = (600,600)
clock = pygame.time.Clock()
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
positions = [
    -0.5, -0.5,
    0,     0.5,
    0.5, -0.5
]
positions = np.array(positions, dtype=np.float32)
buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, buffer)
glBufferData(GL_ARRAY_BUFFER, positions.size, positions, GL_STATIC_DRAW)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, 0) 
run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
            pygame.quit()
    if not run:
        break

    glDrawArrays(GL_TRIANGLES, 0, 3)

    pygame.display.flip()

这是python问题还是我写错了?

标签: pythonopenglpygamepyopengl

解决方案


的第二个参数glBufferData是以字节为单位的缓冲区大小:

glBufferData(GL_ARRAY_BUFFER, positions.size, positions, GL_STATIC_DRAW)

glBufferData(GL_ARRAY_BUFFER, positions.size*4, positions, GL_STATIC_DRAW)

参数大小可以省略:

glBufferData(GL_ARRAY_BUFFER, positions, GL_STATIC_DRAW)

如果绑定了命名缓冲区对象,则第 6 个参数glVertexAttribPointer被视为缓冲区对象数据存储中的字节偏移量。但是参数的类型无论如何都是指针(c_void_p)。因此,如果偏移量为 0,则第 6 个参数可以是Nonec_void_p(0)否则偏移量必须为c_void_p(0)

glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, 0)

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

完整示例:

import pygame
from pygame.locals import *
import numpy as np
from OpenGL.GL import *

pygame.init()
display = (600,600)
clock = pygame.time.Clock()
pygame.display.set_mode(display, DOUBLEBUF|OPENGL)
positions = [
    -0.5, -0.5,
    0,     0.5,
    0.5, -0.5
]
positions = np.array(positions, dtype=np.float32)

buffer = glGenBuffers(1)
glBindBuffer(GL_ARRAY_BUFFER, buffer)
glBufferData(GL_ARRAY_BUFFER, positions, GL_STATIC_DRAW)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 8, None) 

run = True
while run:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False

    glClear(GL_COLOR_BUFFER_BIT)
    glDrawArrays(GL_TRIANGLES, 0, 3)
    pygame.display.flip()

pygame.quit()

推荐阅读