PyGame 窗口中未显示三角形

问题描述 投票:0回答:1

我想在计算机屏幕上打印出一个三角形。我正在使用

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 值。所以我不明白为什么它不应该打印出白色三角形。

我做错了什么?

python opengl graphics pygame pyopengl
1个回答
0
投票
  1. 您使用了错误的 Primitive 类型。使用
    GL_LINE_LOOP
    代替
    GL_LINES
  2. 显示需要更新
    pygame.dispaly.flip()
  3. 由于场景在每一帧中都会重新绘制,因此您还应该在绘制之前清除显示。
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()
© www.soinside.com 2019 - 2024. All rights reserved.