Версия OpenGL PyOpenGL для MacOs

Мне сказали переключить устаревший профиль на основной профиль из других сообщений stackru, но я не могу найти способ сделать это. Так что я выкладываю более обновленное сообщение об ошибке, чтобы помочь мне найти выход.

КОД:

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 и не могу найти ни одной записи, которая задала бы примерно тот же вопрос

1 ответ

Решение

ОШИБКА: 0:2: \'\': версия \'460\' не поддерживается

вызвано тем, что вы не указываете версию OpenGL перед созданием окна. Поскольку ваша система поддерживает только версию 4.1 OpenGL, вы должны добавить следующие строки кода. Смотрите также Разработка OpenGL на 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_Position однородные координаты, входная переменная вершинного шейдера position имеет тип vec3,

Назначение gl_Position = position вызывает ОШИБКУ:

присвоение несовместимых типов

Вы можете решить эту проблему, изменив вершинный шейдер. Либо измените назначение

#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 необходимо использовать объект массива вершин, поскольку объект массива вершин по умолчанию 0 недопустим в профиле ядра.

хорошо, я получаю эту ошибку сейчас

kages/OpenGL/GL/shaders.py", строка 108, в check_validate glGetProgramInfoLog( self), RuntimeError: Ошибка проверки (0): b'Validation Failed: объект привязки массива вершин не связан.\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))
Другие вопросы по тегам