Версия OpenGL PyOpenGL для MacOs - PullRequest
0 голосов
/ 21 октября 2018

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

1 Ответ

0 голосов
/ 21 октября 2018

ОШИБКА: 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 , вы должны использовать Vertex ArrayОбъект , потому что объект массива вершин по умолчанию 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))
...