【问题标题】:PyOpenGL OpenGL Version on MacOsMacOs 上的 PyOpenGL OpenGL 版本
【发布时间】:2019-03-25 16:38:27
【问题描述】:

有人告诉我将遗留配置文件从其他 stackoverflow 帖子切换到核心配置文件,但我似乎找不到这样做的方法。所以我发布了一个更新的错误帖子来帮助我找出方法。

代码:

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


def main():
    if not glfw.init():
        return

    window = glfw.create_window(800,600,"My OpenGL Window", None, None)

    if not window:
        glfw.terminate()
        return

    glfw.make_context_current(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 460
    in vec3 position;

    void main()
    {
        gl_Position = position;
    }

    """

    fragment_shader = """
    #version 460
    void main()
    {
        gl_FragColor = vec4(1.0f,0.0f,0.0f,1.0f);
    }
    """

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

    VBO = glGenBuffers(1)
    glBindBuffer(GL_ARRAY_BUFFER, VBO)
    glBufferData(GL_ARRAY_BUFFER, 36, triangle, GL_STATIC_DRAW)

    position = glGetAttribLocation(shader, "position")
    glVertexAttribPoint(position, 3, GL_FLOAT, GL_FALSE, 0, None)
    glEnableVertexAttribArray(position)

    glUseProgram(shader)



    glClearColor(0.2, 0.3, 0.2, 1.0)
    while not glfw.window_should_close(window):
        glfw.poll_events()

        glClear(GL_COLOR_BUFFER_BIT)

        glDrawArrays(GL_TRIANGLES, 0, 3)

        glfw.swap_buffers(window)

    glfw.terminate()

if __name__ == "__main__":
    main()

我不断收到此错误

Traceback(最近一次调用最后一次):

File "/Users/Datboi/Desktop/Python/Opengl/main.py", line 71, in <module>
    main()
File "/Users/Datboi/Desktop/Python/Opengl/main.py", line 43, in main
    shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER),
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/OpenGL/GL/shaders.py", line 226, in compileShader
    shaderType,
RuntimeError: ('Shader compile failure (0): b"ERROR: 0:2: \'\' :  version \'460\' is not supported\\n"', [b'\n    #version 460\n    in vec3 position;\n    \n    void main()\n    {\n        gl_Position = position;\n    }\n\n    '], GL_VERTEX_SHADER)

我似乎找不到任何东西来解决这个问题。我是 OpenGL/PyOpenGL 的新手,找不到任何提出大致相同问题的帖子

【问题讨论】:

    标签: python opengl glsl shader pyopengl


    【解决方案1】:

    错误:0:2:\'\':不支持版本 \'460\'

    是因为您在创建窗口之前没有指定 OpenGL 版本。由于您的系统仅支持 OpenGL 版本 4.1,因此您必须添加以下代码行。另见OpenGL Development on OS X

    glfw.window_hint(glfw.CONTEXT_VERSION_MAJOR, 4)
    glfw.window_hint(glfw.CONTEXT_VERSION_MINOR, 1)
    glfw.window_hint(glfw.OPENGL_FORWARD_COMPAT, GL_TRUE)
    glfw.window_hint(glfw.OPENGL_PROFILE, glfw.OPENGL_CORE_PROFILE)
    window = glfw.create_window(800,600,"My OpenGL Window", None, None)
    

    如果你解决了这个问题,那么你将面临下一个问题:

    虽然gl_PositionHomogeneous coordinates,但顶点着色器输入变量position 的类型是vec3

    gl_Position = position 的赋值导致 ERROR:

    分配不兼容的类型

    您可以通过更改顶点着色器来解决此问题。要么改变分配

    #version 410 core
    in vec3 position;
    
    void main()
    {
        gl_Position = vec4(position, 1.0);
    }
    

    改变输入变量的类型:

    #version 410 core
    in vec4 position;
    
    void main()
    {
        gl_Position = position;
    }
    

    由于 gl_FragColor 在核心版本 4.60 中已弃用,因此您必须声明片段着色器输出变量,而不是使用已弃用的内置输出变量 gl_FragColor

     #version 410 core
    
     out vec4 frag_color; 
    
     void main()
     {
        frag_color = vec4(1.0f,0.0f,0.0f,1.0f);
     }
    

    此外,您的程序中存在拼写错误。它必须是 glVertexAttribPointer 而不是 glVertexAttribPoint

    注意,在核心配置文件OpenGL Context 中,您必须使用Vertex Array Object,因为默认顶点数组对象0 在核心配置文件中无效。

    好的,我现在收到此错误

    kages/OpenGL/GL/shaders.py",第 108 行,在 check_validate glGetProgramInfoLog(self) 中,RuntimeError: Validation failure (0): b'Validation Failed: No vertex array object bound.\n'

    在 OpenGL 上下文变为当前后创建和绑定顶点数组对象:

    glfw.make_context_current(window)
    
    VAO = glGenVertexArrays(1)
    glBindVertexArray(VAO)
    
    shader = OpenGL.GL.shaders.compileProgram(OpenGL.GL.shaders.compileShader(vertex_shader, GL_VERTEX_SHADER),
                                              OpenGL.GL.shaders.compileShader(fragment_shader,GL_FRAGMENT_SHADER))
    

    【讨论】:

    • 据我所知,在 MacOS 上没有比 OpenGL 4.1 更新的版本了。并且可能永远不会因为 OpenGL 本身在该操作系统上被弃用。
    • 那我该怎么办?
    • @AhmedMerabet 为什么你不能使用 OpenGL 4.1?
    • 因为我不知道如何使用 opengl 4.1 我是新手
    • @AhmedMerabet 解决此类问题的方法是询问有关堆栈溢出的问题。我在这里认识更多的人,他们是这类问题的专家。重要的是标记问题opengl。请参阅OpenGL top users
    猜你喜欢
    • 1970-01-01
    • 2021-03-19
    • 2021-05-31
    • 2020-12-17
    • 2018-03-26
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多