使用Python OpenGL绘制多个对象并找到好的方法

2024-09-30 22:19:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是OpenGL新手,并将其与python一起用于一个项目。我试图画多个东西只是创建一个缓冲区。我只是想知道这是否是一个好的方法,如果不是,我错过了什么。另外,我想知道多个缓冲区是否有用。此外,我在这段代码中没有看到glEnable(GL_MULTISAMPLE)的任何效果,这是为了改善视觉效果。当我试图关闭窗口时,程序显示有点滞后

我只是介绍这两个函数,而不是整个代码,只是为了保持简单。initialize()函数创建着色器程序并绑定缓冲区。在render()函数中,将执行实际的绘图操作。顶点数组包含圆的坐标,三角形数组包含三角形的坐标。我正在做三次抽签手术

VERTEX_SHADER = """
#version 330
    layout (location = 0) in vec4 position;
    uniform vec4 MVP;

    
    void main() {
    gl_Position = position;
    

}

"""

FRAGMENT_SHADER = """
#version 330
    out vec4 FragColor;
    uniform vec4 ourColor;
    
    
    void main() {

    FragColor = ourColor;

    }

"""

#global varialbles
shaderProgram = None
VBO = None
triangles = []
vertices = []

def initialize():
    global VERTEXT_SHADER
    global FRAGMENT_SHADER
    global shaderProgram
    global triangles
    global vertices 

    #compiling shaders
    vertexshader = shaders.compileShader(VERTEX_SHADER, GL_VERTEX_SHADER)
    fragmentshader = shaders.compileShader(FRAGMENT_SHADER, GL_FRAGMENT_SHADER)

    #creating shaderProgram
    shaderProgram = shaders.compileProgram(vertexshader, fragmentshader)

    a = 5 
    vertices = []

    for t in np.arange(-4,4,0.01):
        x = a*math.cos(t)
        y = a*math.sin(t)
        
        vertices.append(x)
        vertices.append(y)
        vertices.append(0.0)
 
    vertices = np.array(vertices, dtype=np.float32)
    vertices = vertices/10   
   
    triangles = [-0.5, -0.5, 0.0,
                 0.5, -0.5, 0.0,
                 0.0, 0.5, 0.0]


    triangles = np.array(triangles, dtype=np.float32)

    
    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)


def render(window):
    global shaderProgram
    global triangles
    global vertices 

    #accessing ourColor variable from shaderProgram
    vertexColorLoc = glGetUniformLocation(shaderProgram, "ourColor")

    #####draw figures in screen####
    glClearColor(0, 0, 0, 1)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    glEnable(GL_MULTISAMPLE);
    glUseProgram(shaderProgram)


    #draw 1 - circle with fill color
    glBufferData(GL_ARRAY_BUFFER, vertices.nbytes, vertices, GL_STATIC_DRAW)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, None)
    glEnableVertexAttribArray(0)
    glUniform4f(vertexColorLoc, 100/255.0, 28/255.0, 20/255.0, 1);
    glDrawArrays(GL_TRIANGLE_FAN, 0, 800)

    #draw 2 - circle border
    glUniform4f(vertexColorLoc, 1, 0, 0, 1);
    glLineWidth(3)
    glDrawArrays(GL_LINES, 0, 800)



    #draw 3 - triangle from different vertex array 
    glBufferData(GL_ARRAY_BUFFER, triangles.nbytes, triangles, GL_STATIC_DRAW)
    glEnableVertexAttribArray(0)
    glUniform4f(vertexColorLoc, 1, 1, 0, 1);
    glDrawArrays(GL_TRIANGLES, 0, 3)
       
    glUseProgram(0)   

    glfw.swap_buffers(window)

enter image description here


Tags: buffernpglobal缓冲区drawglverticesshader