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

1

Мне сказали переключить устаревший профиль на основной профиль из других сообщений 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 и не мог найти сообщений, которые задавали примерно тот же вопрос

Теги:
opengl
pyopengl
glsl

1 ответ

1
Лучший ответ

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

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

ok im получить эту ошибку сейчас

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))
  • 0
    Насколько я знаю, на MacOS никогда не было ничего более свежего, чем OpenGL 4.1. И, вероятно, никогда не будет, поскольку сам OpenGL считается устаревшим в этой ОС.
  • 0
    Так что я могу сделать?
Показать ещё 9 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню