我终于尝试学习“现代”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。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, 0)
应该是:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, None)
也就是说,最后一个参数应该是None
,而不是
0
。