Ошибки связи QOpenGLShaderProgram в консоли с PyQt и QML - PullRequest
0 голосов
/ 09 февраля 2019

Я пытаюсь выяснить, как создать граф поверхности в QML с помощью PyQt.Однако всякий раз, когда я создаю элемент Surface3D, на консоль выводится куча ошибок программы шейдера.Я пробовал много разных вещей, чтобы избавиться от них, в том числе отключение теней и попытка создать QOpenGLShaderProgram для ссылки, но от ошибок ничего не избавилось.

Вот ошибки, которые я получаю:

QOpenGLShader::link: Varying "coords_mdl" has different type width across different shaders.

QOpenGLShaderProgram::attributeLocation(vertexPosition_mdl): shader program is not linked
QOpenGLShaderProgram::attributeLocation(vertexNormal_mdl): shader program is not linked
QOpenGLShaderProgram::attributeLocation(vertexUV): shader program is not linked
QOpenGLShaderProgram::uniformLocation(MVP): shader program is not linked
QOpenGLShaderProgram::uniformLocation(V): shader program is not linked
QOpenGLShaderProgram::uniformLocation(M): shader program is not linked
QOpenGLShaderProgram::uniformLocation(itM): shader program is not linked
QOpenGLShaderProgram::uniformLocation(depthMVP): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightPosition_wrld): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightStrength): shader program is not linked
QOpenGLShaderProgram::uniformLocation(ambientStrength): shader program is not linked
QOpenGLShaderProgram::uniformLocation(shadowQuality): shader program is not linked
QOpenGLShaderProgram::uniformLocation(color_mdl): shader program is not linked
QOpenGLShaderProgram::uniformLocation(textureSampler): shader program is not linked
QOpenGLShaderProgram::uniformLocation(shadowMap): shader program is not linked
QOpenGLShaderProgram::uniformLocation(gradMin): shader program is not linked
QOpenGLShaderProgram::uniformLocation(gradHeight): shader program is not linked
QOpenGLShaderProgram::uniformLocation(lightColor): shader program is not linked
QOpenGLShaderProgram::uniformLocation(volumeSliceIndices): shader program is not linked
QOpenGLShaderProgram::uniformLocation(colorIndex): shader program is not linked
QOpenGLShaderProgram::uniformLocation(cameraPositionRelativeToModel): shader program is not linked
QOpenGLShaderProgram::uniformLocation(color8Bit): shader program is not linked
QOpenGLShaderProgram::uniformLocation(textureDimensions): shader program is not linked
QOpenGLShaderProgram::uniformLocation(sampleCount): shader program is not linked
QOpenGLShaderProgram::uniformLocation(alphaMultiplier): shader program is not linked
QOpenGLShaderProgram::uniformLocation(preserveOpacity): shader program is not linked
QOpenGLShaderProgram::uniformLocation(minBounds): shader program is not linked
QOpenGLShaderProgram::uniformLocation(maxBounds): shader program is not linked
QOpenGLShaderProgram::uniformLocation(sliceFrameWidth): shader program is not linked

Вот пример кода, который выдает ошибки:

example.py

import sys
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtWidgets import QApplication

app = QApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.load("SurfaceGraphExample.qml")
engine.quit.connect(app.quit)
sys.exit(app.exec_())

SurfaceGraphExample.qml

import QtQuick 2.9
import QtQuick.Controls 2.2
import QtDataVisualization 1.3

ApplicationWindow {
    width: 300
    height: 300
    visible: true

    Surface3D {
        anchors.fill: parent
        shadowQuality: AbstractGraph3D.ShadowQualityNone
    }
}

Следуя этому примеру из документации Qt, я могу отобразить все данные, как и следовало ожидать, но я все еще получаю ошибки программы шейдера в консоли: https://doc.qt.io/qt-5.11/qtdatavisualization-qmlsurface-example.html

Я попытался вручную создать программу шейдера и связать ее в Python (показано следующим кодом), но все не удалось.Все операторы печати "* fail" выполняются, но журналы не печатаются (эти операторы просто печатают переводы строк).

from PyQt5.QtGui import QOpenGLShader, QOpenGLShaderProgram

shader_program = QOpenGLShaderProgram()

if not shader_program.addShaderFromSourceCode(QOpenGLShader.Vertex,
                                       "attribute highp vec4 vertex;\n"
                                       "uniform highp mat4 matrix;\n"
                                       "void main(void)\n"
                                       "{\n"
                                       "   gl_Position = matrix * vertex;\n"
                                       "}"):
                                       print("adding vertex shader failed")
                                       print(shader_program.log())

if not shader_program.addShaderFromSourceFile(QOpenGLShader.Vertex, "shader.vert"):
    print("adding vertex shader from file failed")
    print(shader_program.log())

if not shader_program.addShaderFromSourceCode(QOpenGLShader.Fragment,
                                       "void main(void)\n"
                                       "{\n"
                                       "   gl_FragColor = vec4(1.0,0.0,0.0,1.0);\n"
                                       "}"):
                                       print("adding fragment shader failed")
                                       print(shader_program.log())

shader_program.setAttributeValue("vertexUV", 1.0)

if shader_program.link():
    print("link succeeded")
else:
    print("link failed")
    print(shader_program.log())

if not shader_program.bind():
    print("bind failed")
else:
    print("bind succeeded")

Я использую 64-разрядную версию Windows 10 с Intel HD Graphics 620 (обновлен до самой последней версии драйвера).Я установил Python 3.6.1, PyQt 5.10.0 и PyQtDataVisualization 5.10.0.

...