Я написал класс шейдеров в 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()
в одну функцию?
Я также очень заинтригован, почему Информационный журнал из программы полностью пуст. Спасибо!