Связывание программы PyOpenGL не работает, информационный журнал пуст - PullRequest
0 голосов
/ 04 мая 2020

Я написал класс шейдеров в PyOpenGL, и он, кажется, работает нормально до той части, где вам нужно связать программу. У меня ошибка при использовании glGetProgramiv, и она возвращает ошибку компоновки.

Для отладки я попытался получить информационный журнал, используя glGetProgramInfoLog, но он выдает пустую строку, и я не знаю, в чем проблема.

Вот мой код:

import OpenGL
from OpenGL.GL import *

class shader:

    def __init__(self, vertexShaderPath, fragmentShaderPath):

        with open(vertexShaderPath, 'r') as file:
            self.vertexShaderData = file.read()

        with open(fragmentShaderPath, 'r') as file:
            self.fragmentShaderData = file.read()

    def compile(self):

        vertexShader = glCreateShader(GL_VERTEX_SHADER)
        glShaderSource(vertexShader, self.vertexShaderData)
        glCompileShader(vertexShader)

        success = glGetShaderiv(vertexShader, GL_COMPILE_STATUS)
        if not success:
            infoLog = glGetShaderInfoLog(vertexShader)
            print('Error: Vertex shader compilation failed\n', infoLog)

        fragmentShader = glCreateShader(GL_FRAGMENT_SHADER)
        glShaderSource(fragmentShader, self.fragmentShaderData)
        glCompileShader(fragmentShader)

        success = glGetShaderiv(fragmentShader, GL_COMPILE_STATUS)
        if not success:
            infoLog = glGetShaderInfoLog(fragmentShader)
            print('Error: Fragment shader compilation failed\n', infoLog)

        self.program = glCreateProgram(1)

        glAttachShader(self.program, vertexShader)
        glAttachShader(self.program, fragmentShader)
        glLinkProgram(self.program)

        success = glGetProgramiv(self.program, GL_LINK_STATUS)
        print(success)

        if not success:
            infoLog = glGetProgramInfoLog(self.program)
            print('Error: Shader program linking failed\n', infoLog)

        glDeleteShader(vertexShader)
        glDeleteShader(fragmentShader)

    def use(self):
        glUseProgram(self.program)

Вот вершинные и фрагментные шейдеры, с которыми я тестирую:

#version 450 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;

out vec3 ourColor;

void main() {

    gl_Position = vec4(aPos, 1.0);
    ourColor = aColor;

}
#version 450 core

out vec4 FragColor;
in vec3 ourColor;

void main() {

    FragColor = vec4(ourColor, 1.0);

}

Компиляция вершинного и фрагментного шейдеров, кажется, работает нормально, и, когда дело доходит до компоновки программы, она возвращает сообщение об ошибке, которое я написал в операторе print. Я также проверил это без всего класса вещей, и он отлично работает.

Должен ли я просто объединить __init__() и compile() в одну функцию?

Я также очень заинтригован, почему Информационный журнал из программы полностью пуст. Спасибо!

1 Ответ

0 голосов
/ 04 мая 2020

Хорошо, это довольно неловко.

Причина, по которой я ничего не получил, состояла в том, что я не проверял класс правильно: я просто создал объект класса без контекста или чего-то еще в файл классов. Не удивительно, что ничего не сработало. Я протестировал его в совершенно новом сценарии с контекстом, окном и всем остальным, и он работал нормально.

Извините, что потратил ваше время из-за моей глупости!

...