微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PyOpenGL 无法渲染任何 vao

如何解决PyOpenGL 无法渲染任何 vao

我花了将近 2-3 个小时试图弄清楚为什么我没有得到矩形渲染。我使用 pygame 制作窗口,使用 opengl 渲染到窗口上。

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

这是我在下面使用的代码

上传东西到着色器错了吗?或者我错过了什么。

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,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,1)
    glTranslatef(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.0
    ]
    indexes = [
        2,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,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,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,None)

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

glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0)

glDrawElements(GL_TRIANGLES,None)

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。