PyOpenGL 无法渲染任何 vao

PyOpenGL cannot render any vao

我花了将近 2-3 个小时来弄清楚为什么我没有渲染矩形。我正在使用 pygame 制作 window,并使用 opengl 渲染到 window。

应该发生的是带有蓝色矩形的红色背景,但我看到的只是空的红色背景。

这是我在下面使用的代码。

我上传到着色器的东西错了吗?还是我错过了什么。

import pygame
from pygame.locals import *
from OpenGL.GL import * 
from OpenGL.GLU import * 
import numpy as np
print("import sucessfull")

vertex = """
#version 460 core
layout (location=0) in vec3 position;

out vec4 fColor;

void main(){
    fColor = vec4(0,1,0,1);
    gl_Position = vec4(position, 1.0);
}
"""
fragment = """
#version 460 core
in vec4 fColor;
out vec4 color;
void main(){
    color = fColor;
    //gl_FragColor = fColor;
}
"""

def main():
    clock = pygame.time.Clock()
    pygame.init()
    display  = (800, 600)
    pygame.display.set_mode(display, DOUBLEBUF | OPENGL)
    gluPerspective(45, (display[0]/display[1]), 0.1, 1000)
    glClearColor(1, 0,0,1)
    glTranslatef(0,0,-5)

    #############################3
    vertexID = glCreateShader(GL_VERTEX_SHADER)
    glShaderSource(vertexID, vertex)
    fragmentID = glCreateShader(GL_FRAGMENT_SHADER)
    glShaderSource(fragmentID, fragment)
    glCompileShader(vertexID)
    glCompileShader(fragmentID)
    program = glCreateProgram()
    glAttachShader(program, vertexID)
    glAttachShader(program, fragmentID)
    glLinkProgram(program)

    positions = [
        0.5, -0.5, 0.0,
        -0.5, 0.5, 0.0,
        0.5, 0.5, 0.0,
        -0.5, -0.5, 0.0
    ]
    indexes = [
        2,1,0,
        0,1,3
    ]
    vao = glGenVertexArrays(1)
    glBindVertexArray(vao)
    vbo = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glBufferData(GL_ARRAY_BUFFER, np.array(positions, dtype=np.float32), GL_STATIC_DRAW)

    ebo = glGenBuffers(1)
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, np.array(indexes, dtype=np.float32), GL_STATIC_DRAW)

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, 0)
    glEnableVertexAttribArray(0)
    ################################

    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                quit()
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
        #render here
        glUseProgram(program)
        glBindVertexArray(vao)
        glEnableVertexAttribArray(0)
        glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)
        glDisableVertexAttribArray(0)
        glBindVertexArray(0)
        glUseProgram(0)
        #***********
        pygame.display.flip()
        clock.tick(40)

main()

索引的类型必须是整数,并且对应于绘图调用中指定的类型 (GL_UNSIGNED_INT)。您必须创建一个类型为 uint32 而不是 float32:

的 NumPy 数组

glBufferData(GL_ELEMENT_ARRAY_BUFFER, np.array(indexes, dtype=np.float32), GL_STATIC_DRAW)

glBufferData(GL_ELEMENT_ARRAY_BUFFER, np.array(indexes, dtype=np.uint32), GL_STATIC_DRAW)

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

因此,如果偏移量为 0,则第 6 个参数可以是 Nonec_void_p(0),否则偏移量必须为 c_void_p(0):

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, 0)

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, None)

glDrawElements 也有类似的问题。最后一个参数被视为字节偏移量:

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)

glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, None)

gluPerspectiveglTranslatef 设置已弃用的固定函数管道矩阵。当您使用“现代”着色器程序时,此说明没有任何意义。删除此说明。使用现代 OpenGL,您必须使用 Uniform 变量。