我想在计算机屏幕上打印出一个三角形。我正在使用
PyGame
库用于窗口,OpenGL
库用于渲染屏幕。
我有这个代码:
from OpenGL.GL import *
import pygame as pg
from pygame.locals import *
import numpy as np
import ctypes
from OpenGL.GL.shaders import compileProgram,compileShader
class Shape:
def __init__(self,vertices:tuple,counter:int):
self.shapeid:int = len(vertices)/6
self.vertices = np.array(vertices,dtype=np.float32)
self.vao = glGenVertexArrays(counter)
glBindVertexArray(self.vao)
self.vbo = glGenBuffers(counter)
glBindBuffer(GL_ARRAY_BUFFER,self.vbo)
glBufferData(GL_ARRAY_BUFFER,self.vertices.nbytes,self.vertices,GL_STATIC_DRAW)
glEnableVertexAttribArray(0)
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,24,ctypes.c_void_p(0))
glEnableVertexAttribArray(1)
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,24,ctypes.c_void_p(12))
class Window:
shapes:list[Shape] = []
def __init__(self,width:int,height:int):
display = (width,height)
pg.display.set_mode(display,DOUBLEBUF|OPENGL)
glClearColor(1.0,0.0,0.0,1)
self.shader = self.createShader("Shaders/vertex.txt","Shaders/fragment.txt")
glUseProgram(self.shader)
def loop(self):
while True:
for event in pg.event.get():
if event.type==pg.QUIT:
pg.quit()
quit()
glUseProgram(self.shader)
for i in self.shapes:
glBindVertexArray(i.vao)
glDrawArrays(GL_LINES,0,3)
def createShader(self,vertexShederFileName:str,fragmentShederFileName:str):
with open(vertexShederFileName,'r') as v:
vertex_src = v.readlines()
with open(fragmentShederFileName,'r') as f:
fragment_src = f.readlines()
shader = compileProgram(compileShader(vertex_src,GL_VERTEX_SHADER),compileShader(fragment_src,GL_FRAGMENT_SHADER))
return shader
def addShape(self,shape:Shape):
self.shapes = self.shapes + [shape]
pg.init()
win = Window(720,360)
triangle = (0.0,0.0,0.0,1.0,1.0,1.0,
1.0,0.0,0.0,1.0,1.0,1.0,
0.0,1.0,0.0,1.0,1.0,1.0
)
shape2 = Shape(triangle,1)
win.addShape(shape2)
win.loop()
着色器可以从我的上一个问题的答案中获得:
https://stackoverflow.com/a/77428974/22864242
那么让我们来分析一下代码:
在
Shape
类中,我只创建 VertexBufferObject 和 VertexArrayBufferObject,然后绑定它们。
在
Window
类中,显示是从 PyGame
库初始化的,然后我们初始化用于渲染窗口的着色器,预期屏幕会打印出三角形。
让我们仔细看看三角形:它由 18 个点组成,这是正确的,因为步长 = 6 且 18/6 = 3。三角形的颜色应该是白色,因为我将最后 3 个浮点数设置为
(1.0,1.0,1.0)
这是 (255,255,255)
的 RGB 值。所以我不明白为什么它不应该打印出白色三角形。
我做错了什么?
GL_LINE_LOOP
代替 GL_LINES
。pygame.dispaly.flip()
while True:
for event in pg.event.get():
if event.type==pg.QUIT:
pg.quit()
quit()
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
glUseProgram(self.shader)
for i in self.shapes:
glBindVertexArray(i.vao)
glDrawArrays(GL_LINES,0,3)
pg.display.flip()