python - 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问题还是我写错了?
解决方案
的第二个参数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 个参数可以是None
,c_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()
推荐阅读
- pycharm - 如何获取有关 PyCharm 中代码错误的更多信息?
- r - 如何降低用于运行 R ShinyApp 的 ECS Fargate 的成本
- c++ - 我可以在自己的结构中使用向量排序函数吗?总是编译器错误
- node.js - 使用 ng 创建新的 Angular 项目时出错
- sql - 获取group by platform和semver的两条最新记录
- javascript - Typescript 属性装饰器 - 需要帮助来了解以下情况是如何发生的?
- python - 熊猫重复缺失值的行
- c# - SSL .Net,但仅用于登录会话
- javascript - 无法让 jquery show() 显示元素
- javascript - 类型错误“x”不是带有 Javascript 的量角器上的函数