OpenGL 教程的 Python 端口未绘制任何内容

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

我终于尝试学习“现代”OpenGL,并且我已经阅读了here的教程,但我正在使用 Python 工作。

在我自己尝试绘制三角形失败(没有渲染任何内容)后,我决定直接将练习 1的 C++ 解决方案移植到 Python。

这就是结果,它与 C++ 代码几乎是 1:1,afaict,除了为了简洁起见,我删除了着色器编译/链接错误检查(

验证程序正在编译和链接时没有错误):

from platform import system import numpy as np import glfw from OpenGL.GL import * SCR_WIDTH = 800 SCR_HEIGHT = 600 vertex_shader_source = """ #version 330 core layout (location = 0) in vec3 aPos; void main() { gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0); } """ fragment_shader_source = """ #version 330 core out vec4 FragColor; void main() { FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); } """ def main (): # glfw: initialize and configure # ------------------------------ glfw.init() glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 3) glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 3) glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE) if system() == "Darwin": glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE) # glfw window creation # -------------------- window = glfw.create_window(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL", None, None) glfw.make_context_current(window) glfw.set_window_size_callback(window, framebuffer_size_callback) # build and compile our shader program # ------------------------------------ # vertex shader vertex_shader = glCreateShader(GL_VERTEX_SHADER) glShaderSource(vertex_shader, vertex_shader_source) glCompileShader(vertex_shader) # fragment shader fragment_shader = glCreateShader(GL_FRAGMENT_SHADER) glShaderSource(fragment_shader, fragment_shader_source) glCompileShader(fragment_shader) # link shaders shader_program = glCreateProgram() glAttachShader(shader_program, vertex_shader) glAttachShader(shader_program, fragment_shader) glLinkProgram(shader_program) glDeleteShader(vertex_shader) glDeleteShader(fragment_shader) # set up vertex data (and buffer(s)) and configure vertex attributes # ------------------------------------------------------------------ vertices = np.array([ # first triangle -0.9, -0.5, 0.0, # left -0.0, -0.5, 0.0, # right -0.45, 0.5, 0.0, # top # second triangle 0.0, -0.5, 0.0, # left 0.9, -0.5, 0.0, # right 0.45, 0.5, 0.0 # top ], np.float32) vao = glGenVertexArrays(1) vbo = glGenBuffers(1) # bind the Vertex Array Object first, then bind and set vertex buffer(s), and then configure vertex attributes(s). glBindVertexArray(vao) glBindBuffer(GL_ARRAY_BUFFER, vbo) glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW) glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, 0) glEnableVertexAttribArray(0) glBindBuffer(GL_ARRAY_BUFFER, 0) glBindVertexArray(0) # render loop # ----------- while not glfw.window_should_close(window): # render # ------ glClearColor(0.2, 0.3, 0.3, 1.0) glClear(GL_COLOR_BUFFER_BIT) # draw our first triangle glUseProgram(shader_program) glBindVertexArray(vao) glDrawArrays(GL_TRIANGLES, 0, 6) # glfw: swap buffers and poll IO events (keys pressed/released, mouse moved etc.) # ------------------------------------------------------------------------------- glfw.swap_buffers(window) glfw.poll_events() # optional: de-allocate all resources once they've outlived their purpose: # ------------------------------------------------------------------------ glDeleteVertexArrays(1, [vao]) glDeleteBuffers(1, [vbo]) glDeleteProgram(shader_program) # glfw: terminate, clearing all previously allocated GLFW resources. # ------------------------------------------------------------------ glfw.terminate() def framebuffer_size_callback (window, width, height): glViewport(0, 0, width, height) if __name__ == "__main__": main()
不幸的是,它仍然没有渲染任何东西:

我不明白为什么,也不知道该尝试什么。一切似乎都与示例解决方案相匹配。

所以我在让我的着色器实验渲染任何东西方面都是 0 换 2。我在这里缺少什么?

我使用的是 Windows 10,使用 Nvidia Quadro RTX 4000。Python 3.11.1、PyOpenGL 3.1.6。

python opengl glsl
1个回答
0
投票
啊,我明白了。手动尝试了各种小改动后,我发现是这一行:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, 0)
应该是:

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, None)
也就是说,最后一个参数应该是

None

,而不是
0

© www.soinside.com 2019 - 2024. All rights reserved.