核心剖面图OpenGL没有绘制任何内容

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

我最近开始接触OpenGL,并使用PyOpenGL和固定函数管道(我知道,我知道)来绘制立方体之类的东西。

总之,每个人都告诉我固定函数很可怕,而且已经被废弃了,所以我现在才开始接触core-profile OpenGL。我一直在关注 本教程我想用C++语言编写的Python代码,只要把所有的东西都转化成Python就可以了,库也基本相同。

我想用 VBOs 和 VAOs 渲染一个单一的 2D 三角形,代码运行了,但实际上什么也没画。

这里是(请记住,我完全是个新手,所以我可能在某个地方弄乱了一个基本的函数调用,而且我真的不知道所有东西是如何工作的)。

import numpy as np
import glfw
from OpenGL.GL import *

def main():

    glfw.init()
    glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 4)
    glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 5)
    glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)

    window = glfw.create_window(800, 600, "helo wold", None, None)

    glfw.make_context_current(window)


    vertices = np.array([-0.5, -0.5, 0, 0.5, -0.5, 0, 0, 0.5, 0], dtype = 'float32')

    vertexShaderSource = '''#version 450 core
    layout (location = 0) in vec3 aPos;
    void main() {
        gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
    }
    '''

    vertexShader = glCreateShader(GL_VERTEX_SHADER)
    glShaderSource(vertexShader, vertexShaderSource)
    glCompileShader(vertexShader)

    fragmentShaderSource = '''#version 450 core
    out vec4 FragColor;
    void main() {
        FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
    }
    '''

    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
    glShaderSource(fragmentShader, fragmentShaderSource)
    glCompileShader(fragmentShader)

    shaderProgram = glCreateProgram(1)
    glAttachShader(shaderProgram, vertexShader)
    glAttachShader(shaderProgram, fragmentShader)
    glLinkProgram(shaderProgram)

    glDeleteShader(vertexShader)
    glDeleteShader(fragmentShader)

    vbo, vao = glGenBuffers(1), glGenVertexArrays(1)

    glBindVertexArray(vao)
    glBindBuffer(GL_ARRAY_BUFFER, vbo)
    glBufferData(GL_ARRAY_BUFFER, len(vertices), vertices, GL_STATIC_DRAW)

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

    glBindBuffer(GL_ARRAY_BUFFER, 0)
    glBindVertexArray(0)

    while not glfw.window_should_close(window):

        glClearColor(0.2, 0.3, 0.3, 1.0)
        glClear(GL_COLOR_BUFFER_BIT)

        glUseProgram(shaderProgram)
        glBindVertexArray(vao)
        glDrawArrays(GL_TRIANGLES, 0, 3)

        glfw.swap_buffers(window)
        glfw.poll_events()

    glfw.terminate()

if __name__ == '__main__':
    main()

它能很好地打开窗口,并且有我给它的背景颜色, 但它没有以任何方式绘制三角形。

如果有人能告诉我我做错了什么,我会很高兴,谢谢!

python opengl vbo pyopengl
1个回答
1
投票

第二个参数 glBufferData 必须是以字节为单位的大小。len(vertices)*4 而非 len(vertices):

glBufferData(GL_ARRAY_BUFFER, len(vertices)*4, vertices, GL_STATIC_DRAW)

由于PyOpenGL的 glBufferData 负载过重的情况下 大小 参数可以省略(如果数据是一个 ctypes 阵列或 numpy.array):

glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW)

最后一个参数 glVertexAttribPointer 属于 const GLvoid *. 因此,它必须是 Nonectypes.c_void_p(0) 而不是0。

Either

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

import ctypes
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 12, ctypes.c_void_p(0))

此外,我建议评估着色器是否编译成功 (glGetShaderiv):

vertexShader = glCreateShader(GL_VERTEX_SHADER)
glShaderSource(vertexShader, vertexShaderSource)
glCompileShader(vertexShader)
if not glGetShaderiv(vertexShader, GL_COMPILE_STATUS ):
    print('vertex shader compile error:')
    print(glGetShaderInfoLog(vertexShader))
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
glShaderSource(fragmentShader, fragmentShaderSource)
glCompileShader(fragmentShader)
if not glGetShaderiv(fragmentShader, GL_COMPILE_STATUS):
    print('fragment shader compile error:')
    print(glGetShaderInfoLog(fragmentShader))

程式已成功链接glGetProgramiv):

glLinkProgram(shaderProgram)
if not glGetProgramiv(shaderProgram, GL_LINK_STATUS):
    print('link error:')
    print(glGetProgramInfoLog(shaderProgram))
© www.soinside.com 2019 - 2024. All rights reserved.