【问题标题】:pyOpenGL test program: Getting the Validation Failed: No vertex array object bound messagepyOpenGL 测试程序:获取验证失败:没有顶点数组对象绑定消息
【发布时间】:2020-09-24 07:12:22
【问题描述】:

我正在使用 python、OpenGl (pyopengl) 和着色器 (MacOS) 进行试验,我收到这条奇怪的消息:OpenGL.GL.shaders.ShaderValidationError: Validation failure (0): b'Validation Failed: No vertex array object bound .\n'(在 '''OpenGL.GL.shaders.compileProgram''' 行)

我做错了什么? 这是完整的代码(由 Attila Toth 对代码稍作修改),抱歉缩进

   from OpenGL.GL import *
   import OpenGL.GL.shaders
   import glfw
   import numpy


def main():

    if not glfw.glfwInit():
        return


    glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MAJOR, 3);
    glfw.glfwWindowHint(glfw.GLFW_CONTEXT_VERSION_MINOR, 3);
    glfw.glfwWindowHint(glfw.GLFW_OPENGL_PROFILE, glfw.GLFW_OPENGL_CORE_PROFILE);
    glfw.glfwWindowHint(glfw.GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
    window = glfw.glfwCreateWindow(800, 600, "My Window", None, None)
    #print(glGetString(GL_VERSION))



    if not window:
        glfw.glfwTerminate()
        return

    glfw.glfwMakeContextCurrent(window)

    triangle = [-0.5, -0.5, 0.0,
                0.5, -0.5, 0.0,
                0.0,  0.5, 0.0
                ]

    triangle  = numpy.array(triangle, dtype=numpy.float32)

    vertex_shader = """
   #version 330
    in vec3 position;
    in vec3 color;

    out vec3 newColor;
    void main()
    {
        gl_Position = vec4(position, 1.0f);
        newColor = color;
    }
    """
    fragment_shader = """
    #version 330
    in vec3 newColor;

    out vec4 outColor;
    void main()
    {
        outColor = vec4(newColor, 1.0f);
    }
    """


    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)


    glBufferData(GL_ARRAY_BUFFER, 72, triangle, GL_STATIC_DRAW)

    shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER), OpenGL.GL.shaders.compileShader(fragment_shader, GL_FRAGMENT_SHADER))


    position = glGetAttribLocation(shader, "position")
    glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(0))
    glEnableVertexAttribArray(position)

    color = glGetAttribLocation(shader, "color")
    glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(12))
    glEnableVertexAttribArray(color)



    glUseProgram(shader)


    glClearColor(.1, .3, .5, 1.0)


    while not glfw.glfwWindowShouldClose(window):
        glfw.glfwPollEvents()

        glClear(GL_COLOR_BUFFER_BIT)
        glMultiDrawArrays(GL_TRIANGLES, 0, 3)
        glfw.glfwSwapBuffers(window)

    glfw.glfwTerminate()


if __name__ == "__main__":
    main()

【问题讨论】:

    标签: opengl glsl shader glfw pyopengl


    【解决方案1】:

    当您使用 cor 配置文件 OpenGL context (GLFW_OPENGL_CORE_PROFILE) 时,您必须为通用顶点属性数组的规范创建一个命名的 Vertex Array Object,因为默认的 VAO (0) 无效。

    例如:

    vao = glGenVertexArrays(1)
    glBindVertexArray(vao)
    
    position = glGetAttribLocation(shader, "position")
    glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(0))
    glEnableVertexAttribArray(position)
    
    color = glGetAttribLocation(shader, "color")
    glVertexAttribPointer(color, 3, GL_FLOAT, GL_FALSE, 24, ctypes.c_void_p(12))
    glEnableVertexAttribArray(color)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      相关资源
      最近更新 更多