如何解决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 个参数可以是 None
或 c_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)
gluPerspective
和 glTranslatef
设置不推荐使用的固定函数管道矩阵。当您使用“现代”着色器程序时,此说明没有任何意义。删除此说明。使用现代 OpenGL,您必须使用 Uniform 变量。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。